From 2afd79c9775d0bebe33a2ca01f9766be65d122c7 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 25 Aug 2016 18:37:14 +0300 Subject: [PATCH] Fix compatibility with AS 2.2 gradle plugin #KT-13594 fixed --- .../kotlin/gradle/plugin/KotlinPlugin.kt | 12 +++-- .../android/AndroidGradleWrapper.groovy | 48 +++++++++++++++++++ ...rtifactDifferenceRegistryAndroidWrapper.kt | 22 +-------- 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 1261adcd2ce..f566f769111 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -383,10 +383,14 @@ open class KotlinAndroidPlugin( configureJavaTask(kotlinTask, javaTask, logger) createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, variantDataName) - val artifactFile = project.tryGetSingleArtifact(variantData) - val artifactDifferenceRegistryWrapper = ArtifactDifferenceRegistryAndroidWrapper(artifactDifferenceRegistry, variantData) - configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask, - artifactDifferenceRegistryWrapper, artifactFile) + + if ((kotlinAfterJavaTask ?: kotlinTask).incremental) { + val jarToAarMapping = AndroidGradleWrapper.getJarToAarMapping(variantData) + val artifactFile = project.tryGetSingleArtifact(variantData) + val artifactDifferenceRegistryWrapper = ArtifactDifferenceRegistryAndroidWrapper(artifactDifferenceRegistry, jarToAarMapping) + configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask, + artifactDifferenceRegistryWrapper, artifactFile) + } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy index 70a4fb93105..423fdc35dfe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy @@ -8,6 +8,8 @@ import com.android.build.gradle.api.BaseVariant import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.VariantManager import com.android.build.gradle.internal.variant.BaseVariantData +import com.android.builder.dependency.DependencyContainer +import com.android.builder.dependency.LibraryDependency import com.android.builder.model.SourceProvider import org.gradle.api.file.ConfigurableFileTree import org.gradle.api.internal.DefaultDomainObjectSet @@ -153,4 +155,50 @@ class AndroidGradleWrapper { return result.toList() } + + @NotNull + static def Map getJarToAarMapping(BaseVariantData variantData) { + def jarToLibraryArtifactMap = new HashMap() + + def libraries = getVariantLibraryDependencies(variantData) + if (libraries == null) return jarToLibraryArtifactMap + + for (lib in libraries) { + jarToLibraryArtifactMap[lib.jarFile] = lib.bundle + + // local dependencies are detected as changed by gradle, because they are seem to be + // rewritten every time when bundle changes + // when local dep will actually change, record for bundle will be removed from registry + for (localDep in lib.localJars) { + if (localDep instanceof File) { + // android tools 2.2 + jarToLibraryArtifactMap[localDep] = lib.bundle + } + else if (localDep.metaClass.getMetaMethod("jarFile") != null) { + // android tools < 2.2 + jarToLibraryArtifactMap[localDep.jarFile] = lib.bundle + } + } + } + + return jarToLibraryArtifactMap + } + + @Nullable + private static def Iterable getVariantLibraryDependencies(BaseVariantData variantData) { + def variantDependency = variantData.variantDependency + if (variantDependency instanceof DependencyContainer) { + // android tools < 2.2 + return variantDependency.getAndroidDependencies() + } + + def variantDependencyMeta = variantData.variantDependency.getMetaClass() + def getCompileDependencies = variantDependencyMeta.getMetaMethod("getCompileDependencies") + if (getCompileDependencies != null && getCompileDependencies.returnType.metaClass == DependencyContainer.metaClass) { + // android tools 2.2 + return variantDependency.getCompileDependencies().getAndroidDependencies() + } + + return null + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/android/ArtifactDifferenceRegistryAndroidWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/android/ArtifactDifferenceRegistryAndroidWrapper.kt index 6cadb4ea312..f015ac76e0e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/android/ArtifactDifferenceRegistryAndroidWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/android/ArtifactDifferenceRegistryAndroidWrapper.kt @@ -16,36 +16,18 @@ package org.jetbrains.kotlin.gradle.tasks.incremental.android -import com.android.build.gradle.internal.variant.BaseVariantData import org.jetbrains.kotlin.gradle.tasks.ArtifactDifference import org.jetbrains.kotlin.gradle.tasks.ArtifactDifferenceRegistry import java.io.File -import java.util.* // When lib is compiled, changes are associated with .aar files. // However when app is compiled, there is just .jar in classpath. -// This class maps jar to aar via BaseVariantData internal class ArtifactDifferenceRegistryAndroidWrapper( private val registry: ArtifactDifferenceRegistry, - variantData: BaseVariantData<*> + private val jarToAarMapping: Map ): ArtifactDifferenceRegistry by registry { - private val jarToLibraryArtifactMap: MutableMap = HashMap() - - init { - for (lib in variantData.variantDependency.libraries) { - jarToLibraryArtifactMap[lib.jarFile] = lib.bundle - - // local dependencies are detected as changed by gradle, because they are seem to be - // rewritten every time when bundle changes - // when local dep will actually change, record for bundle will be removed from registry - for (localDep in lib.localDependencies) { - jarToLibraryArtifactMap[localDep.jarFile] = lib.bundle - } - } - } - override fun get(artifact: File): Iterable? { - val mappedFile = jarToLibraryArtifactMap[artifact] ?: return null + val mappedFile = jarToAarMapping[artifact] ?: return null return registry[mappedFile] } } \ No newline at end of file