Improve Android libraries support: allow project dependency on a lib

* Add a platform type androidJvm that is one-way compatible (can
  consume but cannot be consumed) with jvm, register the matching
  strategy

* Write our attributes to Android's output configurations (this uses
  a naming convention that Android inherits from Java, but there's no
  public API at the moment for that)
This commit is contained in:
Sergey Igushkin
2018-08-04 04:22:05 +03:00
parent 3f60798848
commit caec846330
45 changed files with 675 additions and 2 deletions
@@ -113,6 +113,14 @@ class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools
usesPlatformOf(compilation.target)
project.addExtendsFromRelation(name, compilation.runtimeDependencyConfigurationName)
}
// TODO this code depends on the convention that is present in the Android plugin as there's no public API
// We should request such API in the Android plugin
val apiElementsConfigurationName = "${variant.name}ApiElements"
val runtimeElementsConfigurationName = "${variant.name}RuntimeElements"
listOf(apiElementsConfigurationName, runtimeElementsConfigurationName).forEach { outputConfigurationName ->
project.configurations.findByName(outputConfigurationName)?.usesPlatformOf(compilation.target)
}
}
private inner class KaptVariant(variantData: BaseVariant) : KaptVariantData<BaseVariant>(variantData) {
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
import java.io.FileNotFoundException
import java.util.*
import javax.inject.Inject
@@ -68,9 +69,20 @@ abstract class KotlinBasePluginWrapper(
}
val plugin = getPlugin(project, kotlinGradleBuildServices)
setupAttributeMatchingStrategy(project)
plugin.apply(project)
}
private fun setupAttributeMatchingStrategy(project: Project) = with(project.dependencies.attributesSchema) {
attribute(KotlinPlatformType.attribute).run {
if (isGradleVersionAtLeast(4, 0)) {
compatibilityRules.add(KotlinPlatformType.CompatibilityRule::class.java)
}
}
}
internal abstract fun getPlugin(
project: Project,
kotlinGradleBuildServices: KotlinGradleBuildServices
@@ -65,7 +65,7 @@ open class KotlinAndroidTarget(
internal set
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.jvm
get() = KotlinPlatformType.androidJvm
private val compilationFactory = KotlinJvmAndroidCompilationFactory(project, this)