1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2019 The Android Open Source Project 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 apex 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "strconv" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 23*333d2b36SAndroid Build Coastguard Worker "android/soong/java" 24*333d2b36SAndroid Build Coastguard Worker "android/soong/provenance" 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 27*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 28*333d2b36SAndroid Build Coastguard Worker) 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workervar ( 31*333d2b36SAndroid Build Coastguard Worker extractMatchingApex = pctx.StaticRule( 32*333d2b36SAndroid Build Coastguard Worker "extractMatchingApex", 33*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 34*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf "$out" && ` + 35*333d2b36SAndroid Build Coastguard Worker `${extract_apks} -o "${out}" -allow-prereleased=${allow-prereleased} ` + 36*333d2b36SAndroid Build Coastguard Worker `-sdk-version=${sdk-version} -skip-sdk-check=${skip-sdk-check} -abis=${abis} ` + 37*333d2b36SAndroid Build Coastguard Worker `-screen-densities=all -extract-single ` + 38*333d2b36SAndroid Build Coastguard Worker `${in}`, 39*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${extract_apks}"}, 40*333d2b36SAndroid Build Coastguard Worker }, 41*333d2b36SAndroid Build Coastguard Worker "abis", "allow-prereleased", "sdk-version", "skip-sdk-check") 42*333d2b36SAndroid Build Coastguard Worker decompressApex = pctx.StaticRule("decompressApex", blueprint.RuleParams{ 43*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf $out && ${deapexer} decompress --copy-if-uncompressed --input ${in} --output ${out}`, 44*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${deapexer}"}, 45*333d2b36SAndroid Build Coastguard Worker Description: "decompress $out", 46*333d2b36SAndroid Build Coastguard Worker }) 47*333d2b36SAndroid Build Coastguard Worker) 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workertype prebuilt interface { 50*333d2b36SAndroid Build Coastguard Worker isForceDisabled() bool 51*333d2b36SAndroid Build Coastguard Worker InstallFilename() string 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workertype prebuiltCommon struct { 55*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 56*333d2b36SAndroid Build Coastguard Worker java.Dexpreopter 57*333d2b36SAndroid Build Coastguard Worker prebuilt android.Prebuilt 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker // Properties common to both prebuilt_apex and apex_set. 60*333d2b36SAndroid Build Coastguard Worker prebuiltCommonProperties *PrebuiltCommonProperties 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker installDir android.InstallPath 63*333d2b36SAndroid Build Coastguard Worker installFilename string 64*333d2b36SAndroid Build Coastguard Worker installedFile android.InstallPath 65*333d2b36SAndroid Build Coastguard Worker outputApex android.WritablePath 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker // fragment for this apex for apexkeys.txt 68*333d2b36SAndroid Build Coastguard Worker apexKeysPath android.WritablePath 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker // Installed locations of symlinks for backward compatibility. 71*333d2b36SAndroid Build Coastguard Worker compatSymlinks android.InstallPaths 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker hostRequired []string 74*333d2b36SAndroid Build Coastguard Worker requiredModuleNames []string 75*333d2b36SAndroid Build Coastguard Worker} 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Workertype sanitizedPrebuilt interface { 78*333d2b36SAndroid Build Coastguard Worker hasSanitizedSource(sanitizer string) bool 79*333d2b36SAndroid Build Coastguard Worker} 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Workertype PrebuiltCommonProperties struct { 82*333d2b36SAndroid Build Coastguard Worker SelectedApexProperties 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker // Canonical name of this APEX. Used to determine the path to the activated APEX on 85*333d2b36SAndroid Build Coastguard Worker // device (/apex/<apex_name>). If unspecified, follows the name property. 86*333d2b36SAndroid Build Coastguard Worker Apex_name *string 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker // Name of the source APEX that gets shadowed by this prebuilt 89*333d2b36SAndroid Build Coastguard Worker // e.g. com.mycompany.android.myapex 90*333d2b36SAndroid Build Coastguard Worker // If unspecified, follows the naming convention that the source apex of 91*333d2b36SAndroid Build Coastguard Worker // the prebuilt is Name() without "prebuilt_" prefix 92*333d2b36SAndroid Build Coastguard Worker Source_apex_name *string 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker ForceDisable bool `blueprint:"mutated"` 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker // whether the extracted apex file is installable. 97*333d2b36SAndroid Build Coastguard Worker Installable *bool 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker // optional name for the installed apex. If unspecified, name of the 100*333d2b36SAndroid Build Coastguard Worker // module is used as the file name 101*333d2b36SAndroid Build Coastguard Worker Filename *string 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker // names of modules to be overridden. Listed modules can only be other binaries 104*333d2b36SAndroid Build Coastguard Worker // (in Make or Soong). 105*333d2b36SAndroid Build Coastguard Worker // This does not completely prevent installation of the overridden binaries, but if both 106*333d2b36SAndroid Build Coastguard Worker // binaries would be installed by default (in PRODUCT_PACKAGES) the other binary will be removed 107*333d2b36SAndroid Build Coastguard Worker // from PRODUCT_PACKAGES. 108*333d2b36SAndroid Build Coastguard Worker Overrides []string 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker // List of bootclasspath fragments inside this prebuilt APEX bundle and for which this APEX 111*333d2b36SAndroid Build Coastguard Worker // bundle will create an APEX variant. 112*333d2b36SAndroid Build Coastguard Worker Exported_bootclasspath_fragments []string 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Worker // List of systemserverclasspath fragments inside this prebuilt APEX bundle and for which this 115*333d2b36SAndroid Build Coastguard Worker // APEX bundle will create an APEX variant. 116*333d2b36SAndroid Build Coastguard Worker Exported_systemserverclasspath_fragments []string 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Worker // Path to the .prebuilt_info file of the prebuilt apex. 119*333d2b36SAndroid Build Coastguard Worker // In case of mainline modules, the .prebuilt_info file contains the build_id that was used to 120*333d2b36SAndroid Build Coastguard Worker // generate the prebuilt. 121*333d2b36SAndroid Build Coastguard Worker Prebuilt_info *string `android:"path"` 122*333d2b36SAndroid Build Coastguard Worker} 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Worker// initPrebuiltCommon initializes the prebuiltCommon structure and performs initialization of the 125*333d2b36SAndroid Build Coastguard Worker// module that is common to Prebuilt and ApexSet. 126*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) initPrebuiltCommon(module android.Module, properties *PrebuiltCommonProperties) { 127*333d2b36SAndroid Build Coastguard Worker p.prebuiltCommonProperties = properties 128*333d2b36SAndroid Build Coastguard Worker android.InitSingleSourcePrebuiltModule(module.(android.PrebuiltInterface), properties, "Selected_apex") 129*333d2b36SAndroid Build Coastguard Worker android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) 130*333d2b36SAndroid Build Coastguard Worker} 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) ApexVariationName() string { 133*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(p.prebuiltCommonProperties.Apex_name, p.BaseModuleName()) 134*333d2b36SAndroid Build Coastguard Worker} 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) BaseModuleName() string { 137*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(p.prebuiltCommonProperties.Source_apex_name, p.ModuleBase.BaseModuleName()) 138*333d2b36SAndroid Build Coastguard Worker} 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) Prebuilt() *android.Prebuilt { 141*333d2b36SAndroid Build Coastguard Worker return &p.prebuilt 142*333d2b36SAndroid Build Coastguard Worker} 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) isForceDisabled() bool { 145*333d2b36SAndroid Build Coastguard Worker return p.prebuiltCommonProperties.ForceDisable 146*333d2b36SAndroid Build Coastguard Worker} 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) checkForceDisable(ctx android.ModuleContext) bool { 149*333d2b36SAndroid Build Coastguard Worker forceDisable := false 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker // Force disable the prebuilts when we are doing unbundled build. We do unbundled build 152*333d2b36SAndroid Build Coastguard Worker // to build the prebuilts themselves. 153*333d2b36SAndroid Build Coastguard Worker forceDisable = forceDisable || ctx.Config().UnbundledBuild() 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Worker // b/137216042 don't use prebuilts when address sanitizer is on, unless the prebuilt has a sanitized source 156*333d2b36SAndroid Build Coastguard Worker sanitized := ctx.Module().(sanitizedPrebuilt) 157*333d2b36SAndroid Build Coastguard Worker forceDisable = forceDisable || (android.InList("address", ctx.Config().SanitizeDevice()) && !sanitized.hasSanitizedSource("address")) 158*333d2b36SAndroid Build Coastguard Worker forceDisable = forceDisable || (android.InList("hwaddress", ctx.Config().SanitizeDevice()) && !sanitized.hasSanitizedSource("hwaddress")) 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Worker if forceDisable && p.prebuilt.SourceExists() { 161*333d2b36SAndroid Build Coastguard Worker p.prebuiltCommonProperties.ForceDisable = true 162*333d2b36SAndroid Build Coastguard Worker return true 163*333d2b36SAndroid Build Coastguard Worker } 164*333d2b36SAndroid Build Coastguard Worker return false 165*333d2b36SAndroid Build Coastguard Worker} 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) InstallFilename() string { 168*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(p.prebuiltCommonProperties.Filename, p.BaseModuleName()+imageApexSuffix) 169*333d2b36SAndroid Build Coastguard Worker} 170*333d2b36SAndroid Build Coastguard Worker 171*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) Name() string { 172*333d2b36SAndroid Build Coastguard Worker return p.prebuilt.Name(p.ModuleBase.Name()) 173*333d2b36SAndroid Build Coastguard Worker} 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) Overrides() []string { 176*333d2b36SAndroid Build Coastguard Worker return p.prebuiltCommonProperties.Overrides 177*333d2b36SAndroid Build Coastguard Worker} 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) installable() bool { 180*333d2b36SAndroid Build Coastguard Worker return proptools.BoolDefault(p.prebuiltCommonProperties.Installable, true) 181*333d2b36SAndroid Build Coastguard Worker} 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker// To satisfy java.DexpreopterInterface 184*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) IsInstallable() bool { 185*333d2b36SAndroid Build Coastguard Worker return p.installable() 186*333d2b36SAndroid Build Coastguard Worker} 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker// initApexFilesForAndroidMk initializes the prebuiltCommon.requiredModuleNames field with the install only deps of the prebuilt apex 189*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) initApexFilesForAndroidMk(ctx android.ModuleContext) { 190*333d2b36SAndroid Build Coastguard Worker // If this apex contains a system server jar, then the dexpreopt artifacts should be added as required 191*333d2b36SAndroid Build Coastguard Worker for _, install := range p.Dexpreopter.DexpreoptBuiltInstalledForApex() { 192*333d2b36SAndroid Build Coastguard Worker p.requiredModuleNames = append(p.requiredModuleNames, install.FullModuleName()) 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker} 195*333d2b36SAndroid Build Coastguard Worker 196*333d2b36SAndroid Build Coastguard Worker// If this prebuilt has system server jar, create the rules to dexpreopt it and install it alongside the prebuilt apex 197*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) dexpreoptSystemServerJars(ctx android.ModuleContext, di *android.DeapexerInfo) { 198*333d2b36SAndroid Build Coastguard Worker if di == nil { 199*333d2b36SAndroid Build Coastguard Worker return 200*333d2b36SAndroid Build Coastguard Worker } 201*333d2b36SAndroid Build Coastguard Worker // If this prebuilt apex has not been selected, return 202*333d2b36SAndroid Build Coastguard Worker if p.IsHideFromMake() { 203*333d2b36SAndroid Build Coastguard Worker return 204*333d2b36SAndroid Build Coastguard Worker } 205*333d2b36SAndroid Build Coastguard Worker // Use apex_name to determine the api domain of this prebuilt apex 206*333d2b36SAndroid Build Coastguard Worker apexName := p.ApexVariationName() 207*333d2b36SAndroid Build Coastguard Worker // TODO: do not compute twice 208*333d2b36SAndroid Build Coastguard Worker dc := dexpreopt.GetGlobalConfig(ctx) 209*333d2b36SAndroid Build Coastguard Worker systemServerJarList := dc.AllApexSystemServerJars(ctx) 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Worker for i := 0; i < systemServerJarList.Len(); i++ { 212*333d2b36SAndroid Build Coastguard Worker sscpApex := systemServerJarList.Apex(i) 213*333d2b36SAndroid Build Coastguard Worker sscpJar := systemServerJarList.Jar(i) 214*333d2b36SAndroid Build Coastguard Worker if apexName != sscpApex { 215*333d2b36SAndroid Build Coastguard Worker continue 216*333d2b36SAndroid Build Coastguard Worker } 217*333d2b36SAndroid Build Coastguard Worker p.Dexpreopter.DexpreoptPrebuiltApexSystemServerJars(ctx, sscpJar, di) 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker} 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) addRequiredModules(entries *android.AndroidMkEntries) { 222*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_REQUIRED_MODULES", p.requiredModuleNames...) 223*333d2b36SAndroid Build Coastguard Worker} 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) AndroidMkEntries() []android.AndroidMkEntries { 226*333d2b36SAndroid Build Coastguard Worker entriesList := []android.AndroidMkEntries{ 227*333d2b36SAndroid Build Coastguard Worker { 228*333d2b36SAndroid Build Coastguard Worker Class: "ETC", 229*333d2b36SAndroid Build Coastguard Worker OutputFile: android.OptionalPathForPath(p.outputApex), 230*333d2b36SAndroid Build Coastguard Worker Include: "$(BUILD_PREBUILT)", 231*333d2b36SAndroid Build Coastguard Worker Host_required: p.hostRequired, 232*333d2b36SAndroid Build Coastguard Worker ExtraEntries: []android.AndroidMkExtraEntriesFunc{ 233*333d2b36SAndroid Build Coastguard Worker func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 234*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_PATH", p.installDir.String()) 235*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_STEM", p.installFilename) 236*333d2b36SAndroid Build Coastguard Worker entries.SetPath("LOCAL_SOONG_INSTALLED_MODULE", p.installedFile) 237*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_SOONG_INSTALL_PAIRS", p.outputApex.String()+":"+p.installedFile.String()) 238*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_SOONG_INSTALL_SYMLINKS", p.compatSymlinks.Strings()...) 239*333d2b36SAndroid Build Coastguard Worker entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !p.installable()) 240*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_OVERRIDES_MODULES", p.prebuiltCommonProperties.Overrides...) 241*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_APEX_KEY_PATH", p.apexKeysPath.String()) 242*333d2b36SAndroid Build Coastguard Worker p.addRequiredModules(entries) 243*333d2b36SAndroid Build Coastguard Worker }, 244*333d2b36SAndroid Build Coastguard Worker }, 245*333d2b36SAndroid Build Coastguard Worker }, 246*333d2b36SAndroid Build Coastguard Worker } 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Worker // Add the dexpreopt artifacts to androidmk 249*333d2b36SAndroid Build Coastguard Worker for _, install := range p.Dexpreopter.DexpreoptBuiltInstalledForApex() { 250*333d2b36SAndroid Build Coastguard Worker entriesList = append(entriesList, install.ToMakeEntries()) 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker return entriesList 254*333d2b36SAndroid Build Coastguard Worker} 255*333d2b36SAndroid Build Coastguard Worker 256*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) hasExportedDeps() bool { 257*333d2b36SAndroid Build Coastguard Worker return len(p.prebuiltCommonProperties.Exported_bootclasspath_fragments) > 0 || 258*333d2b36SAndroid Build Coastguard Worker len(p.prebuiltCommonProperties.Exported_systemserverclasspath_fragments) > 0 259*333d2b36SAndroid Build Coastguard Worker} 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Worker// prebuiltApexContentsDeps adds dependencies onto the prebuilt apex module's contents. 262*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) prebuiltApexContentsDeps(ctx android.BottomUpMutatorContext) { 263*333d2b36SAndroid Build Coastguard Worker module := ctx.Module() 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker for _, dep := range p.prebuiltCommonProperties.Exported_bootclasspath_fragments { 266*333d2b36SAndroid Build Coastguard Worker prebuiltDep := android.PrebuiltNameFromSource(dep) 267*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(module, exportedBootclasspathFragmentTag, prebuiltDep) 268*333d2b36SAndroid Build Coastguard Worker } 269*333d2b36SAndroid Build Coastguard Worker 270*333d2b36SAndroid Build Coastguard Worker for _, dep := range p.prebuiltCommonProperties.Exported_systemserverclasspath_fragments { 271*333d2b36SAndroid Build Coastguard Worker prebuiltDep := android.PrebuiltNameFromSource(dep) 272*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(module, exportedSystemserverclasspathFragmentTag, prebuiltDep) 273*333d2b36SAndroid Build Coastguard Worker } 274*333d2b36SAndroid Build Coastguard Worker} 275*333d2b36SAndroid Build Coastguard Worker 276*333d2b36SAndroid Build Coastguard Worker// Implements android.DepInInSameApex 277*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 278*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(dep) 279*333d2b36SAndroid Build Coastguard Worker _, ok := tag.(exportedDependencyTag) 280*333d2b36SAndroid Build Coastguard Worker return ok 281*333d2b36SAndroid Build Coastguard Worker} 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Worker// apexInfoMutator marks any modules for which this apex exports a file as requiring an apex 284*333d2b36SAndroid Build Coastguard Worker// specific variant and checks that they are supported. 285*333d2b36SAndroid Build Coastguard Worker// 286*333d2b36SAndroid Build Coastguard Worker// The apexMutator will ensure that the ApexInfo objects passed to BuildForApex(ApexInfo) are 287*333d2b36SAndroid Build Coastguard Worker// associated with the apex specific variant using the ApexInfoProvider for later retrieval. 288*333d2b36SAndroid Build Coastguard Worker// 289*333d2b36SAndroid Build Coastguard Worker// Unlike the source apex module type the prebuilt_apex module type cannot share compatible variants 290*333d2b36SAndroid Build Coastguard Worker// across prebuilt_apex modules. That is because there is no way to determine whether two 291*333d2b36SAndroid Build Coastguard Worker// prebuilt_apex modules that export files for the same module are compatible. e.g. they could have 292*333d2b36SAndroid Build Coastguard Worker// been built from different source at different times or they could have been built with different 293*333d2b36SAndroid Build Coastguard Worker// build options that affect the libraries. 294*333d2b36SAndroid Build Coastguard Worker// 295*333d2b36SAndroid Build Coastguard Worker// While it may be possible to provide sufficient information to determine whether two prebuilt_apex 296*333d2b36SAndroid Build Coastguard Worker// modules were compatible it would be a lot of work and would not provide much benefit for a couple 297*333d2b36SAndroid Build Coastguard Worker// of reasons: 298*333d2b36SAndroid Build Coastguard Worker// - The number of prebuilt_apex modules that will be exporting files for the same module will be 299*333d2b36SAndroid Build Coastguard Worker// low as the prebuilt_apex only exports files for the direct dependencies that require it and 300*333d2b36SAndroid Build Coastguard Worker// very few modules are direct dependencies of multiple prebuilt_apex modules, e.g. there are a 301*333d2b36SAndroid Build Coastguard Worker// few com.android.art* apex files that contain the same contents and could export files for the 302*333d2b36SAndroid Build Coastguard Worker// same modules but only one of them needs to do so. Contrast that with source apex modules which 303*333d2b36SAndroid Build Coastguard Worker// need apex specific variants for every module that contributes code to the apex, whether direct 304*333d2b36SAndroid Build Coastguard Worker// or indirect. 305*333d2b36SAndroid Build Coastguard Worker// - The build cost of a prebuilt_apex variant is generally low as at worst it will involve some 306*333d2b36SAndroid Build Coastguard Worker// extra copying of files. Contrast that with source apex modules that has to build each variant 307*333d2b36SAndroid Build Coastguard Worker// from source. 308*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) apexInfoMutator(mctx android.TopDownMutatorContext) { 309*333d2b36SAndroid Build Coastguard Worker // Collect the list of dependencies. 310*333d2b36SAndroid Build Coastguard Worker var dependencies []android.ApexModule 311*333d2b36SAndroid Build Coastguard Worker mctx.WalkDeps(func(child, parent android.Module) bool { 312*333d2b36SAndroid Build Coastguard Worker // If the child is not in the same apex as the parent then exit immediately and do not visit 313*333d2b36SAndroid Build Coastguard Worker // any of the child's dependencies. 314*333d2b36SAndroid Build Coastguard Worker if !android.IsDepInSameApex(mctx, parent, child) { 315*333d2b36SAndroid Build Coastguard Worker return false 316*333d2b36SAndroid Build Coastguard Worker } 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker tag := mctx.OtherModuleDependencyTag(child) 319*333d2b36SAndroid Build Coastguard Worker depName := mctx.OtherModuleName(child) 320*333d2b36SAndroid Build Coastguard Worker if exportedTag, ok := tag.(exportedDependencyTag); ok { 321*333d2b36SAndroid Build Coastguard Worker propertyName := exportedTag.name 322*333d2b36SAndroid Build Coastguard Worker 323*333d2b36SAndroid Build Coastguard Worker // It is an error if the other module is not a prebuilt. 324*333d2b36SAndroid Build Coastguard Worker if !android.IsModulePrebuilt(child) { 325*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf(propertyName, "%q is not a prebuilt module", depName) 326*333d2b36SAndroid Build Coastguard Worker return false 327*333d2b36SAndroid Build Coastguard Worker } 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Worker // It is an error if the other module is not an ApexModule. 330*333d2b36SAndroid Build Coastguard Worker if _, ok := child.(android.ApexModule); !ok { 331*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf(propertyName, "%q is not usable within an apex", depName) 332*333d2b36SAndroid Build Coastguard Worker return false 333*333d2b36SAndroid Build Coastguard Worker } 334*333d2b36SAndroid Build Coastguard Worker } 335*333d2b36SAndroid Build Coastguard Worker 336*333d2b36SAndroid Build Coastguard Worker // Ignore any modules that do not implement ApexModule as they cannot have an APEX specific 337*333d2b36SAndroid Build Coastguard Worker // variant. 338*333d2b36SAndroid Build Coastguard Worker if _, ok := child.(android.ApexModule); !ok { 339*333d2b36SAndroid Build Coastguard Worker return false 340*333d2b36SAndroid Build Coastguard Worker } 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Worker // Strip off the prebuilt_ prefix if present before storing content to ensure consistent 343*333d2b36SAndroid Build Coastguard Worker // behavior whether there is a corresponding source module present or not. 344*333d2b36SAndroid Build Coastguard Worker depName = android.RemoveOptionalPrebuiltPrefix(depName) 345*333d2b36SAndroid Build Coastguard Worker 346*333d2b36SAndroid Build Coastguard Worker // Add the module to the list of dependencies that need to have an APEX variant. 347*333d2b36SAndroid Build Coastguard Worker dependencies = append(dependencies, child.(android.ApexModule)) 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker return true 350*333d2b36SAndroid Build Coastguard Worker }) 351*333d2b36SAndroid Build Coastguard Worker 352*333d2b36SAndroid Build Coastguard Worker android.SetProvider(mctx, android.ApexBundleInfoProvider, android.ApexBundleInfo{}) 353*333d2b36SAndroid Build Coastguard Worker 354*333d2b36SAndroid Build Coastguard Worker // Create an ApexInfo for the prebuilt_apex. 355*333d2b36SAndroid Build Coastguard Worker apexVariationName := p.ApexVariationName() 356*333d2b36SAndroid Build Coastguard Worker apexInfo := android.ApexInfo{ 357*333d2b36SAndroid Build Coastguard Worker ApexVariationName: apexVariationName, 358*333d2b36SAndroid Build Coastguard Worker InApexVariants: []string{apexVariationName}, 359*333d2b36SAndroid Build Coastguard Worker ForPrebuiltApex: true, 360*333d2b36SAndroid Build Coastguard Worker } 361*333d2b36SAndroid Build Coastguard Worker 362*333d2b36SAndroid Build Coastguard Worker // Mark the dependencies of this module as requiring a variant for this module. 363*333d2b36SAndroid Build Coastguard Worker for _, am := range dependencies { 364*333d2b36SAndroid Build Coastguard Worker am.BuildForApex(apexInfo) 365*333d2b36SAndroid Build Coastguard Worker } 366*333d2b36SAndroid Build Coastguard Worker} 367*333d2b36SAndroid Build Coastguard Worker 368*333d2b36SAndroid Build Coastguard Workertype Prebuilt struct { 369*333d2b36SAndroid Build Coastguard Worker prebuiltCommon 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker properties PrebuiltProperties 372*333d2b36SAndroid Build Coastguard Worker 373*333d2b36SAndroid Build Coastguard Worker inputApex android.Path 374*333d2b36SAndroid Build Coastguard Worker 375*333d2b36SAndroid Build Coastguard Worker provenanceMetaDataFile android.Path 376*333d2b36SAndroid Build Coastguard Worker} 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Workertype ApexFileProperties struct { 379*333d2b36SAndroid Build Coastguard Worker // the path to the prebuilt .apex file to import. 380*333d2b36SAndroid Build Coastguard Worker // 381*333d2b36SAndroid Build Coastguard Worker // This cannot be marked as `android:"arch_variant"` because the `prebuilt_apex` is only mutated 382*333d2b36SAndroid Build Coastguard Worker // for android_common. That is so that it will have the same arch variant as, and so be compatible 383*333d2b36SAndroid Build Coastguard Worker // with, the source `apex` module type that it replaces. 384*333d2b36SAndroid Build Coastguard Worker Src proptools.Configurable[string] `android:"path,replace_instead_of_append"` 385*333d2b36SAndroid Build Coastguard Worker Arch struct { 386*333d2b36SAndroid Build Coastguard Worker Arm struct { 387*333d2b36SAndroid Build Coastguard Worker Src *string `android:"path"` 388*333d2b36SAndroid Build Coastguard Worker } 389*333d2b36SAndroid Build Coastguard Worker Arm64 struct { 390*333d2b36SAndroid Build Coastguard Worker Src *string `android:"path"` 391*333d2b36SAndroid Build Coastguard Worker } 392*333d2b36SAndroid Build Coastguard Worker Riscv64 struct { 393*333d2b36SAndroid Build Coastguard Worker Src *string `android:"path"` 394*333d2b36SAndroid Build Coastguard Worker } 395*333d2b36SAndroid Build Coastguard Worker X86 struct { 396*333d2b36SAndroid Build Coastguard Worker Src *string `android:"path"` 397*333d2b36SAndroid Build Coastguard Worker } 398*333d2b36SAndroid Build Coastguard Worker X86_64 struct { 399*333d2b36SAndroid Build Coastguard Worker Src *string `android:"path"` 400*333d2b36SAndroid Build Coastguard Worker } 401*333d2b36SAndroid Build Coastguard Worker } 402*333d2b36SAndroid Build Coastguard Worker} 403*333d2b36SAndroid Build Coastguard Worker 404*333d2b36SAndroid Build Coastguard Worker// prebuiltApexSelector selects the correct prebuilt APEX file for the build target. 405*333d2b36SAndroid Build Coastguard Worker// 406*333d2b36SAndroid Build Coastguard Worker// The ctx parameter can be for any module not just the prebuilt module so care must be taken not 407*333d2b36SAndroid Build Coastguard Worker// to use methods on it that are specific to the current module. 408*333d2b36SAndroid Build Coastguard Worker// 409*333d2b36SAndroid Build Coastguard Worker// See the ApexFileProperties.Src property. 410*333d2b36SAndroid Build Coastguard Workerfunc (p *ApexFileProperties) prebuiltApexSelector(ctx android.BaseModuleContext, prebuilt android.Module) string { 411*333d2b36SAndroid Build Coastguard Worker multiTargets := prebuilt.MultiTargets() 412*333d2b36SAndroid Build Coastguard Worker if len(multiTargets) != 1 { 413*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleErrorf(prebuilt, "compile_multilib shouldn't be \"both\" for prebuilt_apex") 414*333d2b36SAndroid Build Coastguard Worker return "" 415*333d2b36SAndroid Build Coastguard Worker } 416*333d2b36SAndroid Build Coastguard Worker var src string 417*333d2b36SAndroid Build Coastguard Worker switch multiTargets[0].Arch.ArchType { 418*333d2b36SAndroid Build Coastguard Worker case android.Arm: 419*333d2b36SAndroid Build Coastguard Worker src = String(p.Arch.Arm.Src) 420*333d2b36SAndroid Build Coastguard Worker case android.Arm64: 421*333d2b36SAndroid Build Coastguard Worker src = String(p.Arch.Arm64.Src) 422*333d2b36SAndroid Build Coastguard Worker case android.Riscv64: 423*333d2b36SAndroid Build Coastguard Worker src = String(p.Arch.Riscv64.Src) 424*333d2b36SAndroid Build Coastguard Worker // HACK: fall back to arm64 prebuilts, the riscv64 ones don't exist yet. 425*333d2b36SAndroid Build Coastguard Worker if src == "" { 426*333d2b36SAndroid Build Coastguard Worker src = String(p.Arch.Arm64.Src) 427*333d2b36SAndroid Build Coastguard Worker } 428*333d2b36SAndroid Build Coastguard Worker case android.X86: 429*333d2b36SAndroid Build Coastguard Worker src = String(p.Arch.X86.Src) 430*333d2b36SAndroid Build Coastguard Worker case android.X86_64: 431*333d2b36SAndroid Build Coastguard Worker src = String(p.Arch.X86_64.Src) 432*333d2b36SAndroid Build Coastguard Worker } 433*333d2b36SAndroid Build Coastguard Worker if src == "" { 434*333d2b36SAndroid Build Coastguard Worker src = p.Src.GetOrDefault(ctx, "") 435*333d2b36SAndroid Build Coastguard Worker } 436*333d2b36SAndroid Build Coastguard Worker 437*333d2b36SAndroid Build Coastguard Worker if src == "" { 438*333d2b36SAndroid Build Coastguard Worker if ctx.Config().AllowMissingDependencies() { 439*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{ctx.OtherModuleName(prebuilt)}) 440*333d2b36SAndroid Build Coastguard Worker } else { 441*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleErrorf(prebuilt, "prebuilt_apex does not support %q", multiTargets[0].Arch.String()) 442*333d2b36SAndroid Build Coastguard Worker } 443*333d2b36SAndroid Build Coastguard Worker // Drop through to return an empty string as the src (instead of nil) to avoid the prebuilt 444*333d2b36SAndroid Build Coastguard Worker // logic from reporting a more general, less useful message. 445*333d2b36SAndroid Build Coastguard Worker } 446*333d2b36SAndroid Build Coastguard Worker 447*333d2b36SAndroid Build Coastguard Worker return src 448*333d2b36SAndroid Build Coastguard Worker} 449*333d2b36SAndroid Build Coastguard Worker 450*333d2b36SAndroid Build Coastguard Workertype PrebuiltProperties struct { 451*333d2b36SAndroid Build Coastguard Worker ApexFileProperties 452*333d2b36SAndroid Build Coastguard Worker 453*333d2b36SAndroid Build Coastguard Worker PrebuiltCommonProperties 454*333d2b36SAndroid Build Coastguard Worker} 455*333d2b36SAndroid Build Coastguard Worker 456*333d2b36SAndroid Build Coastguard Workerfunc (a *Prebuilt) hasSanitizedSource(sanitizer string) bool { 457*333d2b36SAndroid Build Coastguard Worker return false 458*333d2b36SAndroid Build Coastguard Worker} 459*333d2b36SAndroid Build Coastguard Worker 460*333d2b36SAndroid Build Coastguard Worker// prebuilt_apex imports an `.apex` file into the build graph as if it was built with apex. 461*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltFactory() android.Module { 462*333d2b36SAndroid Build Coastguard Worker module := &Prebuilt{} 463*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 464*333d2b36SAndroid Build Coastguard Worker module.prebuiltCommon.prebuiltCommonProperties = &module.properties.PrebuiltCommonProperties 465*333d2b36SAndroid Build Coastguard Worker 466*333d2b36SAndroid Build Coastguard Worker // init the module as a prebuilt 467*333d2b36SAndroid Build Coastguard Worker // even though this module type has srcs, use `InitPrebuiltModuleWithoutSrcs`, since the existing 468*333d2b36SAndroid Build Coastguard Worker // InitPrebuiltModule* are not friendly with Sources of Configurable type. 469*333d2b36SAndroid Build Coastguard Worker // The actual src will be evaluated in GenerateAndroidBuildActions. 470*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModuleWithoutSrcs(module) 471*333d2b36SAndroid Build Coastguard Worker android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) 472*333d2b36SAndroid Build Coastguard Worker 473*333d2b36SAndroid Build Coastguard Worker return module 474*333d2b36SAndroid Build Coastguard Worker} 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) getDeapexerPropertiesIfNeeded(ctx android.ModuleContext) DeapexerProperties { 477*333d2b36SAndroid Build Coastguard Worker // Compute the deapexer properties from the transitive dependencies of this module. 478*333d2b36SAndroid Build Coastguard Worker commonModules := []string{} 479*333d2b36SAndroid Build Coastguard Worker dexpreoptProfileGuidedModules := []string{} 480*333d2b36SAndroid Build Coastguard Worker exportedFiles := []string{} 481*333d2b36SAndroid Build Coastguard Worker ctx.WalkDeps(func(child, parent android.Module) bool { 482*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(child) 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Worker // If the child is not in the same apex as the parent then ignore it and all its children. 485*333d2b36SAndroid Build Coastguard Worker if !android.IsDepInSameApex(ctx, parent, child) { 486*333d2b36SAndroid Build Coastguard Worker return false 487*333d2b36SAndroid Build Coastguard Worker } 488*333d2b36SAndroid Build Coastguard Worker 489*333d2b36SAndroid Build Coastguard Worker name := java.ModuleStemForDeapexing(child) 490*333d2b36SAndroid Build Coastguard Worker if _, ok := tag.(android.RequiresFilesFromPrebuiltApexTag); ok { 491*333d2b36SAndroid Build Coastguard Worker commonModules = append(commonModules, name) 492*333d2b36SAndroid Build Coastguard Worker 493*333d2b36SAndroid Build Coastguard Worker extract := child.(android.RequiredFilesFromPrebuiltApex) 494*333d2b36SAndroid Build Coastguard Worker requiredFiles := extract.RequiredFilesFromPrebuiltApex(ctx) 495*333d2b36SAndroid Build Coastguard Worker exportedFiles = append(exportedFiles, requiredFiles...) 496*333d2b36SAndroid Build Coastguard Worker 497*333d2b36SAndroid Build Coastguard Worker if extract.UseProfileGuidedDexpreopt() { 498*333d2b36SAndroid Build Coastguard Worker dexpreoptProfileGuidedModules = append(dexpreoptProfileGuidedModules, name) 499*333d2b36SAndroid Build Coastguard Worker } 500*333d2b36SAndroid Build Coastguard Worker 501*333d2b36SAndroid Build Coastguard Worker // Visit the dependencies of this module just in case they also require files from the 502*333d2b36SAndroid Build Coastguard Worker // prebuilt apex. 503*333d2b36SAndroid Build Coastguard Worker return true 504*333d2b36SAndroid Build Coastguard Worker } 505*333d2b36SAndroid Build Coastguard Worker 506*333d2b36SAndroid Build Coastguard Worker return false 507*333d2b36SAndroid Build Coastguard Worker }) 508*333d2b36SAndroid Build Coastguard Worker 509*333d2b36SAndroid Build Coastguard Worker // Create properties for deapexer module. 510*333d2b36SAndroid Build Coastguard Worker deapexerProperties := DeapexerProperties{ 511*333d2b36SAndroid Build Coastguard Worker // Remove any duplicates from the common modules lists as a module may be included via a direct 512*333d2b36SAndroid Build Coastguard Worker // dependency as well as transitive ones. 513*333d2b36SAndroid Build Coastguard Worker CommonModules: android.SortedUniqueStrings(commonModules), 514*333d2b36SAndroid Build Coastguard Worker DexpreoptProfileGuidedModules: android.SortedUniqueStrings(dexpreoptProfileGuidedModules), 515*333d2b36SAndroid Build Coastguard Worker } 516*333d2b36SAndroid Build Coastguard Worker 517*333d2b36SAndroid Build Coastguard Worker // Populate the exported files property in a fixed order. 518*333d2b36SAndroid Build Coastguard Worker deapexerProperties.ExportedFiles = android.SortedUniqueStrings(exportedFiles) 519*333d2b36SAndroid Build Coastguard Worker return deapexerProperties 520*333d2b36SAndroid Build Coastguard Worker} 521*333d2b36SAndroid Build Coastguard Worker 522*333d2b36SAndroid Build Coastguard Workerfunc prebuiltApexExportedModuleName(ctx android.BottomUpMutatorContext, name string) string { 523*333d2b36SAndroid Build Coastguard Worker // The prebuilt_apex should be depending on prebuilt modules but as this runs after 524*333d2b36SAndroid Build Coastguard Worker // prebuilt_rename the prebuilt module may or may not be using the prebuilt_ prefixed named. So, 525*333d2b36SAndroid Build Coastguard Worker // check to see if the prefixed name is in use first, if it is then use that, otherwise assume 526*333d2b36SAndroid Build Coastguard Worker // the unprefixed name is the one to use. If the unprefixed one turns out to be a source module 527*333d2b36SAndroid Build Coastguard Worker // and not a renamed prebuilt module then that will be detected and reported as an error when 528*333d2b36SAndroid Build Coastguard Worker // processing the dependency in ApexInfoMutator(). 529*333d2b36SAndroid Build Coastguard Worker prebuiltName := android.PrebuiltNameFromSource(name) 530*333d2b36SAndroid Build Coastguard Worker if ctx.OtherModuleExists(prebuiltName) { 531*333d2b36SAndroid Build Coastguard Worker name = prebuiltName 532*333d2b36SAndroid Build Coastguard Worker } 533*333d2b36SAndroid Build Coastguard Worker return name 534*333d2b36SAndroid Build Coastguard Worker} 535*333d2b36SAndroid Build Coastguard Worker 536*333d2b36SAndroid Build Coastguard Workertype exportedDependencyTag struct { 537*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 538*333d2b36SAndroid Build Coastguard Worker name string 539*333d2b36SAndroid Build Coastguard Worker} 540*333d2b36SAndroid Build Coastguard Worker 541*333d2b36SAndroid Build Coastguard Worker// Mark this tag so dependencies that use it are excluded from visibility enforcement. 542*333d2b36SAndroid Build Coastguard Worker// 543*333d2b36SAndroid Build Coastguard Worker// This does allow any prebuilt_apex to reference any module which does open up a small window for 544*333d2b36SAndroid Build Coastguard Worker// restricted visibility modules to be referenced from the wrong prebuilt_apex. However, doing so 545*333d2b36SAndroid Build Coastguard Worker// avoids opening up a much bigger window by widening the visibility of modules that need files 546*333d2b36SAndroid Build Coastguard Worker// provided by the prebuilt_apex to include all the possible locations they may be defined, which 547*333d2b36SAndroid Build Coastguard Worker// could include everything below vendor/. 548*333d2b36SAndroid Build Coastguard Worker// 549*333d2b36SAndroid Build Coastguard Worker// A prebuilt_apex that references a module via this tag will have to contain the appropriate files 550*333d2b36SAndroid Build Coastguard Worker// corresponding to that module, otherwise it will fail when attempting to retrieve the files from 551*333d2b36SAndroid Build Coastguard Worker// the .apex file. It will also have to be included in the module's apex_available property too. 552*333d2b36SAndroid Build Coastguard Worker// That makes it highly unlikely that a prebuilt_apex would reference a restricted module 553*333d2b36SAndroid Build Coastguard Worker// incorrectly. 554*333d2b36SAndroid Build Coastguard Workerfunc (t exportedDependencyTag) ExcludeFromVisibilityEnforcement() {} 555*333d2b36SAndroid Build Coastguard Worker 556*333d2b36SAndroid Build Coastguard Workerfunc (t exportedDependencyTag) RequiresFilesFromPrebuiltApex() {} 557*333d2b36SAndroid Build Coastguard Worker 558*333d2b36SAndroid Build Coastguard Workervar _ android.RequiresFilesFromPrebuiltApexTag = exportedDependencyTag{} 559*333d2b36SAndroid Build Coastguard Worker 560*333d2b36SAndroid Build Coastguard Workervar ( 561*333d2b36SAndroid Build Coastguard Worker exportedBootclasspathFragmentTag = exportedDependencyTag{name: "exported_bootclasspath_fragments"} 562*333d2b36SAndroid Build Coastguard Worker exportedSystemserverclasspathFragmentTag = exportedDependencyTag{name: "exported_systemserverclasspath_fragments"} 563*333d2b36SAndroid Build Coastguard Worker) 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Workerfunc (p *Prebuilt) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { 566*333d2b36SAndroid Build Coastguard Worker p.prebuiltApexContentsDeps(ctx) 567*333d2b36SAndroid Build Coastguard Worker} 568*333d2b36SAndroid Build Coastguard Worker 569*333d2b36SAndroid Build Coastguard Workervar _ ApexInfoMutator = (*Prebuilt)(nil) 570*333d2b36SAndroid Build Coastguard Worker 571*333d2b36SAndroid Build Coastguard Workerfunc (p *Prebuilt) ApexInfoMutator(mctx android.TopDownMutatorContext) { 572*333d2b36SAndroid Build Coastguard Worker p.apexInfoMutator(mctx) 573*333d2b36SAndroid Build Coastguard Worker} 574*333d2b36SAndroid Build Coastguard Worker 575*333d2b36SAndroid Build Coastguard Worker// creates the build rules to deapex the prebuilt, and returns a deapexerInfo 576*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) getDeapexerInfo(ctx android.ModuleContext, apexFile android.Path) *android.DeapexerInfo { 577*333d2b36SAndroid Build Coastguard Worker if !p.hasExportedDeps() { 578*333d2b36SAndroid Build Coastguard Worker // nothing to do 579*333d2b36SAndroid Build Coastguard Worker return nil 580*333d2b36SAndroid Build Coastguard Worker } 581*333d2b36SAndroid Build Coastguard Worker deapexerProps := p.getDeapexerPropertiesIfNeeded(ctx) 582*333d2b36SAndroid Build Coastguard Worker return deapex(ctx, apexFile, deapexerProps) 583*333d2b36SAndroid Build Coastguard Worker} 584*333d2b36SAndroid Build Coastguard Worker 585*333d2b36SAndroid Build Coastguard Worker// Set a provider containing information about the jars and .prof provided by the apex 586*333d2b36SAndroid Build Coastguard Worker// Apexes built from prebuilts retrieve this information by visiting its internal deapexer module 587*333d2b36SAndroid Build Coastguard Worker// Used by dex_bootjars to generate the boot image 588*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) provideApexExportsInfo(ctx android.ModuleContext, di *android.DeapexerInfo) { 589*333d2b36SAndroid Build Coastguard Worker if di == nil { 590*333d2b36SAndroid Build Coastguard Worker return 591*333d2b36SAndroid Build Coastguard Worker } 592*333d2b36SAndroid Build Coastguard Worker javaModuleToDexPath := map[string]android.Path{} 593*333d2b36SAndroid Build Coastguard Worker for _, commonModule := range di.GetExportedModuleNames() { 594*333d2b36SAndroid Build Coastguard Worker if dex := di.PrebuiltExportPath(java.ApexRootRelativePathToJavaLib(commonModule)); dex != nil { 595*333d2b36SAndroid Build Coastguard Worker javaModuleToDexPath[commonModule] = dex 596*333d2b36SAndroid Build Coastguard Worker } 597*333d2b36SAndroid Build Coastguard Worker } 598*333d2b36SAndroid Build Coastguard Worker 599*333d2b36SAndroid Build Coastguard Worker exports := android.ApexExportsInfo{ 600*333d2b36SAndroid Build Coastguard Worker ApexName: p.ApexVariationName(), 601*333d2b36SAndroid Build Coastguard Worker ProfilePathOnHost: di.PrebuiltExportPath(java.ProfileInstallPathInApex), 602*333d2b36SAndroid Build Coastguard Worker LibraryNameToDexJarPathOnHost: javaModuleToDexPath, 603*333d2b36SAndroid Build Coastguard Worker } 604*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, android.ApexExportsInfoProvider, exports) 605*333d2b36SAndroid Build Coastguard Worker} 606*333d2b36SAndroid Build Coastguard Worker 607*333d2b36SAndroid Build Coastguard Worker// Set prebuiltInfoProvider. This will be used by `apex_prebuiltinfo_singleton` to print out a metadata file 608*333d2b36SAndroid Build Coastguard Worker// with information about whether source or prebuilt of an apex was used during the build. 609*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltCommon) providePrebuiltInfo(ctx android.ModuleContext) { 610*333d2b36SAndroid Build Coastguard Worker info := android.PrebuiltInfo{ 611*333d2b36SAndroid Build Coastguard Worker Name: p.BaseModuleName(), 612*333d2b36SAndroid Build Coastguard Worker Is_prebuilt: true, 613*333d2b36SAndroid Build Coastguard Worker } 614*333d2b36SAndroid Build Coastguard Worker // If Prebuilt_info information is available in the soong module definition, add it to prebuilt_info.json. 615*333d2b36SAndroid Build Coastguard Worker if p.prebuiltCommonProperties.Prebuilt_info != nil { 616*333d2b36SAndroid Build Coastguard Worker info.Prebuilt_info_file_path = android.PathForModuleSrc(ctx, *p.prebuiltCommonProperties.Prebuilt_info).String() 617*333d2b36SAndroid Build Coastguard Worker } 618*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, android.PrebuiltInfoProvider, info) 619*333d2b36SAndroid Build Coastguard Worker} 620*333d2b36SAndroid Build Coastguard Worker 621*333d2b36SAndroid Build Coastguard Worker// Uses an object provided by its deps to validate that the contents of bcpf have been added to the global 622*333d2b36SAndroid Build Coastguard Worker// PRODUCT_APEX_BOOT_JARS 623*333d2b36SAndroid Build Coastguard Worker// This validation will only run on the apex which is active for this product/release_config 624*333d2b36SAndroid Build Coastguard Workerfunc validateApexClasspathFragments(ctx android.ModuleContext) { 625*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(m android.Module) { 626*333d2b36SAndroid Build Coastguard Worker if info, exists := android.OtherModuleProvider(ctx, m, java.ClasspathFragmentValidationInfoProvider); exists { 627*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("%s in contents of %s must also be declared in PRODUCT_APEX_BOOT_JARS", info.UnknownJars, info.ClasspathFragmentModuleName) 628*333d2b36SAndroid Build Coastguard Worker } 629*333d2b36SAndroid Build Coastguard Worker }) 630*333d2b36SAndroid Build Coastguard Worker} 631*333d2b36SAndroid Build Coastguard Worker 632*333d2b36SAndroid Build Coastguard Workerfunc (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { 633*333d2b36SAndroid Build Coastguard Worker // Validate contents of classpath fragments 634*333d2b36SAndroid Build Coastguard Worker if !p.IsHideFromMake() { 635*333d2b36SAndroid Build Coastguard Worker validateApexClasspathFragments(ctx) 636*333d2b36SAndroid Build Coastguard Worker } 637*333d2b36SAndroid Build Coastguard Worker 638*333d2b36SAndroid Build Coastguard Worker p.apexKeysPath = writeApexKeys(ctx, p) 639*333d2b36SAndroid Build Coastguard Worker // TODO(jungjw): Check the key validity. 640*333d2b36SAndroid Build Coastguard Worker p.inputApex = android.PathForModuleSrc(ctx, p.properties.prebuiltApexSelector(ctx, ctx.Module())) 641*333d2b36SAndroid Build Coastguard Worker p.installDir = android.PathForModuleInstall(ctx, "apex") 642*333d2b36SAndroid Build Coastguard Worker p.installFilename = p.InstallFilename() 643*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(p.installFilename, imageApexSuffix) { 644*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("filename should end in %s for prebuilt_apex", imageApexSuffix) 645*333d2b36SAndroid Build Coastguard Worker } 646*333d2b36SAndroid Build Coastguard Worker p.outputApex = android.PathForModuleOut(ctx, p.installFilename) 647*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 648*333d2b36SAndroid Build Coastguard Worker Rule: android.Cp, 649*333d2b36SAndroid Build Coastguard Worker Input: p.inputApex, 650*333d2b36SAndroid Build Coastguard Worker Output: p.outputApex, 651*333d2b36SAndroid Build Coastguard Worker }) 652*333d2b36SAndroid Build Coastguard Worker 653*333d2b36SAndroid Build Coastguard Worker if p.prebuiltCommon.checkForceDisable(ctx) { 654*333d2b36SAndroid Build Coastguard Worker p.HideFromMake() 655*333d2b36SAndroid Build Coastguard Worker return 656*333d2b36SAndroid Build Coastguard Worker } 657*333d2b36SAndroid Build Coastguard Worker 658*333d2b36SAndroid Build Coastguard Worker deapexerInfo := p.getDeapexerInfo(ctx, p.inputApex) 659*333d2b36SAndroid Build Coastguard Worker 660*333d2b36SAndroid Build Coastguard Worker // dexpreopt any system server jars if present 661*333d2b36SAndroid Build Coastguard Worker p.dexpreoptSystemServerJars(ctx, deapexerInfo) 662*333d2b36SAndroid Build Coastguard Worker 663*333d2b36SAndroid Build Coastguard Worker // provide info used for generating the boot image 664*333d2b36SAndroid Build Coastguard Worker p.provideApexExportsInfo(ctx, deapexerInfo) 665*333d2b36SAndroid Build Coastguard Worker 666*333d2b36SAndroid Build Coastguard Worker p.providePrebuiltInfo(ctx) 667*333d2b36SAndroid Build Coastguard Worker 668*333d2b36SAndroid Build Coastguard Worker // Save the files that need to be made available to Make. 669*333d2b36SAndroid Build Coastguard Worker p.initApexFilesForAndroidMk(ctx) 670*333d2b36SAndroid Build Coastguard Worker 671*333d2b36SAndroid Build Coastguard Worker // in case that prebuilt_apex replaces source apex (using prefer: prop) 672*333d2b36SAndroid Build Coastguard Worker p.compatSymlinks = makeCompatSymlinks(p.BaseModuleName(), ctx) 673*333d2b36SAndroid Build Coastguard Worker // or that prebuilt_apex overrides other apexes (using overrides: prop) 674*333d2b36SAndroid Build Coastguard Worker for _, overridden := range p.prebuiltCommonProperties.Overrides { 675*333d2b36SAndroid Build Coastguard Worker p.compatSymlinks = append(p.compatSymlinks, makeCompatSymlinks(overridden, ctx)...) 676*333d2b36SAndroid Build Coastguard Worker } 677*333d2b36SAndroid Build Coastguard Worker 678*333d2b36SAndroid Build Coastguard Worker if p.installable() { 679*333d2b36SAndroid Build Coastguard Worker p.installedFile = ctx.InstallFile(p.installDir, p.installFilename, p.inputApex, p.compatSymlinks...) 680*333d2b36SAndroid Build Coastguard Worker p.provenanceMetaDataFile = provenance.GenerateArtifactProvenanceMetaData(ctx, p.inputApex, p.installedFile) 681*333d2b36SAndroid Build Coastguard Worker } 682*333d2b36SAndroid Build Coastguard Worker 683*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{p.outputApex}, "") 684*333d2b36SAndroid Build Coastguard Worker} 685*333d2b36SAndroid Build Coastguard Worker 686*333d2b36SAndroid Build Coastguard Workerfunc (p *Prebuilt) ProvenanceMetaDataFile() android.Path { 687*333d2b36SAndroid Build Coastguard Worker return p.provenanceMetaDataFile 688*333d2b36SAndroid Build Coastguard Worker} 689*333d2b36SAndroid Build Coastguard Worker 690*333d2b36SAndroid Build Coastguard Worker// prebuiltApexExtractorModule is a private module type that is only created by the prebuilt_apex 691*333d2b36SAndroid Build Coastguard Worker// module. It extracts the correct apex to use and makes it available for use by apex_set. 692*333d2b36SAndroid Build Coastguard Workertype prebuiltApexExtractorModule struct { 693*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 694*333d2b36SAndroid Build Coastguard Worker 695*333d2b36SAndroid Build Coastguard Worker properties ApexExtractorProperties 696*333d2b36SAndroid Build Coastguard Worker 697*333d2b36SAndroid Build Coastguard Worker extractedApex android.WritablePath 698*333d2b36SAndroid Build Coastguard Worker} 699*333d2b36SAndroid Build Coastguard Worker 700*333d2b36SAndroid Build Coastguard Worker// extract registers the build actions to extract an apex from .apks file 701*333d2b36SAndroid Build Coastguard Worker// returns the path of the extracted apex 702*333d2b36SAndroid Build Coastguard Workerfunc extract(ctx android.ModuleContext, apexSet android.Path, prerelease *bool) android.Path { 703*333d2b36SAndroid Build Coastguard Worker defaultAllowPrerelease := ctx.Config().IsEnvTrue("SOONG_ALLOW_PRERELEASE_APEXES") 704*333d2b36SAndroid Build Coastguard Worker extractedApex := android.PathForModuleOut(ctx, "extracted", apexSet.Base()) 705*333d2b36SAndroid Build Coastguard Worker // Filter out NativeBridge archs (b/260115309) 706*333d2b36SAndroid Build Coastguard Worker abis := java.SupportedAbis(ctx, true) 707*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, 708*333d2b36SAndroid Build Coastguard Worker android.BuildParams{ 709*333d2b36SAndroid Build Coastguard Worker Rule: extractMatchingApex, 710*333d2b36SAndroid Build Coastguard Worker Description: "Extract an apex from an apex set", 711*333d2b36SAndroid Build Coastguard Worker Inputs: android.Paths{apexSet}, 712*333d2b36SAndroid Build Coastguard Worker Output: extractedApex, 713*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 714*333d2b36SAndroid Build Coastguard Worker "abis": strings.Join(abis, ","), 715*333d2b36SAndroid Build Coastguard Worker "allow-prereleased": strconv.FormatBool(proptools.BoolDefault(prerelease, defaultAllowPrerelease)), 716*333d2b36SAndroid Build Coastguard Worker "sdk-version": ctx.Config().PlatformSdkVersion().String(), 717*333d2b36SAndroid Build Coastguard Worker "skip-sdk-check": strconv.FormatBool(ctx.Config().IsEnvTrue("SOONG_SKIP_APPSET_SDK_CHECK")), 718*333d2b36SAndroid Build Coastguard Worker }, 719*333d2b36SAndroid Build Coastguard Worker }, 720*333d2b36SAndroid Build Coastguard Worker ) 721*333d2b36SAndroid Build Coastguard Worker return extractedApex 722*333d2b36SAndroid Build Coastguard Worker} 723*333d2b36SAndroid Build Coastguard Worker 724*333d2b36SAndroid Build Coastguard Workertype ApexSet struct { 725*333d2b36SAndroid Build Coastguard Worker prebuiltCommon 726*333d2b36SAndroid Build Coastguard Worker 727*333d2b36SAndroid Build Coastguard Worker properties ApexSetProperties 728*333d2b36SAndroid Build Coastguard Worker} 729*333d2b36SAndroid Build Coastguard Worker 730*333d2b36SAndroid Build Coastguard Workertype ApexExtractorProperties struct { 731*333d2b36SAndroid Build Coastguard Worker // the .apks file path that contains prebuilt apex files to be extracted. 732*333d2b36SAndroid Build Coastguard Worker Set *string `android:"path"` 733*333d2b36SAndroid Build Coastguard Worker 734*333d2b36SAndroid Build Coastguard Worker Sanitized struct { 735*333d2b36SAndroid Build Coastguard Worker None struct { 736*333d2b36SAndroid Build Coastguard Worker Set *string `android:"path"` 737*333d2b36SAndroid Build Coastguard Worker } 738*333d2b36SAndroid Build Coastguard Worker Address struct { 739*333d2b36SAndroid Build Coastguard Worker Set *string `android:"path"` 740*333d2b36SAndroid Build Coastguard Worker } 741*333d2b36SAndroid Build Coastguard Worker Hwaddress struct { 742*333d2b36SAndroid Build Coastguard Worker Set *string `android:"path"` 743*333d2b36SAndroid Build Coastguard Worker } 744*333d2b36SAndroid Build Coastguard Worker } 745*333d2b36SAndroid Build Coastguard Worker 746*333d2b36SAndroid Build Coastguard Worker // apexes in this set use prerelease SDK version 747*333d2b36SAndroid Build Coastguard Worker Prerelease *bool 748*333d2b36SAndroid Build Coastguard Worker} 749*333d2b36SAndroid Build Coastguard Worker 750*333d2b36SAndroid Build Coastguard Workerfunc (e *ApexExtractorProperties) prebuiltSrcs(ctx android.BaseModuleContext) []string { 751*333d2b36SAndroid Build Coastguard Worker var srcs []string 752*333d2b36SAndroid Build Coastguard Worker if e.Set != nil { 753*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, *e.Set) 754*333d2b36SAndroid Build Coastguard Worker } 755*333d2b36SAndroid Build Coastguard Worker 756*333d2b36SAndroid Build Coastguard Worker sanitizers := ctx.Config().SanitizeDevice() 757*333d2b36SAndroid Build Coastguard Worker 758*333d2b36SAndroid Build Coastguard Worker if android.InList("address", sanitizers) && e.Sanitized.Address.Set != nil { 759*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, *e.Sanitized.Address.Set) 760*333d2b36SAndroid Build Coastguard Worker } else if android.InList("hwaddress", sanitizers) && e.Sanitized.Hwaddress.Set != nil { 761*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, *e.Sanitized.Hwaddress.Set) 762*333d2b36SAndroid Build Coastguard Worker } else if e.Sanitized.None.Set != nil { 763*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, *e.Sanitized.None.Set) 764*333d2b36SAndroid Build Coastguard Worker } 765*333d2b36SAndroid Build Coastguard Worker 766*333d2b36SAndroid Build Coastguard Worker return srcs 767*333d2b36SAndroid Build Coastguard Worker} 768*333d2b36SAndroid Build Coastguard Worker 769*333d2b36SAndroid Build Coastguard Workertype ApexSetProperties struct { 770*333d2b36SAndroid Build Coastguard Worker ApexExtractorProperties 771*333d2b36SAndroid Build Coastguard Worker 772*333d2b36SAndroid Build Coastguard Worker PrebuiltCommonProperties 773*333d2b36SAndroid Build Coastguard Worker} 774*333d2b36SAndroid Build Coastguard Worker 775*333d2b36SAndroid Build Coastguard Workerfunc (a *ApexSet) hasSanitizedSource(sanitizer string) bool { 776*333d2b36SAndroid Build Coastguard Worker if sanitizer == "address" { 777*333d2b36SAndroid Build Coastguard Worker return a.properties.Sanitized.Address.Set != nil 778*333d2b36SAndroid Build Coastguard Worker } 779*333d2b36SAndroid Build Coastguard Worker if sanitizer == "hwaddress" { 780*333d2b36SAndroid Build Coastguard Worker return a.properties.Sanitized.Hwaddress.Set != nil 781*333d2b36SAndroid Build Coastguard Worker } 782*333d2b36SAndroid Build Coastguard Worker 783*333d2b36SAndroid Build Coastguard Worker return false 784*333d2b36SAndroid Build Coastguard Worker} 785*333d2b36SAndroid Build Coastguard Worker 786*333d2b36SAndroid Build Coastguard Worker// prebuilt_apex imports an `.apex` file into the build graph as if it was built with apex. 787*333d2b36SAndroid Build Coastguard Workerfunc apexSetFactory() android.Module { 788*333d2b36SAndroid Build Coastguard Worker module := &ApexSet{} 789*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 790*333d2b36SAndroid Build Coastguard Worker module.prebuiltCommon.prebuiltCommonProperties = &module.properties.PrebuiltCommonProperties 791*333d2b36SAndroid Build Coastguard Worker 792*333d2b36SAndroid Build Coastguard Worker // init the module as a prebuilt 793*333d2b36SAndroid Build Coastguard Worker // even though this module type has srcs, use `InitPrebuiltModuleWithoutSrcs`, since the existing 794*333d2b36SAndroid Build Coastguard Worker // InitPrebuiltModule* are not friendly with Sources of Configurable type. 795*333d2b36SAndroid Build Coastguard Worker // The actual src will be evaluated in GenerateAndroidBuildActions. 796*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModuleWithoutSrcs(module) 797*333d2b36SAndroid Build Coastguard Worker android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) 798*333d2b36SAndroid Build Coastguard Worker 799*333d2b36SAndroid Build Coastguard Worker return module 800*333d2b36SAndroid Build Coastguard Worker} 801*333d2b36SAndroid Build Coastguard Worker 802*333d2b36SAndroid Build Coastguard Workerfunc (a *ApexSet) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { 803*333d2b36SAndroid Build Coastguard Worker a.prebuiltApexContentsDeps(ctx) 804*333d2b36SAndroid Build Coastguard Worker} 805*333d2b36SAndroid Build Coastguard Worker 806*333d2b36SAndroid Build Coastguard Workervar _ ApexInfoMutator = (*ApexSet)(nil) 807*333d2b36SAndroid Build Coastguard Worker 808*333d2b36SAndroid Build Coastguard Workerfunc (a *ApexSet) ApexInfoMutator(mctx android.TopDownMutatorContext) { 809*333d2b36SAndroid Build Coastguard Worker a.apexInfoMutator(mctx) 810*333d2b36SAndroid Build Coastguard Worker} 811*333d2b36SAndroid Build Coastguard Worker 812*333d2b36SAndroid Build Coastguard Workerfunc (a *ApexSet) GenerateAndroidBuildActions(ctx android.ModuleContext) { 813*333d2b36SAndroid Build Coastguard Worker // Validate contents of classpath fragments 814*333d2b36SAndroid Build Coastguard Worker if !a.IsHideFromMake() { 815*333d2b36SAndroid Build Coastguard Worker validateApexClasspathFragments(ctx) 816*333d2b36SAndroid Build Coastguard Worker } 817*333d2b36SAndroid Build Coastguard Worker 818*333d2b36SAndroid Build Coastguard Worker a.apexKeysPath = writeApexKeys(ctx, a) 819*333d2b36SAndroid Build Coastguard Worker a.installFilename = a.InstallFilename() 820*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(a.installFilename, imageApexSuffix) && !strings.HasSuffix(a.installFilename, imageCapexSuffix) { 821*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("filename should end in %s or %s for apex_set", imageApexSuffix, imageCapexSuffix) 822*333d2b36SAndroid Build Coastguard Worker } 823*333d2b36SAndroid Build Coastguard Worker 824*333d2b36SAndroid Build Coastguard Worker var apexSet android.Path 825*333d2b36SAndroid Build Coastguard Worker if srcs := a.properties.prebuiltSrcs(ctx); len(srcs) == 1 { 826*333d2b36SAndroid Build Coastguard Worker apexSet = android.PathForModuleSrc(ctx, srcs[0]) 827*333d2b36SAndroid Build Coastguard Worker } else { 828*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Expected exactly one source apex_set file, found %v\n", srcs) 829*333d2b36SAndroid Build Coastguard Worker } 830*333d2b36SAndroid Build Coastguard Worker 831*333d2b36SAndroid Build Coastguard Worker extractedApex := extract(ctx, apexSet, a.properties.Prerelease) 832*333d2b36SAndroid Build Coastguard Worker 833*333d2b36SAndroid Build Coastguard Worker a.outputApex = android.PathForModuleOut(ctx, a.installFilename) 834*333d2b36SAndroid Build Coastguard Worker 835*333d2b36SAndroid Build Coastguard Worker // Build the output APEX. If compression is not enabled, make sure the output is not compressed even if the input is compressed 836*333d2b36SAndroid Build Coastguard Worker buildRule := android.Cp 837*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().ApexCompressionEnabled() { 838*333d2b36SAndroid Build Coastguard Worker buildRule = decompressApex 839*333d2b36SAndroid Build Coastguard Worker } 840*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 841*333d2b36SAndroid Build Coastguard Worker Rule: buildRule, 842*333d2b36SAndroid Build Coastguard Worker Input: extractedApex, 843*333d2b36SAndroid Build Coastguard Worker Output: a.outputApex, 844*333d2b36SAndroid Build Coastguard Worker }) 845*333d2b36SAndroid Build Coastguard Worker 846*333d2b36SAndroid Build Coastguard Worker if a.prebuiltCommon.checkForceDisable(ctx) { 847*333d2b36SAndroid Build Coastguard Worker a.HideFromMake() 848*333d2b36SAndroid Build Coastguard Worker return 849*333d2b36SAndroid Build Coastguard Worker } 850*333d2b36SAndroid Build Coastguard Worker 851*333d2b36SAndroid Build Coastguard Worker deapexerInfo := a.getDeapexerInfo(ctx, extractedApex) 852*333d2b36SAndroid Build Coastguard Worker 853*333d2b36SAndroid Build Coastguard Worker // dexpreopt any system server jars if present 854*333d2b36SAndroid Build Coastguard Worker a.dexpreoptSystemServerJars(ctx, deapexerInfo) 855*333d2b36SAndroid Build Coastguard Worker 856*333d2b36SAndroid Build Coastguard Worker // provide info used for generating the boot image 857*333d2b36SAndroid Build Coastguard Worker a.provideApexExportsInfo(ctx, deapexerInfo) 858*333d2b36SAndroid Build Coastguard Worker 859*333d2b36SAndroid Build Coastguard Worker a.providePrebuiltInfo(ctx) 860*333d2b36SAndroid Build Coastguard Worker 861*333d2b36SAndroid Build Coastguard Worker // Save the files that need to be made available to Make. 862*333d2b36SAndroid Build Coastguard Worker a.initApexFilesForAndroidMk(ctx) 863*333d2b36SAndroid Build Coastguard Worker 864*333d2b36SAndroid Build Coastguard Worker a.installDir = android.PathForModuleInstall(ctx, "apex") 865*333d2b36SAndroid Build Coastguard Worker if a.installable() { 866*333d2b36SAndroid Build Coastguard Worker a.installedFile = ctx.InstallFile(a.installDir, a.installFilename, a.outputApex) 867*333d2b36SAndroid Build Coastguard Worker } 868*333d2b36SAndroid Build Coastguard Worker 869*333d2b36SAndroid Build Coastguard Worker // in case that apex_set replaces source apex (using prefer: prop) 870*333d2b36SAndroid Build Coastguard Worker a.compatSymlinks = makeCompatSymlinks(a.BaseModuleName(), ctx) 871*333d2b36SAndroid Build Coastguard Worker // or that apex_set overrides other apexes (using overrides: prop) 872*333d2b36SAndroid Build Coastguard Worker for _, overridden := range a.prebuiltCommonProperties.Overrides { 873*333d2b36SAndroid Build Coastguard Worker a.compatSymlinks = append(a.compatSymlinks, makeCompatSymlinks(overridden, ctx)...) 874*333d2b36SAndroid Build Coastguard Worker } 875*333d2b36SAndroid Build Coastguard Worker 876*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{a.outputApex}, "") 877*333d2b36SAndroid Build Coastguard Worker} 878*333d2b36SAndroid Build Coastguard Worker 879*333d2b36SAndroid Build Coastguard Workertype systemExtContext struct { 880*333d2b36SAndroid Build Coastguard Worker android.ModuleContext 881*333d2b36SAndroid Build Coastguard Worker} 882*333d2b36SAndroid Build Coastguard Worker 883*333d2b36SAndroid Build Coastguard Workerfunc (*systemExtContext) SystemExtSpecific() bool { 884*333d2b36SAndroid Build Coastguard Worker return true 885*333d2b36SAndroid Build Coastguard Worker} 886