Support package_splits
Pass the package_splits list from the property to aapt2 as
--split arguments, sign the extra outputs, install them, and
add them as extra output files for SourceFileProducer.
Bug: 127921149
Test: TestAppSplits
Change-Id: Id94a53ae6a8a68ec81e98abba2fefc9c23feaa7a
diff --git a/java/app.go b/java/app.go
index 8a422fc..45e3a83 100644
--- a/java/app.go
+++ b/java/app.go
@@ -226,6 +226,8 @@
aaptLinkFlags = append(aaptLinkFlags, a.additionalAaptFlags...)
+ a.aapt.splitNames = a.appProperties.Package_splits
+
a.aapt.buildActions(ctx, sdkContext(a), aaptLinkFlags...)
// apps manifests are handled by aapt, don't let Module see them
@@ -341,19 +343,32 @@
CreateAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates)
a.outputFile = packageFile
+ for _, split := range a.aapt.splits {
+ // Sign the split APKs
+ packageFile := android.PathForModuleOut(ctx, ctx.ModuleName()+"_"+split.suffix+".apk")
+ CreateAppPackage(ctx, packageFile, split.path, nil, nil, certificates)
+ a.extraOutputFiles = append(a.extraOutputFiles, packageFile)
+ }
+
// Build an app bundle.
bundleFile := android.PathForModuleOut(ctx, "base.zip")
BuildBundleModule(ctx, bundleFile, a.exportPackage, jniJarFile, dexJarFile)
a.bundleFile = bundleFile
// Install the app package.
+ var installDir android.OutputPath
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)
+ installDir = android.PathForModuleInstall(ctx, "framework")
} else if Bool(a.appProperties.Privileged) {
- ctx.InstallFile(android.PathForModuleInstall(ctx, "priv-app", a.installApkName), a.installApkName+".apk", a.outputFile)
+ installDir = android.PathForModuleInstall(ctx, "priv-app", a.installApkName)
} else {
- ctx.InstallFile(android.PathForModuleInstall(ctx, "app", a.installApkName), a.installApkName+".apk", a.outputFile)
+ installDir = android.PathForModuleInstall(ctx, "app", a.installApkName)
+ }
+
+ ctx.InstallFile(installDir, a.installApkName+".apk", a.outputFile)
+ for _, split := range a.aapt.splits {
+ ctx.InstallFile(installDir, a.installApkName+"_"+split.suffix+".apk", split.path)
}
}