diff options
author | Colin Cross <ccross@android.com> | 2018-10-29 23:14:58 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2018-10-31 14:39:16 +0000 |
commit | f623721c08bb95e2c333e43a41be3c8e27ff1f8f (patch) | |
tree | 6aa1eb113697df8da686370d1d4e4d8d331dd8f5 | |
parent | 724c854f6a28a73191cd8ce1b1c0e5df4797decb (diff) | |
download | android_build_soong-f623721c08bb95e2c333e43a41be3c8e27ff1f8f.tar.gz android_build_soong-f623721c08bb95e2c333e43a41be3c8e27ff1f8f.tar.bz2 android_build_soong-f623721c08bb95e2c333e43a41be3c8e27ff1f8f.zip |
Create bundle modules suitable for bundletool
Create a bundle module in addition to creating an APK, which can
then optionally be merged with bundle modules from builds for
other architectures and then be passed to bundletool to create an
app bundle.
Bug: 117295826
Test: tapas RecoveryLocalizer && m dist
Change-Id: I98a17d7407dc56823ece9ec88c087780185a6555
-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 5553bfdf..86eb9c80 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 e395c9be..23e26add 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 7ca20cee..392ad3fc 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 424aec85..476eb60c 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) { |