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