summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/aapt2.go15
-rw-r--r--java/androidmk.go3
-rw-r--r--java/app.go6
-rw-r--r--java/app_builder.go44
4 files changed, 68 insertions, 0 deletions
diff --git a/java/aapt2.go b/java/aapt2.go
index 5553bfdf8..86eb9c804 100644
--- a/java/aapt2.go
+++ b/java/aapt2.go
@@ -188,3 +188,18 @@ func aapt2Link(ctx android.ModuleContext,
},
})
}
+
+var aapt2ConvertRule = pctx.AndroidStaticRule("aapt2Convert",
+ blueprint.RuleParams{
+ Command: `${config.Aapt2Cmd} convert --output-format proto $in -o $out`,
+ CommandDeps: []string{"${config.Aapt2Cmd}"},
+ })
+
+func aapt2Convert(ctx android.ModuleContext, out android.WritablePath, in android.Path) {
+ ctx.Build(pctx, android.BuildParams{
+ Rule: aapt2ConvertRule,
+ Input: in,
+ Output: out,
+ Description: "convert to proto",
+ })
+}
diff --git a/java/androidmk.go b/java/androidmk.go
index e395c9be7..23e26addc 100644
--- a/java/androidmk.go
+++ b/java/androidmk.go
@@ -209,6 +209,9 @@ func (app *AndroidApp) AndroidMk() android.AndroidMkData {
if app.headerJarFile != nil {
fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", app.headerJarFile.String())
}
+ if app.bundleFile != nil {
+ fmt.Fprintln(w, "LOCAL_SOONG_BUNDLE :=", app.bundleFile.String())
+ }
if app.jacocoReportClassesFile != nil {
fmt.Fprintln(w, "LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR :=", app.jacocoReportClassesFile.String())
}
diff --git a/java/app.go b/java/app.go
index 7ca20cee6..392ad3fc8 100644
--- a/java/app.go
+++ b/java/app.go
@@ -83,6 +83,8 @@ type AndroidApp struct {
extraLinkFlags []string
installJniLibs []jniLib
+
+ bundleFile android.Path
}
func (a *AndroidApp) ExportedProguardFlagFiles() android.Paths {
@@ -277,6 +279,10 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
CreateAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates)
a.outputFile = packageFile
+ bundleFile := android.PathForModuleOut(ctx, "base.zip")
+ BuildBundleModule(ctx, bundleFile, a.exportPackage, jniJarFile, dexJarFile)
+ a.bundleFile = bundleFile
+
if ctx.ModuleName() == "framework-res" {
// framework-res.apk is installed as system/framework/framework-res.apk
ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".apk", a.outputFile)
diff --git a/java/app_builder.go b/java/app_builder.go
index 424aec85c..476eb60cd 100644
--- a/java/app_builder.go
+++ b/java/app_builder.go
@@ -134,6 +134,50 @@ func BuildAAR(ctx android.ModuleContext, outputFile android.WritablePath,
})
}
+var buildBundleModule = pctx.AndroidStaticRule("buildBundleModule",
+ blueprint.RuleParams{
+ Command: `${config.Zip2ZipCmd} -i ${in} -o ${out}.res.zip AndroidManifest.xml:manifest/AndroidManifest.xml resources.pb "res/**/*" "assets/**/*" &&` +
+ `${config.Zip2ZipCmd} -i ${dexJar} -o ${out}.dex.zip "classes*.dex:dex/" && ` +
+ `${config.MergeZipsCmd} ${out} ${out}.res.zip ${out}.dex.zip ${jniJar} && ` +
+ `rm ${out}.res.zip ${out}.dex.zip`,
+ CommandDeps: []string{
+ "${config.Zip2ZipCmd}",
+ "${config.MergeZipsCmd}",
+ },
+ }, "dexJar", "jniJar")
+
+// Builds an app into a module suitable for input to bundletool
+func BuildBundleModule(ctx android.ModuleContext, outputFile android.WritablePath,
+ resJarFile, jniJarFile, dexJarFile android.Path) {
+
+ protoResJarFile := android.PathForModuleOut(ctx, "package-res.pb.apk")
+ aapt2Convert(ctx, protoResJarFile, resJarFile)
+
+ var deps android.Paths
+ var jniPath string
+ var dexPath string
+ if dexJarFile != nil {
+ deps = append(deps, dexJarFile)
+ dexPath = dexJarFile.String()
+ }
+ if jniJarFile != nil {
+ deps = append(deps, jniJarFile)
+ jniPath = jniJarFile.String()
+ }
+
+ ctx.Build(pctx, android.BuildParams{
+ Rule: buildBundleModule,
+ Implicits: deps,
+ Input: protoResJarFile,
+ Output: outputFile,
+ Description: "bundle",
+ Args: map[string]string{
+ "dexJar": dexPath,
+ "jniJar": jniPath,
+ },
+ })
+}
+
func TransformJniLibsToJar(ctx android.ModuleContext, outputFile android.WritablePath,
jniLibs []jniLib) {