1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-27 00:38:11 -07:00

Fix manifest merger.

This commit is contained in:
Cedric Beust 2015-12-10 22:38:35 +04:00
parent e1c7aa6a43
commit 42f756dc92
5 changed files with 65 additions and 21 deletions

View file

@ -26,13 +26,13 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
fun toTask(taskName: String) = taskName + productFlavor.name.capitalize() + buildType.name.capitalize() 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<String> { fun allDirectories(project: Project): List<String> {
val result = arrayListOf<String>() val result = arrayListOf<String>()
result.add(toCamelcaseDir())
if (productFlavor != null) result.add(productFlavor.name) if (productFlavor != null) result.add(productFlavor.name)
if (buildType != null) result.add(buildType.name) if (buildType != null) result.add(buildType.name)
result.add(toCamelcaseDir())
return result return result
} }

View file

@ -18,7 +18,9 @@ import com.android.sdklib.AndroidTargetHash
import com.android.sdklib.SdkManager import com.android.sdklib.SdkManager
import com.android.utils.StdLogger import com.android.utils.StdLogger
import com.beust.kobalt.Variant import com.beust.kobalt.Variant
import com.beust.kobalt.api.IClasspathDependency
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.maven.dependency.MavenDependency
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.log import com.beust.kobalt.misc.log
import java.io.File 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 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") // 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<File>, fun run(project: Project, variant: Variant, config: AndroidConfig, aarDependencies: List<File>,
rDirectory: String) { rDirectory: String) {
val logger = StdLogger(StdLogger.Level.VERBOSE) val logger = StdLogger(StdLogger.Level.VERBOSE)
@ -77,7 +81,7 @@ class AndroidBuild {
val javaProcessExecutor = KobaltJavaProcessExecutor() val javaProcessExecutor = KobaltJavaProcessExecutor()
val androidHome = File(AndroidFiles.androidHome(project, config)) val androidHome = File(AndroidFiles.androidHome(project, config))
val sdkLoader : SdkLoader = DefaultSdkLoader.getLoader(androidHome) val sdkLoader : SdkLoader = DefaultSdkLoader.getLoader(androidHome)
val androidBuilder = AndroidBuilder(project.name, "kobalt-android-plugin", androidBuilder = AndroidBuilder(project.name, "kobalt-android-plugin",
processExecutor, processExecutor,
javaProcessExecutor, javaProcessExecutor,
KobaltErrorReporter(), KobaltErrorReporter(),
@ -121,7 +125,7 @@ class AndroidBuild {
}.filter { }.filter {
it.exists() it.exists()
} }
val libraries = listOf<ManifestDependency>() val libraries = createLibraryDependencies(project, project.compileDependencies)
val outManifest = AndroidFiles.mergedManifest(project, variant) val outManifest = AndroidFiles.mergedManifest(project, variant)
val outAaptSafeManifestLocation = KFiles.joinDir(project.directory, project.buildDirectory, "generatedSafeAapt") val outAaptSafeManifestLocation = KFiles.joinDir(project.directory, project.buildDirectory, "generatedSafeAapt")
val reportFile = File(KFiles.joinDir(project.directory, project.buildDirectory, "manifest-merger-report.txt")) val reportFile = File(KFiles.joinDir(project.directory, project.buildDirectory, "manifest-merger-report.txt"))
@ -210,4 +214,32 @@ class AndroidBuild {
androidBuilder.processResources(aaptCommand, true, processOutputHandler) androidBuilder.processResources(aaptCommand, true, processOutputHandler)
} }
private fun createLibraryDependencies(project: Project, dependencies: List<IClasspathDependency>)
: List<ManifestDependency> {
val result = arrayListOf<ManifestDependency>()
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<ManifestDependency> {
return createLibraryDependencies(project, it.directDependencies())
}
})
it.directDependencies()
}
return result
}
fun dex(project: Project) {
// androidBuilder.createMainDexList()
}
} }

View file

@ -5,7 +5,6 @@ import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.maven.MavenId import com.beust.kobalt.maven.MavenId
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
import java.nio.file.Paths
class AndroidFiles { class AndroidFiles {
companion object { companion object {
@ -26,9 +25,14 @@ class AndroidFiles {
fun mergedResources(project: Project, variant: Variant) = fun mergedResources(project: Project, variant: Variant) =
KFiles.joinAndMakeDir(mergedResourcesNoVariant(project), variant.toIntermediateDir()) 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) = fun classesJar(project: Project, mavenId: MavenId) =
Paths.get(intermediates(project), "exploded-aar", mavenId.groupId, mavenId.artifactId, mavenId.version, KFiles.joinDir(exploded(project, mavenId), "classes.jar")
"classes.jar").toFile().path
fun classesDir(project: Project, variant: Variant): String = fun classesDir(project: Project, variant: Variant): String =
KFiles.joinDir(project.directory, project.buildDirectory, variant.toIntermediateDir(), "classes") KFiles.joinDir(project.directory, project.buildDirectory, variant.toIntermediateDir(), "classes")

View file

@ -406,8 +406,8 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v
override fun fieldsFor(project: Project, context: KobaltContext): List<BuildConfigField> { override fun fieldsFor(project: Project, context: KobaltContext): List<BuildConfigField> {
val result = arrayListOf<BuildConfigField>() val result = arrayListOf<BuildConfigField>()
configurationFor(project)?.let { config -> configurationFor(project)?.let { config ->
result.add(BuildConfigField("String", "VERSION_NAME", "\"${config.versionName}\"")) result.add(BuildConfigField("String", "VERSION_NAME", "\"${config.defaultConfig.versionName}\""))
result.add(BuildConfigField("int", "VERSION_CODE", "${config.versionCode}")) result.add(BuildConfigField("int", "VERSION_CODE", "${config.defaultConfig.versionCode}"))
} }
return result return result
} }
@ -416,13 +416,16 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v
override fun tasksFor(context: KobaltContext): List<DynamicTask> = taskContributor.dynamicTasks override fun tasksFor(context: KobaltContext): List<DynamicTask> = 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, class AndroidConfig(val project: Project,
var compileSdkVersion : String? = null, var compileSdkVersion : String? = null,
var buildToolsVersion: 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, var applicationId: String? = null,
val androidHome: String? = null) { val androidHome: String? = null) {
@ -431,6 +434,12 @@ class AndroidConfig(val project: Project,
fun addSigningConfig(name: String, project: Project, signingConfig: SigningConfig) { fun addSigningConfig(name: String, project: Project, signingConfig: SigningConfig) {
signingConfigs.put(name, signingConfig) signingConfigs.put(name, signingConfig)
} }
var defaultConfig: DefaultConfig = DefaultConfig()
fun defaultConfig(init: DefaultConfig.() -> Unit) {
defaultConfig = DefaultConfig().apply { init() }
}
} }
@Directive @Directive

View file

@ -5,23 +5,22 @@ import com.android.xml.AndroidManifest
import java.io.File import java.io.File
/** /**
* Manage the main application id for the app, based on an overlay of the AndroidManifest.xml and * Manage the main application id for the app: values from androidConfig{} have precedence over values
* values specified in the Android config (in the build file). * found in the manifest.
*/ */
class AppInfo(val androidManifest: File, val config: AndroidConfig) { class AppInfo(val androidManifest: File, val config: AndroidConfig) {
val abstractManifest = FileWrapper(androidManifest) val abstractManifest = FileWrapper(androidManifest)
private fun <T> overlay(manifestValue: T, configValue: T?) = configValue ?: manifestValue
val versionCode : Int val versionCode : Int
get() = overlay(AndroidManifest.getVersionCode(abstractManifest), config.versionCode) get() = config.defaultConfig.versionCode ?: AndroidManifest.getVersionCode(abstractManifest)
val versionName : String val versionName : String
get() = versionCode.toString() get() = config.defaultConfig.versionName ?: versionCode.toString()
val minSdkVersion: String? val minSdkVersion: String?
get() = overlay(AndroidManifest.getMinSdkVersion(abstractManifest), config.minSdkVersion)?.toString() get() = config.defaultConfig.minSdkVersion ?: AndroidManifest.getMinSdkVersion(abstractManifest)?.toString()
val targetSdkVersion: String? val targetSdkVersion: String?
get() = overlay(AndroidManifest.getTargetSdkVersion(abstractManifest), config.targetSdkVersion)?.toString() get() = config.defaultConfig.targetSdkVersion
?: AndroidManifest.getTargetSdkVersion(abstractManifest)?.toString()
} }