diff --git a/java/aapt2.go b/java/aapt2.go index 86eb9c804..d217b9f59 100644 --- a/java/aapt2.go +++ b/java/aapt2.go @@ -109,6 +109,31 @@ func aapt2CompileDirs(ctx android.ModuleContext, flata android.WritablePath, dir }) } +var aapt2CompileZipRule = pctx.AndroidStaticRule("aapt2CompileZip", + blueprint.RuleParams{ + Command: `${config.ZipSyncCmd} -d $resZipDir $in && ` + + `${config.Aapt2Cmd} compile -o $out $cFlags --legacy --dir $resZipDir`, + CommandDeps: []string{ + "${config.Aapt2Cmd}", + "${config.ZipSyncCmd}", + }, + }, "cFlags", "resZipDir") + +func aapt2CompileZip(ctx android.ModuleContext, flata android.WritablePath, zip android.Path) { + ctx.Build(pctx, android.BuildParams{ + Rule: aapt2CompileZipRule, + Description: "aapt2 compile zip", + Input: zip, + Output: flata, + Args: map[string]string{ + // Always set --pseudo-localize, it will be stripped out later for release + // builds that don't want it. + "cFlags": "--pseudo-localize", + "resZipDir": android.PathForModuleOut(ctx, "aapt2", "reszip", flata.Base()).String(), + }, + }) +} + var aapt2LinkRule = pctx.AndroidStaticRule("aapt2Link", blueprint.RuleParams{ Command: `rm -rf $genDir && ` + diff --git a/java/aar.go b/java/aar.go index e5ab03620..9eb2b279b 100644 --- a/java/aar.go +++ b/java/aar.go @@ -16,6 +16,7 @@ package java import ( "android/soong/android" + "fmt" "strings" "github.com/google/blueprint" @@ -62,6 +63,9 @@ type aaptProperties struct { // Set to [] to disable the default. Resource_dirs []string + // list of zip files containing Android resources. + Resource_zips []string + // path to AndroidManifest.xml. If unset, defaults to "AndroidManifest.xml". Manifest *string } @@ -95,7 +99,7 @@ func (a *aapt) ExportedManifest() android.Path { } func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext sdkContext, manifestPath android.Path) (flags []string, - deps android.Paths, resDirs, overlayDirs []globbedResourceDir, rroDirs android.Paths) { + deps android.Paths, resDirs, overlayDirs []globbedResourceDir, rroDirs, resZips android.Paths) { hasVersionCode := false hasVersionName := false @@ -117,6 +121,7 @@ func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext sdkContext, mani // Find implicit or explicit asset and resource dirs assetDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets") resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res") + resourceZips := ctx.ExpandSources(a.aaptProperties.Resource_zips, nil) var linkDeps android.Paths @@ -167,7 +172,7 @@ func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext sdkContext, mani linkFlags = append(linkFlags, "--version-name ", versionName) } - return linkFlags, linkDeps, resDirs, overlayDirs, rroDirs + return linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resourceZips } func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkContext sdkContext) { @@ -175,6 +180,8 @@ func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkContext sdkContext) { if sdkDep.frameworkResModule != "" { ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule) } + + android.ExtractSourcesDeps(ctx, a.aaptProperties.Resource_zips) } func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, extraLinkFlags ...string) { @@ -187,7 +194,7 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, ex manifestPath := manifestMerger(ctx, manifestSrcPath, sdkContext, staticLibManifests, a.isLibrary, a.uncompressedJNI, a.useEmbeddedDex, a.usesNonSdkApis) - linkFlags, linkDeps, resDirs, overlayDirs, rroDirs := a.aapt2Flags(ctx, sdkContext, manifestPath) + linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, sdkContext, manifestPath) rroDirs = append(rroDirs, staticRRODirs...) linkFlags = append(linkFlags, libFlags...) @@ -209,6 +216,12 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, ex compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files).Paths()) } + for i, zip := range resZips { + flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i)) + aapt2CompileZip(ctx, flata, zip) + compiledResDirs = append(compiledResDirs, android.Paths{flata}) + } + var compiledRes, compiledOverlay android.Paths compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)