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

Installing apk.

This commit is contained in:
Cedric Beust 2015-11-04 09:57:55 -08:00
parent 4df5eabec7
commit c90276de69
2 changed files with 73 additions and 34 deletions

View file

@ -5,7 +5,7 @@ import java.io.File
import java.io.InputStream
import java.io.InputStreamReader
public class RunCommand(val command: String) {
open class RunCommand(val command: String) {
val defaultSuccess = { output: List<String> -> log(1, "Success:\n " + output.joinToString("\n"))}
val defaultError = { output: List<String> -> log(1, "Error:\n " + output.joinToString("\n"))}

View file

@ -1,9 +1,9 @@
package com.beust.kobalt.plugin.android
import com.beust.kobalt.Plugins
import com.beust.kobalt.api.*
import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.homeDir
import com.beust.kobalt.internal.JvmCompilerPlugin
import com.beust.kobalt.internal.TaskResult
import com.beust.kobalt.maven.FileDependency
@ -64,12 +64,13 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler) :
fun dirGet(dir: Path, vararg others: String) : String {
val result = Paths.get(dir.toString(), *others)
with(result.toFile()) {
deleteRecursively()
mkdirs()
}
return result.toString()
}
val flavor = "debug"
fun compileSdkVersion(project: Project) = configurations[project.name!!]?.compileSdkVersion
fun buildToolsVersion(project: Project) = configurations[project.name!!]?.buildToolsVersion
@ -78,71 +79,65 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler) :
fun generated(project: Project) = Paths.get(project.directory, "app", "build", "generated")
private fun aapt(project: Project) = "$ANDROID_HOME/build-tools/${buildToolsVersion(project)}/aapt"
private fun temporaryApk(project: Project, flavor: String) = apk(project, flavor, "ap_")
private fun apk(project: Project, flavor: String, suffix: String) : String {
val outputDir = dirGet(intermediates(project), "resources", "resources-$flavor")
return Paths.get(outputDir, "resources-$flavor.$suffix").toString()
}
private fun intermediates(project: Project) = Paths.get(project.directory, "app", "build", "intermediates")
@Task(name = "generateR", description = "Generate the R.java file",
runBefore = arrayOf("compile"), runAfter = arrayOf("clean"))
fun taskGenerateRFile(project: Project) : TaskResult {
val buildToolsDir = buildToolsVersion(project)
val generated = generated(project)
explodeAarFiles(project, generated)
generateR(project, generated, buildToolsDir)
generateR(project, generated, aapt(project))
return TaskResult()
}
@Task(name = "generateDex", description = "Generate the dex file", alwaysRunAfter = arrayOf("compile"))
fun taskGenerateDex(project: Project) : TaskResult {
val generated = generated(project)
val buildToolsDir = buildToolsVersion(project)
val dx = "$ANDROID_HOME/build-tools/$buildToolsDir/dx"
val buildDir = context.pluginProperties.get("java", JvmCompilerPlugin.BUILD_DIR)
val libsDir = context.pluginProperties.get("packaging", PackagingPlugin.LIBS_DIR)
File(libsDir!!.toString()).mkdirs()
RunCommand(dx).run(listOf("--dex", "--output", KFiles.joinDir(libsDir!!.toString(), "classes.dex"),
buildDir!!.toString()))
return TaskResult()
class AaptCommand(project: Project, aapt: String, val aaptCommand: String,
cwd: File = File(project.directory)) : RunCommand(aapt) {
init {
directory = cwd
}
fun call(args: List<String>) = run(arrayListOf(aaptCommand) + args)
}
private fun generateR(project: Project, generated: Path, buildToolsDir: String?) {
val flavor = "debug"
private fun generateR(project: Project, generated: Path, aapt: String) {
val compileSdkVersion = compileSdkVersion(project)
val androidJar = Paths.get(ANDROID_HOME, "platforms", "android-$compileSdkVersion", "android.jar")
val applicationId = configurations[project.name!!]?.applicationId!!
val intermediates = Paths.get(project.directory, "app", "build", "intermediates")
val manifestDir = Paths.get(project.directory, "app", "src", "main").toString()
// val manifestIntermediateDir = dirGet(intermediates, "manifests", "full", flavor)
val manifest = Paths.get(manifestDir, "AndroidManifest.xml")
val aapt = "$ANDROID_HOME/build-tools/$buildToolsDir/aapt"
val outputDir = dirGet(intermediates, "resources", "resources-$flavor")
val crunchedPngDir = dirGet(intermediates(project), "res", flavor)
val crunchedPngDir = dirGet(intermediates, "res", flavor)
RunCommand(aapt).apply {
directory = File(project.directory)
}.run(arrayListOf(
"crunch",
AaptCommand(project, aapt, "crunch").call(listOf(
"-v",
"-S", "app/src/main/res",
"-C", crunchedPngDir
))
RunCommand(aapt).apply {
directory = File(project.directory)
}.run(arrayListOf(
"package",
AaptCommand(project, aapt, "package").call(listOf(
"-f",
"--no-crunch",
"-I", androidJar.toString(),
"-M", manifest.toString(),
"-S", crunchedPngDir,
"-S", "app/src/main/res",
"-A", dirGet(intermediates, "assets", flavor), // where to find more assets
"-A", dirGet(intermediates(project), "assets", flavor), // where to find more assets
"-m", // create directory
"-J", dirGet(generated, "sources", "r", flavor).toString(), // where all gets generated
"-F", Paths.get(outputDir, "resources-$flavor.ap_").toString(),
"-F", temporaryApk(project, flavor),
"--debug-mode",
"-0", "apk",
"--custom-package", applicationId,
"--output-text-symbols", dirGet(intermediates, "symbol", flavor))
"--output-text-symbols", dirGet(intermediates(project), "symbol", flavor))
)
val rDirectory = KFiles.joinDir(generated.toFile().path, "sources", "r", flavor,
@ -176,6 +171,50 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler) :
return buildDir
}
@Task(name = "generateDex", description = "Generate the dex file", alwaysRunAfter = arrayOf("compile"))
fun taskGenerateDex(project: Project) : TaskResult {
val generated = generated(project)
//
// Call dx to generate classes.dex
//
val buildToolsDir = buildToolsVersion(project)
val dx = "$ANDROID_HOME/build-tools/$buildToolsDir/dx"
val buildDir = context.pluginProperties.get("java", JvmCompilerPlugin.BUILD_DIR)
val libsDir = context.pluginProperties.get("packaging", PackagingPlugin.LIBS_DIR)
File(libsDir!!.toString()).mkdirs()
val classesDex = "classes.dex"
val outClassesDex = KFiles.joinDir(libsDir.toString(), classesDex)
val relClassesDex = File(outClassesDex).parentFile
RunCommand(dx).run(listOf("--dex", "--output", outClassesDex,
buildDir!!.toString()))
//
// Add classes.dex to existing .ap_
//
val temporaryApk = temporaryApk(project, flavor)
AaptCommand(project, aapt(project), "add", relClassesDex).call(listOf(
"-v", temporaryApk, classesDex
))
//
// Sign it
// Mac:
// jarsigner -keystore ~/.android/debug.keystore -storepass android -keypass android -signedjar a.apk a.ap_
// androiddebugkey
//
RunCommand("jarsigner").run(listOf(
"-keystore", homeDir(".android", "debug.keystore"),
"-storepass", "android",
"-keypass", "android",
"-signedjar", apk(project, flavor, "apk"),
temporaryApk,
"androiddebugkey"
))
return TaskResult()
}
private val classpathEntries = HashMultimap.create<String, IClasspathDependency>()
override fun entriesFor(project: Project): Collection<IClasspathDependency> {