Support variants in Android Extensions (compiler plugin)
This commit is contained in:
+36
-9
@@ -19,8 +19,12 @@ package org.jetbrains.kotlin.android
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin
|
||||
import org.gradle.api.Project
|
||||
import com.android.build.gradle.BaseExtension
|
||||
import com.android.build.gradle.api.AndroidSourceSet
|
||||
import org.gradle.api.tasks.compile.AbstractCompile
|
||||
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
|
||||
import org.w3c.dom.Document
|
||||
import java.io.File
|
||||
import javax.xml.parsers.DocumentBuilderFactory
|
||||
|
||||
public class AndroidSubplugin : KotlinGradleSubplugin {
|
||||
|
||||
@@ -28,20 +32,37 @@ public class AndroidSubplugin : KotlinGradleSubplugin {
|
||||
val androidExtension = project.extensions.getByName("android") as? BaseExtension ?: return null
|
||||
|
||||
val sourceSets = androidExtension.sourceSets
|
||||
|
||||
val pluginOptions = arrayListOf<SubpluginOption>()
|
||||
|
||||
val mainSourceSet = sourceSets.getByName("main")
|
||||
|
||||
val resourceDirs = mainSourceSet.res.srcDirs
|
||||
val manifestFile = mainSourceSet.manifest.srcFile
|
||||
val applicationPackage = androidExtension.defaultConfig.applicationId
|
||||
?: getApplicationPackageFromManifest(manifestFile) ?: ""
|
||||
pluginOptions += SubpluginOption("package", applicationPackage)
|
||||
|
||||
if (resourceDirs.isNotEmpty()) {
|
||||
val resourceDirOptions = resourceDirs.map { resourceDir ->
|
||||
resourceDir.listFiles { it.isDirectory && it.name.startsWith("layout") }?.forEach { task.source(it) }
|
||||
SubpluginOption("androidRes", resourceDir.absolutePath)
|
||||
}
|
||||
return listOf(SubpluginOption("androidManifest", manifestFile.absolutePath)) + resourceDirOptions
|
||||
fun addVariant(sourceSet: AndroidSourceSet) {
|
||||
pluginOptions += SubpluginOption("variant", sourceSet.name + ';' +
|
||||
mainSourceSet.res.srcDirs.joinToString(";") { it.absolutePath })
|
||||
}
|
||||
|
||||
return null
|
||||
addVariant(mainSourceSet)
|
||||
|
||||
val flavorSourceSets = androidExtension.productFlavors.map { sourceSets.findByName(it.name) }.filterNotNull()
|
||||
for (sourceSet in flavorSourceSets) {
|
||||
addVariant(sourceSet)
|
||||
}
|
||||
|
||||
return pluginOptions
|
||||
}
|
||||
|
||||
private fun getApplicationPackageFromManifest(manifestFile: File): String? {
|
||||
try {
|
||||
return manifestFile.parseXml().documentElement.getAttribute("package")
|
||||
}
|
||||
catch (e: Exception) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPluginName() = "org.jetbrains.kotlin.android"
|
||||
@@ -49,4 +70,10 @@ public class AndroidSubplugin : KotlinGradleSubplugin {
|
||||
override fun getGroupName() = "org.jetbrains.kotlin"
|
||||
|
||||
override fun getArtifactName() = "kotlin-android-extensions"
|
||||
|
||||
fun File.parseXml(): Document {
|
||||
val factory = DocumentBuilderFactory.newInstance()
|
||||
val builder = factory.newDocumentBuilder()
|
||||
return builder.parse(this)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user