xref: /aosp_15_r20/build/soong/java/rro.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Worker// This file contains the module implementations for runtime_resource_overlay and
18*333d2b36SAndroid Build Coastguard Worker// override_runtime_resource_overlay.
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Workerimport (
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workerfunc init() {
28*333d2b36SAndroid Build Coastguard Worker	RegisterRuntimeResourceOverlayBuildComponents(android.InitRegistrationContext)
29*333d2b36SAndroid Build Coastguard Worker}
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerfunc RegisterRuntimeResourceOverlayBuildComponents(ctx android.RegistrationContext) {
32*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("runtime_resource_overlay", RuntimeResourceOverlayFactory)
33*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("autogen_runtime_resource_overlay", AutogenRuntimeResourceOverlayFactory)
34*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("override_runtime_resource_overlay", OverrideRuntimeResourceOverlayModuleFactory)
35*333d2b36SAndroid Build Coastguard Worker}
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Workertype RuntimeResourceOverlay struct {
38*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
39*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
40*333d2b36SAndroid Build Coastguard Worker	android.OverridableModuleBase
41*333d2b36SAndroid Build Coastguard Worker	aapt
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker	properties            RuntimeResourceOverlayProperties
44*333d2b36SAndroid Build Coastguard Worker	overridableProperties OverridableRuntimeResourceOverlayProperties
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	certificate Certificate
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	outputFile android.Path
49*333d2b36SAndroid Build Coastguard Worker	installDir android.InstallPath
50*333d2b36SAndroid Build Coastguard Worker}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Workertype RuntimeResourceOverlayProperties struct {
53*333d2b36SAndroid Build Coastguard Worker	// the name of a certificate in the default certificate directory or an android_app_certificate
54*333d2b36SAndroid Build Coastguard Worker	// module name in the form ":module".
55*333d2b36SAndroid Build Coastguard Worker	Certificate proptools.Configurable[string] `android:"replace_instead_of_append"`
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	// Name of the signing certificate lineage file.
58*333d2b36SAndroid Build Coastguard Worker	Lineage *string
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker	// For overriding the --rotation-min-sdk-version property of apksig
61*333d2b36SAndroid Build Coastguard Worker	RotationMinSdkVersion *string
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Worker	// optional theme name. If specified, the overlay package will be applied
64*333d2b36SAndroid Build Coastguard Worker	// only when the ro.boot.vendor.overlay.theme system property is set to the same value.
65*333d2b36SAndroid Build Coastguard Worker	Theme *string
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker	// If not blank, set to the version of the sdk to compile against. This
68*333d2b36SAndroid Build Coastguard Worker	// can be either an API version (e.g. "29" for API level 29 AKA Android 10)
69*333d2b36SAndroid Build Coastguard Worker	// or special subsets of the current platform, for example "none", "current",
70*333d2b36SAndroid Build Coastguard Worker	// "core", "system", "test". See build/soong/java/sdk.go for the full and
71*333d2b36SAndroid Build Coastguard Worker	// up-to-date list of possible values.
72*333d2b36SAndroid Build Coastguard Worker	// Defaults to compiling against the current platform.
73*333d2b36SAndroid Build Coastguard Worker	Sdk_version *string
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker	// if not blank, set the minimum version of the sdk that the compiled artifacts will run against.
76*333d2b36SAndroid Build Coastguard Worker	// Defaults to sdk_version if not set.
77*333d2b36SAndroid Build Coastguard Worker	Min_sdk_version *string
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	// list of android_library modules whose resources are extracted and linked against statically
80*333d2b36SAndroid Build Coastguard Worker	Static_libs proptools.Configurable[[]string]
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Worker	// list of android_app modules whose resources are extracted and linked against
83*333d2b36SAndroid Build Coastguard Worker	Resource_libs []string
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker	// Names of modules to be overridden. Listed modules can only be other overlays
86*333d2b36SAndroid Build Coastguard Worker	// (in Make or Soong).
87*333d2b36SAndroid Build Coastguard Worker	// This does not completely prevent installation of the overridden overlays, but if both
88*333d2b36SAndroid Build Coastguard Worker	// overlays would be installed by default (in PRODUCT_PACKAGES) the other overlay will be removed
89*333d2b36SAndroid Build Coastguard Worker	// from PRODUCT_PACKAGES.
90*333d2b36SAndroid Build Coastguard Worker	Overrides []string
91*333d2b36SAndroid Build Coastguard Worker}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker// RuntimeResourceOverlayModule interface is used by the apex package to gather information from
94*333d2b36SAndroid Build Coastguard Worker// a RuntimeResourceOverlay module.
95*333d2b36SAndroid Build Coastguard Workertype RuntimeResourceOverlayModule interface {
96*333d2b36SAndroid Build Coastguard Worker	android.Module
97*333d2b36SAndroid Build Coastguard Worker	OutputFile() android.Path
98*333d2b36SAndroid Build Coastguard Worker	Certificate() Certificate
99*333d2b36SAndroid Build Coastguard Worker	Theme() string
100*333d2b36SAndroid Build Coastguard Worker}
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker// RRO's partition logic is different from the partition logic of other modules defined in soong/android/paths.go
103*333d2b36SAndroid Build Coastguard Worker// The default partition for RRO is "/product" and not "/system"
104*333d2b36SAndroid Build Coastguard Workerfunc rroPartition(ctx android.ModuleContext) string {
105*333d2b36SAndroid Build Coastguard Worker	var partition string
106*333d2b36SAndroid Build Coastguard Worker	if ctx.DeviceSpecific() {
107*333d2b36SAndroid Build Coastguard Worker		partition = ctx.DeviceConfig().OdmPath()
108*333d2b36SAndroid Build Coastguard Worker	} else if ctx.SocSpecific() {
109*333d2b36SAndroid Build Coastguard Worker		partition = ctx.DeviceConfig().VendorPath()
110*333d2b36SAndroid Build Coastguard Worker	} else if ctx.SystemExtSpecific() {
111*333d2b36SAndroid Build Coastguard Worker		partition = ctx.DeviceConfig().SystemExtPath()
112*333d2b36SAndroid Build Coastguard Worker	} else {
113*333d2b36SAndroid Build Coastguard Worker		partition = ctx.DeviceConfig().ProductPath()
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker	return partition
116*333d2b36SAndroid Build Coastguard Worker}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) DepsMutator(ctx android.BottomUpMutatorContext) {
119*333d2b36SAndroid Build Coastguard Worker	sdkDep := decodeSdkDep(ctx, android.SdkContext(r))
120*333d2b36SAndroid Build Coastguard Worker	if sdkDep.hasFrameworkLibs() {
121*333d2b36SAndroid Build Coastguard Worker		r.aapt.deps(ctx, sdkDep)
122*333d2b36SAndroid Build Coastguard Worker	}
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Worker	cert := android.SrcIsModule(r.properties.Certificate.GetOrDefault(ctx, ""))
125*333d2b36SAndroid Build Coastguard Worker	if cert != "" {
126*333d2b36SAndroid Build Coastguard Worker		ctx.AddDependency(ctx.Module(), certificateTag, cert)
127*333d2b36SAndroid Build Coastguard Worker	}
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, staticLibTag, r.properties.Static_libs.GetOrDefault(ctx, nil)...)
130*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, libTag, r.properties.Resource_libs...)
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker	for _, aconfig_declaration := range r.aaptProperties.Flags_packages {
133*333d2b36SAndroid Build Coastguard Worker		ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfig_declaration)
134*333d2b36SAndroid Build Coastguard Worker	}
135*333d2b36SAndroid Build Coastguard Worker}
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleContext) {
138*333d2b36SAndroid Build Coastguard Worker	// Compile and link resources
139*333d2b36SAndroid Build Coastguard Worker	r.aapt.hasNoCode = true
140*333d2b36SAndroid Build Coastguard Worker	// Do not remove resources without default values nor dedupe resource configurations with the same value
141*333d2b36SAndroid Build Coastguard Worker	aaptLinkFlags := []string{"--no-resource-deduping", "--no-resource-removal"}
142*333d2b36SAndroid Build Coastguard Worker	// Allow the override of "package name" and "overlay target package name"
143*333d2b36SAndroid Build Coastguard Worker	manifestPackageName, overridden := ctx.DeviceConfig().OverrideManifestPackageNameFor(ctx.ModuleName())
144*333d2b36SAndroid Build Coastguard Worker	if overridden || r.overridableProperties.Package_name != nil {
145*333d2b36SAndroid Build Coastguard Worker		// The product override variable has a priority over the package_name property.
146*333d2b36SAndroid Build Coastguard Worker		if !overridden {
147*333d2b36SAndroid Build Coastguard Worker			manifestPackageName = *r.overridableProperties.Package_name
148*333d2b36SAndroid Build Coastguard Worker		}
149*333d2b36SAndroid Build Coastguard Worker		aaptLinkFlags = append(aaptLinkFlags, generateAaptRenamePackageFlags(manifestPackageName, false)...)
150*333d2b36SAndroid Build Coastguard Worker	}
151*333d2b36SAndroid Build Coastguard Worker	if r.overridableProperties.Target_package_name != nil {
152*333d2b36SAndroid Build Coastguard Worker		aaptLinkFlags = append(aaptLinkFlags,
153*333d2b36SAndroid Build Coastguard Worker			"--rename-overlay-target-package "+*r.overridableProperties.Target_package_name)
154*333d2b36SAndroid Build Coastguard Worker	}
155*333d2b36SAndroid Build Coastguard Worker	if r.overridableProperties.Category != nil {
156*333d2b36SAndroid Build Coastguard Worker		aaptLinkFlags = append(aaptLinkFlags,
157*333d2b36SAndroid Build Coastguard Worker			"--rename-overlay-category "+*r.overridableProperties.Category)
158*333d2b36SAndroid Build Coastguard Worker	}
159*333d2b36SAndroid Build Coastguard Worker	aconfigTextFilePaths := getAconfigFilePaths(ctx)
160*333d2b36SAndroid Build Coastguard Worker	r.aapt.buildActions(ctx,
161*333d2b36SAndroid Build Coastguard Worker		aaptBuildActionOptions{
162*333d2b36SAndroid Build Coastguard Worker			sdkContext:                     r,
163*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: false,
164*333d2b36SAndroid Build Coastguard Worker			extraLinkFlags:                 aaptLinkFlags,
165*333d2b36SAndroid Build Coastguard Worker			aconfigTextFiles:               aconfigTextFilePaths,
166*333d2b36SAndroid Build Coastguard Worker		},
167*333d2b36SAndroid Build Coastguard Worker	)
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	// Sign the built package
170*333d2b36SAndroid Build Coastguard Worker	_, _, certificates := collectAppDeps(ctx, r, false, false)
171*333d2b36SAndroid Build Coastguard Worker	r.certificate, certificates = processMainCert(r.ModuleBase, r.properties.Certificate.GetOrDefault(ctx, ""), certificates, ctx)
172*333d2b36SAndroid Build Coastguard Worker	signed := android.PathForModuleOut(ctx, "signed", r.Name()+".apk")
173*333d2b36SAndroid Build Coastguard Worker	var lineageFile android.Path
174*333d2b36SAndroid Build Coastguard Worker	if lineage := String(r.properties.Lineage); lineage != "" {
175*333d2b36SAndroid Build Coastguard Worker		lineageFile = android.PathForModuleSrc(ctx, lineage)
176*333d2b36SAndroid Build Coastguard Worker	}
177*333d2b36SAndroid Build Coastguard Worker
178*333d2b36SAndroid Build Coastguard Worker	rotationMinSdkVersion := String(r.properties.RotationMinSdkVersion)
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Worker	SignAppPackage(ctx, signed, r.aapt.exportPackage, certificates, nil, lineageFile, rotationMinSdkVersion)
181*333d2b36SAndroid Build Coastguard Worker
182*333d2b36SAndroid Build Coastguard Worker	r.outputFile = signed
183*333d2b36SAndroid Build Coastguard Worker	partition := rroPartition(ctx)
184*333d2b36SAndroid Build Coastguard Worker	r.installDir = android.PathForModuleInPartitionInstall(ctx, partition, "overlay", String(r.properties.Theme))
185*333d2b36SAndroid Build Coastguard Worker	ctx.InstallFile(r.installDir, r.outputFile.Base(), r.outputFile)
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{
188*333d2b36SAndroid Build Coastguard Worker		AconfigTextFiles: aconfigTextFilePaths,
189*333d2b36SAndroid Build Coastguard Worker	})
190*333d2b36SAndroid Build Coastguard Worker}
191*333d2b36SAndroid Build Coastguard Worker
192*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
193*333d2b36SAndroid Build Coastguard Worker	return android.SdkSpecFrom(ctx, String(r.properties.Sdk_version))
194*333d2b36SAndroid Build Coastguard Worker}
195*333d2b36SAndroid Build Coastguard Worker
196*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) SystemModules() string {
197*333d2b36SAndroid Build Coastguard Worker	return ""
198*333d2b36SAndroid Build Coastguard Worker}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
201*333d2b36SAndroid Build Coastguard Worker	if r.properties.Min_sdk_version != nil {
202*333d2b36SAndroid Build Coastguard Worker		return android.ApiLevelFrom(ctx, *r.properties.Min_sdk_version)
203*333d2b36SAndroid Build Coastguard Worker	}
204*333d2b36SAndroid Build Coastguard Worker	return r.SdkVersion(ctx).ApiLevel
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
208*333d2b36SAndroid Build Coastguard Worker	return android.SdkSpecPrivate.ApiLevel
209*333d2b36SAndroid Build Coastguard Worker}
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
212*333d2b36SAndroid Build Coastguard Worker	return r.SdkVersion(ctx).ApiLevel
213*333d2b36SAndroid Build Coastguard Worker}
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) Certificate() Certificate {
216*333d2b36SAndroid Build Coastguard Worker	return r.certificate
217*333d2b36SAndroid Build Coastguard Worker}
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) OutputFile() android.Path {
220*333d2b36SAndroid Build Coastguard Worker	return r.outputFile
221*333d2b36SAndroid Build Coastguard Worker}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Workerfunc (r *RuntimeResourceOverlay) Theme() string {
224*333d2b36SAndroid Build Coastguard Worker	return String(r.properties.Theme)
225*333d2b36SAndroid Build Coastguard Worker}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker// runtime_resource_overlay generates a resource-only apk file that can overlay application and
228*333d2b36SAndroid Build Coastguard Worker// system resources at run time.
229*333d2b36SAndroid Build Coastguard Workerfunc RuntimeResourceOverlayFactory() android.Module {
230*333d2b36SAndroid Build Coastguard Worker	module := &RuntimeResourceOverlay{}
231*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
232*333d2b36SAndroid Build Coastguard Worker		&module.properties,
233*333d2b36SAndroid Build Coastguard Worker		&module.aaptProperties,
234*333d2b36SAndroid Build Coastguard Worker		&module.overridableProperties)
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon)
237*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
238*333d2b36SAndroid Build Coastguard Worker	android.InitOverridableModule(module, &module.properties.Overrides)
239*333d2b36SAndroid Build Coastguard Worker	return module
240*333d2b36SAndroid Build Coastguard Worker}
241*333d2b36SAndroid Build Coastguard Worker
242*333d2b36SAndroid Build Coastguard Worker// runtime_resource_overlay properties that can be overridden by override_runtime_resource_overlay
243*333d2b36SAndroid Build Coastguard Workertype OverridableRuntimeResourceOverlayProperties struct {
244*333d2b36SAndroid Build Coastguard Worker	// the package name of this app. The package name in the manifest file is used if one was not given.
245*333d2b36SAndroid Build Coastguard Worker	Package_name *string
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Worker	// the target package name of this overlay app. The target package name in the manifest file is used if one was not given.
248*333d2b36SAndroid Build Coastguard Worker	Target_package_name *string
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker	// the rro category of this overlay. The category in the manifest file is used if one was not given.
251*333d2b36SAndroid Build Coastguard Worker	Category *string
252*333d2b36SAndroid Build Coastguard Worker}
253*333d2b36SAndroid Build Coastguard Worker
254*333d2b36SAndroid Build Coastguard Workertype OverrideRuntimeResourceOverlay struct {
255*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
256*333d2b36SAndroid Build Coastguard Worker	android.OverrideModuleBase
257*333d2b36SAndroid Build Coastguard Worker}
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Workerfunc (i *OverrideRuntimeResourceOverlay) GenerateAndroidBuildActions(_ android.ModuleContext) {
260*333d2b36SAndroid Build Coastguard Worker	// All the overrides happen in the base module.
261*333d2b36SAndroid Build Coastguard Worker	// TODO(jungjw): Check the base module type.
262*333d2b36SAndroid Build Coastguard Worker}
263*333d2b36SAndroid Build Coastguard Worker
264*333d2b36SAndroid Build Coastguard Worker// override_runtime_resource_overlay is used to create a module based on another
265*333d2b36SAndroid Build Coastguard Worker// runtime_resource_overlay module by overriding some of its properties.
266*333d2b36SAndroid Build Coastguard Workerfunc OverrideRuntimeResourceOverlayModuleFactory() android.Module {
267*333d2b36SAndroid Build Coastguard Worker	m := &OverrideRuntimeResourceOverlay{}
268*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&OverridableRuntimeResourceOverlayProperties{})
269*333d2b36SAndroid Build Coastguard Worker
270*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidMultiTargetsArchModule(m, android.DeviceSupported, android.MultilibCommon)
271*333d2b36SAndroid Build Coastguard Worker	android.InitOverrideModule(m)
272*333d2b36SAndroid Build Coastguard Worker	return m
273*333d2b36SAndroid Build Coastguard Worker}
274*333d2b36SAndroid Build Coastguard Worker
275*333d2b36SAndroid Build Coastguard Workervar (
276*333d2b36SAndroid Build Coastguard Worker	generateOverlayManifestFile = pctx.AndroidStaticRule("generate_overlay_manifest",
277*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
278*333d2b36SAndroid Build Coastguard Worker			Command: "build/make/tools/generate-enforce-rro-android-manifest.py " +
279*333d2b36SAndroid Build Coastguard Worker				"--package-info $in " +
280*333d2b36SAndroid Build Coastguard Worker				"--partition ${partition} " +
281*333d2b36SAndroid Build Coastguard Worker				"--priority ${priority} -o $out",
282*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"build/make/tools/generate-enforce-rro-android-manifest.py"},
283*333d2b36SAndroid Build Coastguard Worker		}, "partition", "priority",
284*333d2b36SAndroid Build Coastguard Worker	)
285*333d2b36SAndroid Build Coastguard Worker)
286*333d2b36SAndroid Build Coastguard Worker
287*333d2b36SAndroid Build Coastguard Workertype AutogenRuntimeResourceOverlay struct {
288*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
289*333d2b36SAndroid Build Coastguard Worker	aapt
290*333d2b36SAndroid Build Coastguard Worker
291*333d2b36SAndroid Build Coastguard Worker	properties AutogenRuntimeResourceOverlayProperties
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Worker	certificate Certificate
294*333d2b36SAndroid Build Coastguard Worker	outputFile  android.Path
295*333d2b36SAndroid Build Coastguard Worker}
296*333d2b36SAndroid Build Coastguard Worker
297*333d2b36SAndroid Build Coastguard Workertype AutogenRuntimeResourceOverlayProperties struct {
298*333d2b36SAndroid Build Coastguard Worker	Base        *string
299*333d2b36SAndroid Build Coastguard Worker	Sdk_version *string
300*333d2b36SAndroid Build Coastguard Worker	Manifest    *string `android:"path"`
301*333d2b36SAndroid Build Coastguard Worker}
302*333d2b36SAndroid Build Coastguard Worker
303*333d2b36SAndroid Build Coastguard Workerfunc AutogenRuntimeResourceOverlayFactory() android.Module {
304*333d2b36SAndroid Build Coastguard Worker	m := &AutogenRuntimeResourceOverlay{}
305*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
306*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Worker	return m
309*333d2b36SAndroid Build Coastguard Worker}
310*333d2b36SAndroid Build Coastguard Worker
311*333d2b36SAndroid Build Coastguard Workertype rroDependencyTag struct {
312*333d2b36SAndroid Build Coastguard Worker	blueprint.DependencyTag
313*333d2b36SAndroid Build Coastguard Worker}
314*333d2b36SAndroid Build Coastguard Worker
315*333d2b36SAndroid Build Coastguard Worker// Autogenerated RROs should always depend on the source android_app that created it.
316*333d2b36SAndroid Build Coastguard Workerfunc (tag rroDependencyTag) ReplaceSourceWithPrebuilt() bool {
317*333d2b36SAndroid Build Coastguard Worker	return false
318*333d2b36SAndroid Build Coastguard Worker}
319*333d2b36SAndroid Build Coastguard Worker
320*333d2b36SAndroid Build Coastguard Workervar rroDepTag = rroDependencyTag{}
321*333d2b36SAndroid Build Coastguard Worker
322*333d2b36SAndroid Build Coastguard Workerfunc (a *AutogenRuntimeResourceOverlay) DepsMutator(ctx android.BottomUpMutatorContext) {
323*333d2b36SAndroid Build Coastguard Worker	sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
324*333d2b36SAndroid Build Coastguard Worker	if sdkDep.hasFrameworkLibs() {
325*333d2b36SAndroid Build Coastguard Worker		a.aapt.deps(ctx, sdkDep)
326*333d2b36SAndroid Build Coastguard Worker	}
327*333d2b36SAndroid Build Coastguard Worker	ctx.AddDependency(ctx.Module(), rroDepTag, proptools.String(a.properties.Base))
328*333d2b36SAndroid Build Coastguard Worker}
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Workerfunc (a *AutogenRuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleContext) {
331*333d2b36SAndroid Build Coastguard Worker	if !a.Enabled(ctx) {
332*333d2b36SAndroid Build Coastguard Worker		return
333*333d2b36SAndroid Build Coastguard Worker	}
334*333d2b36SAndroid Build Coastguard Worker	var rroDirs android.Paths
335*333d2b36SAndroid Build Coastguard Worker	// Get rro dirs of the base app
336*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(rroDepTag, func(m android.Module) {
337*333d2b36SAndroid Build Coastguard Worker		aarDep, _ := m.(AndroidLibraryDependency)
338*333d2b36SAndroid Build Coastguard Worker		if ctx.InstallInProduct() {
339*333d2b36SAndroid Build Coastguard Worker			rroDirs = filterRRO(aarDep.RRODirsDepSet(), product)
340*333d2b36SAndroid Build Coastguard Worker		} else {
341*333d2b36SAndroid Build Coastguard Worker			rroDirs = filterRRO(aarDep.RRODirsDepSet(), device)
342*333d2b36SAndroid Build Coastguard Worker		}
343*333d2b36SAndroid Build Coastguard Worker	})
344*333d2b36SAndroid Build Coastguard Worker
345*333d2b36SAndroid Build Coastguard Worker	if len(rroDirs) == 0 {
346*333d2b36SAndroid Build Coastguard Worker		return
347*333d2b36SAndroid Build Coastguard Worker	}
348*333d2b36SAndroid Build Coastguard Worker
349*333d2b36SAndroid Build Coastguard Worker	// Generate a manifest file
350*333d2b36SAndroid Build Coastguard Worker	genManifest := android.PathForModuleGen(ctx, "AndroidManifest.xml")
351*333d2b36SAndroid Build Coastguard Worker	partition := "vendor"
352*333d2b36SAndroid Build Coastguard Worker	priority := "0"
353*333d2b36SAndroid Build Coastguard Worker	if ctx.InstallInProduct() {
354*333d2b36SAndroid Build Coastguard Worker		partition = "product"
355*333d2b36SAndroid Build Coastguard Worker		priority = "1"
356*333d2b36SAndroid Build Coastguard Worker	}
357*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
358*333d2b36SAndroid Build Coastguard Worker		Rule:   generateOverlayManifestFile,
359*333d2b36SAndroid Build Coastguard Worker		Input:  android.PathForModuleSrc(ctx, proptools.String(a.properties.Manifest)),
360*333d2b36SAndroid Build Coastguard Worker		Output: genManifest,
361*333d2b36SAndroid Build Coastguard Worker		Args: map[string]string{
362*333d2b36SAndroid Build Coastguard Worker			"partition": partition,
363*333d2b36SAndroid Build Coastguard Worker			"priority":  priority,
364*333d2b36SAndroid Build Coastguard Worker		},
365*333d2b36SAndroid Build Coastguard Worker	})
366*333d2b36SAndroid Build Coastguard Worker
367*333d2b36SAndroid Build Coastguard Worker	// Compile and link resources into package-res.apk
368*333d2b36SAndroid Build Coastguard Worker	a.aapt.hasNoCode = true
369*333d2b36SAndroid Build Coastguard Worker	aaptLinkFlags := []string{"--auto-add-overlay", "--keep-raw-values", "--no-resource-deduping", "--no-resource-removal"}
370*333d2b36SAndroid Build Coastguard Worker
371*333d2b36SAndroid Build Coastguard Worker	a.aapt.buildActions(ctx,
372*333d2b36SAndroid Build Coastguard Worker		aaptBuildActionOptions{
373*333d2b36SAndroid Build Coastguard Worker			sdkContext:      a,
374*333d2b36SAndroid Build Coastguard Worker			extraLinkFlags:  aaptLinkFlags,
375*333d2b36SAndroid Build Coastguard Worker			rroDirs:         &rroDirs,
376*333d2b36SAndroid Build Coastguard Worker			manifestForAapt: genManifest,
377*333d2b36SAndroid Build Coastguard Worker		},
378*333d2b36SAndroid Build Coastguard Worker	)
379*333d2b36SAndroid Build Coastguard Worker
380*333d2b36SAndroid Build Coastguard Worker	if a.exportPackage == nil {
381*333d2b36SAndroid Build Coastguard Worker		return
382*333d2b36SAndroid Build Coastguard Worker	}
383*333d2b36SAndroid Build Coastguard Worker	// Sign the built package
384*333d2b36SAndroid Build Coastguard Worker	var certificates []Certificate
385*333d2b36SAndroid Build Coastguard Worker	a.certificate, certificates = processMainCert(a.ModuleBase, "", nil, ctx)
386*333d2b36SAndroid Build Coastguard Worker	signed := android.PathForModuleOut(ctx, "signed", a.Name()+".apk")
387*333d2b36SAndroid Build Coastguard Worker	SignAppPackage(ctx, signed, a.exportPackage, certificates, nil, nil, "")
388*333d2b36SAndroid Build Coastguard Worker	a.outputFile = signed
389*333d2b36SAndroid Build Coastguard Worker
390*333d2b36SAndroid Build Coastguard Worker	// Install the signed apk
391*333d2b36SAndroid Build Coastguard Worker	installDir := android.PathForModuleInstall(ctx, "overlay")
392*333d2b36SAndroid Build Coastguard Worker	ctx.InstallFile(installDir, signed.Base(), signed)
393*333d2b36SAndroid Build Coastguard Worker}
394*333d2b36SAndroid Build Coastguard Worker
395*333d2b36SAndroid Build Coastguard Workerfunc (a *AutogenRuntimeResourceOverlay) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
396*333d2b36SAndroid Build Coastguard Worker	return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
397*333d2b36SAndroid Build Coastguard Worker}
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Workerfunc (a *AutogenRuntimeResourceOverlay) SystemModules() string {
400*333d2b36SAndroid Build Coastguard Worker	return ""
401*333d2b36SAndroid Build Coastguard Worker}
402*333d2b36SAndroid Build Coastguard Worker
403*333d2b36SAndroid Build Coastguard Workerfunc (a *AutogenRuntimeResourceOverlay) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
404*333d2b36SAndroid Build Coastguard Worker	return a.SdkVersion(ctx).ApiLevel
405*333d2b36SAndroid Build Coastguard Worker}
406*333d2b36SAndroid Build Coastguard Worker
407*333d2b36SAndroid Build Coastguard Workerfunc (r *AutogenRuntimeResourceOverlay) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
408*333d2b36SAndroid Build Coastguard Worker	return android.SdkSpecPrivate.ApiLevel
409*333d2b36SAndroid Build Coastguard Worker}
410*333d2b36SAndroid Build Coastguard Worker
411*333d2b36SAndroid Build Coastguard Workerfunc (a *AutogenRuntimeResourceOverlay) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
412*333d2b36SAndroid Build Coastguard Worker	return a.SdkVersion(ctx).ApiLevel
413*333d2b36SAndroid Build Coastguard Worker}
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Workerfunc (a *AutogenRuntimeResourceOverlay) InstallInProduct() bool {
416*333d2b36SAndroid Build Coastguard Worker	return a.ProductSpecific()
417*333d2b36SAndroid Build Coastguard Worker}
418