From dfa429336bb73c1eb167659ed43e21eac1a53fb5 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Sat, 28 Nov 2015 01:18:53 -0800 Subject: [PATCH] Proguard preliminary work. --- src/main/kotlin/com/beust/kobalt/Variant.kt | 2 +- .../kotlin/com/beust/kobalt/api/Project.kt | 15 ++++++-- .../kobalt/plugin/android/AndroidPlugin.kt | 35 +++++++++++++------ .../beust/kobalt/plugin/android/Proguard.kt | 10 ++++++ 4 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 src/main/kotlin/com/beust/kobalt/plugin/android/Proguard.kt diff --git a/src/main/kotlin/com/beust/kobalt/Variant.kt b/src/main/kotlin/com/beust/kobalt/Variant.kt index 5d5a4c37..81accaeb 100644 --- a/src/main/kotlin/com/beust/kobalt/Variant.kt +++ b/src/main/kotlin/com/beust/kobalt/Variant.kt @@ -131,7 +131,7 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, companion object { val DEFAULT_PRODUCT_FLAVOR = ProductFlavorConfig("") - val DEFAULT_BUILD_TYPE = BuildTypeConfig("") + val DEFAULT_BUILD_TYPE = BuildTypeConfig(null, "") fun allVariants(project: Project): List { val result = arrayListOf() diff --git a/src/main/kotlin/com/beust/kobalt/api/Project.kt b/src/main/kotlin/com/beust/kobalt/api/Project.kt index 43c17ffe..ad8824a7 100644 --- a/src/main/kotlin/com/beust/kobalt/api/Project.kt +++ b/src/main/kotlin/com/beust/kobalt/api/Project.kt @@ -1,10 +1,13 @@ package com.beust.kobalt.api +import com.beust.kobalt.Plugins import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.internal.IProjectInfo import com.beust.kobalt.maven.IClasspathDependency import com.beust.kobalt.maven.MavenDependency import com.beust.kobalt.misc.KFiles +import com.beust.kobalt.plugin.android.AndroidPlugin +import com.beust.kobalt.plugin.android.Proguard import java.util.* open public class Project( @@ -188,12 +191,20 @@ fun Project.productFlavor(name: String, init: ProductFlavorConfig.() -> Unit) = addProductFlavor(name, this) } -class BuildTypeConfig(val name: String) : IBuildConfig { +class BuildTypeConfig(val project: Project?, val name: String) : IBuildConfig { + var minifyEnabled = false + var proguardFile: String? = null + + fun getDefaultProguardFile(name: String) : String { + val androidPlugin = Plugins.findPlugin(AndroidPlugin.PLUGIN_NAME) as AndroidPlugin + return Proguard(androidPlugin.androidHome(project)).getDefaultProguardFile(name) + } + override var buildConfig: BuildConfig? = null } @Directive -fun Project.buildType(name: String, init: BuildTypeConfig.() -> Unit) = BuildTypeConfig(name).apply { +fun Project.buildType(name: String, init: BuildTypeConfig.() -> Unit) = BuildTypeConfig(this, name).apply { init() addBuildType(name, this) } 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 0d4fb2fc..d12cf137 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt @@ -31,6 +31,8 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v companion object { const val PLUGIN_NAME = "Android" const val TASK_GENERATE_DEX = "generateDex" + const val TASK_SIGN_APK = "signApk" + const val TASK_INSTALL= "install" } override val name = PLUGIN_NAME @@ -50,6 +52,8 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v runTask = { taskSignApk(project) }) addVariantTasks(project, "install", runAfter = listOf("signApk"), runTask = { taskInstall(project) }) + addVariantTasks(project, "proguard", runBefore = listOf("install"), runAfter = listOf("compile"), + runTask = { taskProguard(project) }) } context.pluginInfo.classpathContributors.add(this) } @@ -232,6 +236,22 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v } } + @Task(name = "proguard", description = "Run Proguard, if enabled", runBefore = arrayOf(TASK_GENERATE_DEX), + runAfter = arrayOf("compile")) + fun taskProguard(project: Project): TaskResult { + val config = configurationFor(project) + if (config != null) { + val buildType = context.variant.buildType + if (buildType.minifyEnabled) { + log(1, "minifyEnabled is true, running Proguard") + val classesDir = project.classesDir(context) + val proguardHome = KFiles.joinDir(androidHome(project), "tools", "proguard") + val proguardCommand = KFiles.joinDir(proguardHome, "bin", "proguard.sh") + } + } + return TaskResult() + } + @Task(name = TASK_GENERATE_DEX, description = "Generate the dex file", runBefore = arrayOf("assemble"), runAfter = arrayOf("compile")) fun taskGenerateDex(project: Project): TaskResult { @@ -258,14 +278,6 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v //KFiles.joinDir(intermediates(project), "dex", context.variant.toIntermediateDir()), project.classesDir(context) )) -// val args = listOf("--dex", "--output", outClassesDex) -// val otherArgs = -// project.dependencies?.let { -// it.dependencies.map { -// it.jarFile.get().path -// }.filter { ! it.endsWith(".aar") && ! it.endsWith("android.jar") } -// } ?: emptyList() -// RunCommand(dx).run(args + otherArgs) // // Add classes.dex to existing .ap_ @@ -292,7 +304,7 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v * jarsigner -keystore ~/.android/debug.keystore -storepass android -keypass android -signedjar a.apk a.ap_ * androiddebugkey */ - @Task(name = "signApk", description = "Sign the apk file", runAfter = arrayOf(TASK_GENERATE_DEX), + @Task(name = TASK_SIGN_APK, description = "Sign the apk file", runAfter = arrayOf(TASK_GENERATE_DEX), runBefore = arrayOf("assemble")) fun taskSignApk(project: Project): TaskResult { val apk = apk(project, context.variant.shortArchiveName) @@ -320,10 +332,10 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v )) log(1, "Created $apk") - return TaskResult(success == 0) + return TaskResult(success == 0) } - @Task(name = "install", description = "Install the apk file", runAfter = arrayOf(TASK_GENERATE_DEX, "assemble")) + @Task(name = TASK_INSTALL, description = "Install the apk file", runAfter = arrayOf(TASK_GENERATE_DEX, "assemble")) fun taskInstall(project: Project): TaskResult { val apk = apk(project, context.variant.shortArchiveName) RunCommand(adb(project)).useErrorStreamAsErrorIndicator(false).run(args = listOf( @@ -438,3 +450,4 @@ fun AndroidConfig.signingConfig(name: String, init: SigningConfig.() -> Unit) : } } + diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/Proguard.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/Proguard.kt new file mode 100644 index 00000000..96cd064f --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/Proguard.kt @@ -0,0 +1,10 @@ +package com.beust.kobalt.plugin.android + +import com.beust.kobalt.misc.KFiles + +class Proguard(val androidHome: String) { + val proguardHome = KFiles.joinDir(androidHome, "tools", "proguard") + val proguardCommand = KFiles.joinDir(proguardHome, "bin", "proguard.sh") + + fun getDefaultProguardFile(name: String) = KFiles.joinDir(proguardHome, name) +}