diff options
Diffstat (limited to 'java')
-rw-r--r-- | java/aapt2.go | 15 | ||||
-rw-r--r-- | java/androidmk.go | 3 | ||||
-rw-r--r-- | java/app.go | 6 | ||||
-rw-r--r-- | java/app_builder.go | 44 |
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) { |