1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-26 08:27:12 -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()
/**
* for {internal, release}, return [internal, release, internalRelease]
* for {internal, release}, return [internalRelease, internal, release]
*/
fun allDirectories(project: Project): List<String> {
val result = arrayListOf<String>()
result.add(toCamelcaseDir())
if (productFlavor != null) result.add(productFlavor.name)
if (buildType != null) result.add(buildType.name)
result.add(toCamelcaseDir())
return result
}

View file

@ -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<File>,
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<ManifestDependency>()
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<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.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")

View file

@ -406,8 +406,8 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v
override fun fieldsFor(project: Project, context: KobaltContext): List<BuildConfigField> {
val result = arrayListOf<BuildConfigField>()
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<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,
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

View file

@ -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 <T> 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()
}