Fix for compatibility with Android Gradle plugin 2.4.0-alpha1
Deferred resolution of JAR-to-AAR mapping, since the Android Gradle plugin now resolves dependencies at execution phase. Dropped the code related to the Jack toolchain compatibility. Throwing a build error when Jack is enabled. Changed warning about Jack into a build error.
This commit is contained in:
-12
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
|||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.ObjectOutputStream
|
import java.io.ObjectOutputStream
|
||||||
import javax.xml.bind.DatatypeConverter
|
|
||||||
import javax.xml.bind.DatatypeConverter.printBase64Binary
|
import javax.xml.bind.DatatypeConverter.printBase64Binary
|
||||||
|
|
||||||
// apply plugin: 'kotlin-kapt'
|
// apply plugin: 'kotlin-kapt'
|
||||||
@@ -235,11 +234,6 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
// Add generated source dir as a source root for kotlinCompile and javaCompile
|
// Add generated source dir as a source root for kotlinCompile and javaCompile
|
||||||
kotlinCompile.source(sourcesOutputDir)
|
kotlinCompile.source(sourcesOutputDir)
|
||||||
javaCompile.source(sourcesOutputDir)
|
javaCompile.source(sourcesOutputDir)
|
||||||
variantData?.let {
|
|
||||||
if (AndroidGradleWrapper.isJackEnabled(it)) {
|
|
||||||
AndroidGradleWrapper.addSourceToJack(it, sourcesOutputDir)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val pluginOptions = kaptTask.pluginOptions
|
val pluginOptions = kaptTask.pluginOptions
|
||||||
val compilerPluginId = getCompilerPluginId()
|
val compilerPluginId = getCompilerPluginId()
|
||||||
@@ -253,12 +247,6 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
val options = javaCompile.options
|
val options = javaCompile.options
|
||||||
options.compilerArgs = options.compilerArgs.filter { !it.startsWith("-proc:") } + "-proc:none"
|
options.compilerArgs = options.compilerArgs.filter { !it.startsWith("-proc:") } + "-proc:none"
|
||||||
}
|
}
|
||||||
|
|
||||||
variantData?.let {
|
|
||||||
if (AndroidGradleWrapper.isJackEnabled(it)) {
|
|
||||||
AndroidGradleWrapper.disableJackAnnotationProcessing(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private val BaseVariantData<*>.sourceProviders: List<SourceProvider>
|
private val BaseVariantData<*>.sourceProviders: List<SourceProvider>
|
||||||
|
|||||||
+12
-46
@@ -3,8 +3,6 @@ package org.jetbrains.kotlin.gradle.plugin
|
|||||||
import com.android.build.gradle.BaseExtension
|
import com.android.build.gradle.BaseExtension
|
||||||
import com.android.build.gradle.BasePlugin
|
import com.android.build.gradle.BasePlugin
|
||||||
import com.android.build.gradle.api.AndroidSourceSet
|
import com.android.build.gradle.api.AndroidSourceSet
|
||||||
import com.android.build.gradle.internal.TaskContainerAdaptor
|
|
||||||
import com.android.build.gradle.internal.TaskManager
|
|
||||||
import com.android.build.gradle.internal.variant.BaseVariantData
|
import com.android.build.gradle.internal.variant.BaseVariantData
|
||||||
import com.android.build.gradle.internal.variant.BaseVariantOutputData
|
import com.android.build.gradle.internal.variant.BaseVariantOutputData
|
||||||
import com.android.build.gradle.internal.variant.TestVariantData
|
import com.android.build.gradle.internal.variant.TestVariantData
|
||||||
@@ -13,6 +11,7 @@ import groovy.lang.Closure
|
|||||||
import org.gradle.api.InvalidUserDataException
|
import org.gradle.api.InvalidUserDataException
|
||||||
import org.gradle.api.Plugin
|
import org.gradle.api.Plugin
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.ProjectConfigurationException
|
||||||
import org.gradle.api.artifacts.Configuration
|
import org.gradle.api.artifacts.Configuration
|
||||||
import org.gradle.api.logging.Logger
|
import org.gradle.api.logging.Logger
|
||||||
import org.gradle.api.logging.Logging
|
import org.gradle.api.logging.Logging
|
||||||
@@ -21,7 +20,6 @@ import org.gradle.api.plugins.JavaPlugin
|
|||||||
import org.gradle.api.plugins.JavaPluginConvention
|
import org.gradle.api.plugins.JavaPluginConvention
|
||||||
import org.gradle.api.tasks.Delete
|
import org.gradle.api.tasks.Delete
|
||||||
import org.gradle.api.tasks.SourceSet
|
import org.gradle.api.tasks.SourceSet
|
||||||
import org.gradle.api.tasks.bundling.Zip
|
|
||||||
import org.gradle.api.tasks.compile.AbstractCompile
|
import org.gradle.api.tasks.compile.AbstractCompile
|
||||||
import org.gradle.api.tasks.compile.JavaCompile
|
import org.gradle.api.tasks.compile.JavaCompile
|
||||||
import org.jetbrains.kotlin.com.intellij.openapi.util.io.FileUtil
|
import org.jetbrains.kotlin.com.intellij.openapi.util.io.FileUtil
|
||||||
@@ -32,9 +30,7 @@ import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin
|
|||||||
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin.Companion.getKaptClasssesDir
|
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin.Companion.getKaptClasssesDir
|
||||||
import org.jetbrains.kotlin.gradle.internal.initKapt
|
import org.jetbrains.kotlin.gradle.internal.initKapt
|
||||||
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
||||||
import org.jetbrains.kotlin.gradle.plugin.android.KotlinJillTask
|
|
||||||
import org.jetbrains.kotlin.gradle.tasks.*
|
import org.jetbrains.kotlin.gradle.tasks.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.getDeclaredFieldInHierarchy
|
|
||||||
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
||||||
import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProviderAndroidWrapper
|
import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProviderAndroidWrapper
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -373,19 +369,6 @@ internal open class KotlinAndroidPlugin(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun forceCreateJavacTask(project: Project,
|
|
||||||
androidPlugin: BasePlugin,
|
|
||||||
variantData: BaseVariantData<*>): JavaCompile? {
|
|
||||||
val taskManager = androidPlugin::class.java.getDeclaredFieldInHierarchy("taskManager")
|
|
||||||
?.let { it.isAccessible = true; it[androidPlugin] as TaskManager }
|
|
||||||
if (taskManager == null) {
|
|
||||||
log.kotlinDebug("TaskManager was not found, possibly, an incompatible Android Gradle plugin version is used.")
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
val taskContainerAdaptor = TaskContainerAdaptor(project.tasks)
|
|
||||||
return taskManager.createJavacTask(taskContainerAdaptor, variantData.scope)?.get(taskContainerAdaptor)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getTestedVariantData(variantData: BaseVariantData<*>): BaseVariantData<*>? =
|
private fun getTestedVariantData(variantData: BaseVariantData<*>): BaseVariantData<*>? =
|
||||||
((variantData as? TestVariantData)?.testedVariantData as? BaseVariantData<*>)
|
((variantData as? TestVariantData)?.testedVariantData as? BaseVariantData<*>)
|
||||||
|
|
||||||
@@ -401,6 +384,12 @@ internal open class KotlinAndroidPlugin(
|
|||||||
val subpluginEnvironment = loadSubplugins(project)
|
val subpluginEnvironment = loadSubplugins(project)
|
||||||
|
|
||||||
for (variantData in variantDataList) {
|
for (variantData in variantDataList) {
|
||||||
|
if (AndroidGradleWrapper.isJackEnabled(variantData)) {
|
||||||
|
throw ProjectConfigurationException(
|
||||||
|
"Kotlin Gradle plugin does not support the deprecated Jack toolchain.\n" +
|
||||||
|
"Disable Jack or revert to Kotlin Gradle plugin version 1.1.1.", null)
|
||||||
|
}
|
||||||
|
|
||||||
val variantDataName = variantData.name
|
val variantDataName = variantData.name
|
||||||
logger.kotlinDebug("Process variant [$variantDataName]")
|
logger.kotlinDebug("Process variant [$variantDataName]")
|
||||||
|
|
||||||
@@ -408,8 +397,7 @@ internal open class KotlinAndroidPlugin(
|
|||||||
val isAndroidTestVariant = variantDataName.endsWith("androidTest", ignoreCase = true) &&
|
val isAndroidTestVariant = variantDataName.endsWith("androidTest", ignoreCase = true) &&
|
||||||
testedVariantData != null
|
testedVariantData != null
|
||||||
|
|
||||||
val javaTask = AndroidGradleWrapper.getJavaTask(variantData) ?:
|
val javaTask = AndroidGradleWrapper.getJavaTask(variantData)
|
||||||
(if (isAndroidTestVariant) forceCreateJavacTask(project, androidPlugin, variantData) else null)
|
|
||||||
|
|
||||||
if (javaTask == null) {
|
if (javaTask == null) {
|
||||||
logger.info("KOTLIN: javaTask is missing for $variantDataName, so Kotlin files won't be compiled for it")
|
logger.info("KOTLIN: javaTask is missing for $variantDataName, so Kotlin files won't be compiled for it")
|
||||||
@@ -486,36 +474,14 @@ internal open class KotlinAndroidPlugin(
|
|||||||
createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, variantDataName)
|
createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, variantDataName)
|
||||||
|
|
||||||
if ((kotlinAfterJavaTask ?: kotlinTask).incremental) {
|
if ((kotlinAfterJavaTask ?: kotlinTask).incremental) {
|
||||||
val jarToAarMapping = AndroidGradleWrapper.getJarToAarMapping(variantData)
|
|
||||||
val artifactFile = project.tryGetSingleArtifact(variantData)
|
val artifactFile = project.tryGetSingleArtifact(variantData)
|
||||||
val artifactDifferenceRegistryProvider = ArtifactDifferenceRegistryProviderAndroidWrapper(kotlinGradleBuildServices.artifactDifferenceRegistryProvider, jarToAarMapping)
|
val artifactDifferenceRegistryProvider = ArtifactDifferenceRegistryProviderAndroidWrapper(
|
||||||
|
kotlinGradleBuildServices.artifactDifferenceRegistryProvider,
|
||||||
|
{ AndroidGradleWrapper.getJarToAarMapping(variantData) }
|
||||||
|
)
|
||||||
configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask,
|
configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask,
|
||||||
artifactDifferenceRegistryProvider, artifactFile)
|
artifactDifferenceRegistryProvider, artifactFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AndroidGradleWrapper.isJackEnabled(variantData)) {
|
|
||||||
val scope = variantData.scope
|
|
||||||
val kotlinDestinationDir = kotlinTask.destinationDir
|
|
||||||
val jarPath = File(kotlinDestinationDir.parent, kotlinDestinationDir.name + ".jar")
|
|
||||||
val zipTaskName = scope.getTaskName("zipKotlinClassesFor")
|
|
||||||
project.tasks.create(zipTaskName, Zip::class.java) { zipTask ->
|
|
||||||
zipTask.from(kotlinDestinationDir)
|
|
||||||
zipTask.destinationDir = File(jarPath.parent)
|
|
||||||
zipTask.archiveName = jarPath.name
|
|
||||||
zipTask.dependsOn(kotlinTask)
|
|
||||||
}
|
|
||||||
|
|
||||||
val kotlinJillTaskName = scope.getTaskName("transformKotlinClassesWithJillFor")
|
|
||||||
val jillOutputFilePath = File(jarPath.absolutePath + ".jill")
|
|
||||||
project.tasks.create(kotlinJillTaskName, KotlinJillTask::class.java) { jillTask ->
|
|
||||||
jillTask.buildTools = variantData.scope.globalScope.androidBuilder.targetInfo.buildTools
|
|
||||||
jillTask.inputJarFile = jarPath
|
|
||||||
jillTask.outputJillFile = jillOutputFilePath
|
|
||||||
jillTask.dependsOn(zipTaskName)
|
|
||||||
}
|
|
||||||
|
|
||||||
AndroidGradleWrapper.configureJackTask(variantData, jillOutputFilePath, kotlinJillTaskName)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-56
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.plugin.android
|
package org.jetbrains.kotlin.gradle.plugin.android
|
||||||
|
|
||||||
import com.android.build.api.transform.*
|
|
||||||
import com.android.build.gradle.BaseExtension
|
import com.android.build.gradle.BaseExtension
|
||||||
import com.android.build.gradle.BasePlugin
|
import com.android.build.gradle.BasePlugin
|
||||||
import com.android.build.gradle.api.AndroidSourceSet
|
import com.android.build.gradle.api.AndroidSourceSet
|
||||||
@@ -24,8 +23,6 @@ import com.android.build.gradle.api.ApkVariant
|
|||||||
import com.android.build.gradle.api.BaseVariant
|
import com.android.build.gradle.api.BaseVariant
|
||||||
import com.android.build.gradle.api.TestVariant
|
import com.android.build.gradle.api.TestVariant
|
||||||
import com.android.build.gradle.internal.VariantManager
|
import com.android.build.gradle.internal.VariantManager
|
||||||
import com.android.build.gradle.internal.pipeline.OriginalStream
|
|
||||||
import com.android.build.gradle.internal.pipeline.TransformTask
|
|
||||||
import com.android.build.gradle.internal.variant.BaseVariantData
|
import com.android.build.gradle.internal.variant.BaseVariantData
|
||||||
import com.android.builder.model.SourceProvider
|
import com.android.builder.model.SourceProvider
|
||||||
import org.gradle.api.file.ConfigurableFileTree
|
import org.gradle.api.file.ConfigurableFileTree
|
||||||
@@ -80,12 +77,7 @@ class AndroidGradleWrapper {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
static AbstractCompile getJavaTask(@NotNull Object variantData) {
|
static AbstractCompile getJavaTask(@NotNull Object variantData) {
|
||||||
if (isJackEnabled(variantData)) {
|
return getJavaCompile(variantData)
|
||||||
return getJavacTask(variantData)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return getJavaCompile(variantData)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -96,53 +88,6 @@ class AndroidGradleWrapper {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static TransformTask getJackTask(@NotNull Object variantData) {
|
|
||||||
def compilerTask = variantData.javaCompilerTask
|
|
||||||
if (compilerTask instanceof TransformTask) {
|
|
||||||
return compilerTask
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static getJackTransform(@NotNull Object variantData) {
|
|
||||||
return getJackTask(variantData)?.transform
|
|
||||||
}
|
|
||||||
|
|
||||||
static addSourceToJack(@NotNull Object variantData, @NotNull File sourceFolder) {
|
|
||||||
getJackTransform(variantData)?.addSource(sourceFolder)
|
|
||||||
}
|
|
||||||
|
|
||||||
static disableJackAnnotationProcessing(@NotNull Object variantData) {
|
|
||||||
def jackOptions = getJackTransform(variantData)?.options
|
|
||||||
jackOptions?.setAnnotationProcessorOutputDirectory(null)
|
|
||||||
jackOptions?.setAnnotationProcessorNames([])
|
|
||||||
jackOptions?.setAnnotationProcessorClassPath([])
|
|
||||||
jackOptions?.setAnnotationProcessorOptions([:])
|
|
||||||
}
|
|
||||||
|
|
||||||
static configureJackTask(
|
|
||||||
@NotNull Object variantData,
|
|
||||||
@NotNull File jillOutputFile,
|
|
||||||
@NotNull String kotlinJillTaskName) {
|
|
||||||
def jackTask = getJackTask(variantData)
|
|
||||||
// There is no Jack task for some variants
|
|
||||||
if (jackTask == null) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
def jillOutputStream = OriginalStream.builder()
|
|
||||||
.addContentType(QualifiedContent.DefaultContentType.CLASSES)
|
|
||||||
.addScope(QualifiedContent.Scope.PROJECT)
|
|
||||||
.setJar(jillOutputFile)
|
|
||||||
.setDependency(kotlinJillTaskName)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
jackTask.consumedInputStreams.add(jillOutputStream)
|
|
||||||
jackTask.dependsOn(kotlinJillTaskName)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static AbstractCompile getJavaCompile(@NotNull Object baseVariantData) {
|
private static AbstractCompile getJavaCompile(@NotNull Object baseVariantData) {
|
||||||
if (baseVariantData.getMetaClass().getMetaProperty("javaCompileTask")) {
|
if (baseVariantData.getMetaClass().getMetaProperty("javaCompileTask")) {
|
||||||
|
|||||||
-52
@@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2017 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.plugin.android
|
|
||||||
|
|
||||||
|
|
||||||
import com.android.builder.core.BuildToolsServiceLoader
|
|
||||||
import com.android.jill.api.v01.Api01Config
|
|
||||||
import com.android.sdklib.BuildToolInfo
|
|
||||||
import org.gradle.api.DefaultTask
|
|
||||||
import org.gradle.api.tasks.InputFile
|
|
||||||
import org.gradle.api.tasks.OutputFile
|
|
||||||
import org.gradle.api.tasks.TaskAction
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
open class KotlinJillTask : DefaultTask() {
|
|
||||||
|
|
||||||
@InputFile
|
|
||||||
lateinit var inputJarFile: File
|
|
||||||
|
|
||||||
@OutputFile
|
|
||||||
lateinit var outputJillFile: File
|
|
||||||
|
|
||||||
lateinit var buildTools: BuildToolInfo
|
|
||||||
|
|
||||||
@TaskAction
|
|
||||||
fun transform() {
|
|
||||||
val jillProvider = BuildToolsServiceLoader.INSTANCE
|
|
||||||
.forVersion(buildTools)
|
|
||||||
.getServiceLoader(BuildToolsServiceLoader.JILL)
|
|
||||||
.firstOrNull() ?: error("Jill provider not found")
|
|
||||||
|
|
||||||
outputJillFile.parentFile.mkdirs()
|
|
||||||
val config01: Api01Config = jillProvider.createConfig(Api01Config::class.java)
|
|
||||||
config01.setInputJavaBinaryFile(inputJarFile)
|
|
||||||
config01.setOutputJackFile(outputJillFile)
|
|
||||||
config01.task.run()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+2
-2
@@ -20,11 +20,11 @@ import java.io.File
|
|||||||
|
|
||||||
internal class ArtifactDifferenceRegistryProviderAndroidWrapper(
|
internal class ArtifactDifferenceRegistryProviderAndroidWrapper(
|
||||||
private val provider: ArtifactDifferenceRegistryProvider,
|
private val provider: ArtifactDifferenceRegistryProvider,
|
||||||
private val jarToAarMapping: Map<File, File>
|
private val jarToAarMapping: () -> Map<File, File>
|
||||||
) : ArtifactDifferenceRegistryProvider {
|
) : ArtifactDifferenceRegistryProvider {
|
||||||
override fun <T> withRegistry(report: (String)->Unit, fn: (ArtifactDifferenceRegistry)->T): T? {
|
override fun <T> withRegistry(report: (String)->Unit, fn: (ArtifactDifferenceRegistry)->T): T? {
|
||||||
return provider.withRegistry(report) { originalRegistry ->
|
return provider.withRegistry(report) { originalRegistry ->
|
||||||
val wrapped = ArtifactDifferenceRegistryAndroidWrapper(originalRegistry, jarToAarMapping)
|
val wrapped = ArtifactDifferenceRegistryAndroidWrapper(originalRegistry, jarToAarMapping())
|
||||||
fn(wrapped)
|
fn(wrapped)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user