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)
 	}
 }