Add support for auto-generated characteristics RRO

Setting Generate_product_characteristics_rro will automatically generate
an RRO package which contains resources with
'product="{PRODUCT_CHARACTERISTICS}"'. The RRO package will be installed
to /product partition. The app will be compiled with '--product
default', making the app identical to all targets.

Motivation for this change is to minimize divergence of system.img.

Bug: 294799593
Test: boot and idmap2 dump
Change-Id: I1371f7410a1ecf337e1f73214b024af39aa6d57a
This commit is contained in:
Inseob Kim
2023-11-07 13:37:14 +09:00
parent 5876a78543
commit 34dc4cd738
4 changed files with 111 additions and 7 deletions

View File

@@ -130,6 +130,16 @@ type appProperties struct {
// Specifies the file that contains the allowlist for this app.
Privapp_allowlist *string `android:"path"`
// If set, create an RRO package which contains only resources having PRODUCT_CHARACTERISTICS
// and install the RRO package to /product partition, instead of passing --product argument
// to aapt2. Default is false.
// Setting this will make this APK identical to all targets, regardless of
// PRODUCT_CHARACTERISTICS.
Generate_product_characteristics_rro *bool
ProductCharacteristicsRROPackageName *string `blueprint:"mutated"`
ProductCharacteristicsRROManifestModuleName *string `blueprint:"mutated"`
}
// android_app properties that can be overridden by override_android_app
@@ -454,8 +464,9 @@ func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) {
aaptLinkFlags := []string{}
// Add TARGET_AAPT_CHARACTERISTICS values to AAPT link flags if they exist and --product flags were not provided.
autogenerateRRO := proptools.Bool(a.appProperties.Generate_product_characteristics_rro)
hasProduct := android.PrefixInList(a.aaptProperties.Aaptflags, "--product")
if !hasProduct && len(ctx.Config().ProductAAPTCharacteristics()) > 0 {
if !autogenerateRRO && !hasProduct && len(ctx.Config().ProductAAPTCharacteristics()) > 0 {
aaptLinkFlags = append(aaptLinkFlags, "--product", ctx.Config().ProductAAPTCharacteristics())
}
@@ -1056,6 +1067,8 @@ func (a *AndroidApp) OutputFiles(tag string) (android.Paths, error) {
}
case ".export-package.apk":
return []android.Path{a.exportPackage}, nil
case ".manifest.xml":
return []android.Path{a.aapt.manifestPath}, nil
}
return a.Library.OutputFiles(tag)
}
@@ -1085,6 +1098,14 @@ func (a *AndroidApp) IDEInfo(dpInfo *android.IdeInfo) {
a.aapt.IDEInfo(dpInfo)
}
func (a *AndroidApp) productCharacteristicsRROPackageName() string {
return proptools.String(a.appProperties.ProductCharacteristicsRROPackageName)
}
func (a *AndroidApp) productCharacteristicsRROManifestModuleName() string {
return proptools.String(a.appProperties.ProductCharacteristicsRROManifestModuleName)
}
// android_app compiles sources and Android resources into an Android application package `.apk` file.
func AndroidAppFactory() android.Module {
module := &AndroidApp{}
@@ -1111,6 +1132,57 @@ func AndroidAppFactory() android.Module {
android.InitApexModule(module)
android.InitBazelModule(module)
android.AddLoadHook(module, func(ctx android.LoadHookContext) {
a := ctx.Module().(*AndroidApp)
characteristics := ctx.Config().ProductAAPTCharacteristics()
if characteristics == "default" || characteristics == "" {
module.appProperties.Generate_product_characteristics_rro = nil
// no need to create RRO
return
}
if !proptools.Bool(module.appProperties.Generate_product_characteristics_rro) {
return
}
rroPackageName := a.Name() + "__" + strings.ReplaceAll(characteristics, ",", "_") + "__auto_generated_characteristics_rro"
rroManifestName := rroPackageName + "_manifest"
a.appProperties.ProductCharacteristicsRROPackageName = proptools.StringPtr(rroPackageName)
a.appProperties.ProductCharacteristicsRROManifestModuleName = proptools.StringPtr(rroManifestName)
rroManifestProperties := struct {
Name *string
Tools []string
Out []string
Srcs []string
Cmd *string
}{
Name: proptools.StringPtr(rroManifestName),
Tools: []string{"characteristics_rro_generator"},
Out: []string{"AndroidManifest.xml"},
Srcs: []string{":" + a.Name() + "{.manifest.xml}"},
Cmd: proptools.StringPtr("$(location characteristics_rro_generator) $(in) $(out)"),
}
ctx.CreateModule(genrule.GenRuleFactory, &rroManifestProperties)
rroProperties := struct {
Name *string
Filter_product *string
Aaptflags []string
Manifest *string
Resource_dirs []string
}{
Name: proptools.StringPtr(rroPackageName),
Filter_product: proptools.StringPtr(characteristics),
Aaptflags: []string{"--auto-add-overlay"},
Manifest: proptools.StringPtr(":" + rroManifestName),
Resource_dirs: a.aaptProperties.Resource_dirs,
}
ctx.CreateModule(RuntimeResourceOverlayFactory, &rroProperties)
})
return module
}