From 42f756dc92cfd6c8f0b7ea69ba44555da7797918 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Thu, 10 Dec 2015 22:38:35 +0400 Subject: [PATCH] Fix manifest merger. --- src/main/kotlin/com/beust/kobalt/Variant.kt | 4 +-- .../kobalt/plugin/android/AndroidBuild.kt | 36 +++++++++++++++++-- .../kobalt/plugin/android/AndroidFiles.kt | 10 ++++-- .../kobalt/plugin/android/AndroidPlugin.kt | 21 +++++++---- .../beust/kobalt/plugin/android/AppInfo.kt | 15 ++++---- 5 files changed, 65 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/com/beust/kobalt/Variant.kt b/src/main/kotlin/com/beust/kobalt/Variant.kt index 6c0ffff7..72e2561b 100644 --- a/src/main/kotlin/com/beust/kobalt/Variant.kt +++ b/src/main/kotlin/com/beust/kobalt/Variant.kt @@ -26,13 +26,13 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, fun toTask(taskName: String) = taskName + productFlavor.name.capitalize() + buildType.name.capitalize() /** - * for {internal, release}, return [internal, release, internalRelease] + * for {internal, release}, return [internalRelease, internal, release] */ fun allDirectories(project: Project): List { val result = arrayListOf() + result.add(toCamelcaseDir()) if (productFlavor != null) result.add(productFlavor.name) if (buildType != null) result.add(buildType.name) - result.add(toCamelcaseDir()) return result } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidBuild.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidBuild.kt index a591613c..1c84621a 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidBuild.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidBuild.kt @@ -18,7 +18,9 @@ import com.android.sdklib.AndroidTargetHash import com.android.sdklib.SdkManager import com.android.utils.StdLogger import com.beust.kobalt.Variant +import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.Project +import com.beust.kobalt.maven.dependency.MavenDependency import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.log import java.io.File @@ -70,6 +72,8 @@ class AndroidBuild { // val annotationsJar = File("/Users/beust/adt-bundle-mac-x86_64-20140702/sdk/tools/lib/annotations.jar") // val adb = File("/Users/beust/adt-bundle-mac-x86_64-20140702/sdk/platform-tools/adb") + lateinit var androidBuilder: AndroidBuilder + fun run(project: Project, variant: Variant, config: AndroidConfig, aarDependencies: List, rDirectory: String) { val logger = StdLogger(StdLogger.Level.VERBOSE) @@ -77,7 +81,7 @@ class AndroidBuild { val javaProcessExecutor = KobaltJavaProcessExecutor() val androidHome = File(AndroidFiles.androidHome(project, config)) val sdkLoader : SdkLoader = DefaultSdkLoader.getLoader(androidHome) - val androidBuilder = AndroidBuilder(project.name, "kobalt-android-plugin", + androidBuilder = AndroidBuilder(project.name, "kobalt-android-plugin", processExecutor, javaProcessExecutor, KobaltErrorReporter(), @@ -121,7 +125,7 @@ class AndroidBuild { }.filter { it.exists() } - val libraries = listOf() + val libraries = createLibraryDependencies(project, project.compileDependencies) val outManifest = AndroidFiles.mergedManifest(project, variant) val outAaptSafeManifestLocation = KFiles.joinDir(project.directory, project.buildDirectory, "generatedSafeAapt") val reportFile = File(KFiles.joinDir(project.directory, project.buildDirectory, "manifest-merger-report.txt")) @@ -210,4 +214,32 @@ class AndroidBuild { androidBuilder.processResources(aaptCommand, true, processOutputHandler) } + + private fun createLibraryDependencies(project: Project, dependencies: List) + : List { + val result = arrayListOf() + dependencies.filter { + it is MavenDependency && it.jarFile.get().path.endsWith(".aar") + }.forEach { + val dep = it as MavenDependency + result.add(object: ManifestDependency { + override fun getManifest(): File? { + return File(AndroidFiles.explodedManifest(project, dep.mavenId)) + } + + override fun getName() = it.jarFile.get().path + + override fun getManifestDependencies(): List { + return createLibraryDependencies(project, it.directDependencies()) + } + + }) + it.directDependencies() + } + return result + } + + fun dex(project: Project) { +// androidBuilder.createMainDexList() + } } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidFiles.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidFiles.kt index 11e864f3..ce10f62a 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidFiles.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidFiles.kt @@ -5,7 +5,6 @@ import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project import com.beust.kobalt.maven.MavenId import com.beust.kobalt.misc.KFiles -import java.nio.file.Paths class AndroidFiles { companion object { @@ -26,9 +25,14 @@ class AndroidFiles { fun mergedResources(project: Project, variant: Variant) = KFiles.joinAndMakeDir(mergedResourcesNoVariant(project), variant.toIntermediateDir()) + private fun exploded(project: Project, mavenId: MavenId) = KFiles.joinAndMakeDir( + intermediates(project), "exploded-aar", mavenId.groupId, mavenId.artifactId, mavenId.version!!) + + fun explodedManifest(project: Project, mavenId: MavenId) = + KFiles.joinDir(exploded(project, mavenId), "AndroidManifest.xml") + fun classesJar(project: Project, mavenId: MavenId) = - Paths.get(intermediates(project), "exploded-aar", mavenId.groupId, mavenId.artifactId, mavenId.version, - "classes.jar").toFile().path + KFiles.joinDir(exploded(project, mavenId), "classes.jar") fun classesDir(project: Project, variant: Variant): String = KFiles.joinDir(project.directory, project.buildDirectory, variant.toIntermediateDir(), "classes") diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt index 92ccda09..3d22c2c0 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt @@ -406,8 +406,8 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v override fun fieldsFor(project: Project, context: KobaltContext): List { val result = arrayListOf() configurationFor(project)?.let { config -> - result.add(BuildConfigField("String", "VERSION_NAME", "\"${config.versionName}\"")) - result.add(BuildConfigField("int", "VERSION_CODE", "${config.versionCode}")) + result.add(BuildConfigField("String", "VERSION_NAME", "\"${config.defaultConfig.versionName}\"")) + result.add(BuildConfigField("int", "VERSION_CODE", "${config.defaultConfig.versionCode}")) } return result } @@ -416,13 +416,16 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v override fun tasksFor(context: KobaltContext): List = taskContributor.dynamicTasks } +class DefaultConfig(var minSdkVersion: String? = null, + var targetSdkVersion: String? = null, + var versionCode: Int? = null, + var versionName: String? = null) { + var buildConfig : BuildConfig? = BuildConfig() +} + class AndroidConfig(val project: Project, var compileSdkVersion : String? = null, var buildToolsVersion: String? = null, - var minSdkVersion: String? = null, - var versionCode: Int? = null, - var versionName: String? = null, - var targetSdkVersion: String? = null, var applicationId: String? = null, val androidHome: String? = null) { @@ -431,6 +434,12 @@ class AndroidConfig(val project: Project, fun addSigningConfig(name: String, project: Project, signingConfig: SigningConfig) { signingConfigs.put(name, signingConfig) } + + var defaultConfig: DefaultConfig = DefaultConfig() + + fun defaultConfig(init: DefaultConfig.() -> Unit) { + defaultConfig = DefaultConfig().apply { init() } + } } @Directive diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/AppInfo.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/AppInfo.kt index 4f2b8847..28c2bdfd 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AppInfo.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AppInfo.kt @@ -5,23 +5,22 @@ import com.android.xml.AndroidManifest import java.io.File /** - * Manage the main application id for the app, based on an overlay of the AndroidManifest.xml and - * values specified in the Android config (in the build file). + * Manage the main application id for the app: values from androidConfig{} have precedence over values + * found in the manifest. */ class AppInfo(val androidManifest: File, val config: AndroidConfig) { val abstractManifest = FileWrapper(androidManifest) - private fun overlay(manifestValue: T, configValue: T?) = configValue ?: manifestValue - val versionCode : Int - get() = overlay(AndroidManifest.getVersionCode(abstractManifest), config.versionCode) + get() = config.defaultConfig.versionCode ?: AndroidManifest.getVersionCode(abstractManifest) val versionName : String - get() = versionCode.toString() + get() = config.defaultConfig.versionName ?: versionCode.toString() val minSdkVersion: String? - get() = overlay(AndroidManifest.getMinSdkVersion(abstractManifest), config.minSdkVersion)?.toString() + get() = config.defaultConfig.minSdkVersion ?: AndroidManifest.getMinSdkVersion(abstractManifest)?.toString() val targetSdkVersion: String? - get() = overlay(AndroidManifest.getTargetSdkVersion(abstractManifest), config.targetSdkVersion)?.toString() + get() = config.defaultConfig.targetSdkVersion + ?: AndroidManifest.getTargetSdkVersion(abstractManifest)?.toString() }