1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 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 Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "crypto/sha256" 19*333d2b36SAndroid Build Coastguard Worker "fmt" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "slices" 22*333d2b36SAndroid Build Coastguard Worker "strings" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 25*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 28*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/depset" 29*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 30*333d2b36SAndroid Build Coastguard Worker) 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Workertype AndroidLibraryDependency interface { 33*333d2b36SAndroid Build Coastguard Worker ExportPackage() android.Path 34*333d2b36SAndroid Build Coastguard Worker ResourcesNodeDepSet() depset.DepSet[*resourcesNode] 35*333d2b36SAndroid Build Coastguard Worker RRODirsDepSet() depset.DepSet[rroDir] 36*333d2b36SAndroid Build Coastguard Worker ManifestsDepSet() depset.DepSet[android.Path] 37*333d2b36SAndroid Build Coastguard Worker SetRROEnforcedForDependent(enforce bool) 38*333d2b36SAndroid Build Coastguard Worker IsRROEnforced(ctx android.BaseModuleContext) bool 39*333d2b36SAndroid Build Coastguard Worker} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workerfunc init() { 42*333d2b36SAndroid Build Coastguard Worker RegisterAARBuildComponents(android.InitRegistrationContext) 43*333d2b36SAndroid Build Coastguard Worker} 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Workerfunc RegisterAARBuildComponents(ctx android.RegistrationContext) { 46*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("android_library_import", AARImportFactory) 47*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("android_library", AndroidLibraryFactory) 48*333d2b36SAndroid Build Coastguard Worker ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { 49*333d2b36SAndroid Build Coastguard Worker ctx.Transition("propagate_rro_enforcement", &propagateRROEnforcementTransitionMutator{}) 50*333d2b36SAndroid Build Coastguard Worker }) 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Worker// 54*333d2b36SAndroid Build Coastguard Worker// AAR (android library) 55*333d2b36SAndroid Build Coastguard Worker// 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workertype androidLibraryProperties struct { 58*333d2b36SAndroid Build Coastguard Worker BuildAAR bool `blueprint:"mutated"` 59*333d2b36SAndroid Build Coastguard Worker} 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Workertype aaptProperties struct { 62*333d2b36SAndroid Build Coastguard Worker // flags passed to aapt when creating the apk 63*333d2b36SAndroid Build Coastguard Worker Aaptflags []string 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker // include all resource configurations, not just the product-configured 66*333d2b36SAndroid Build Coastguard Worker // ones. 67*333d2b36SAndroid Build Coastguard Worker Aapt_include_all_resources *bool 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker // list of files to use as assets. 70*333d2b36SAndroid Build Coastguard Worker Assets []string `android:"path"` 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker // list of directories relative to the Blueprints file containing assets. 73*333d2b36SAndroid Build Coastguard Worker // Defaults to ["assets"] if a directory called assets exists. Set to [] 74*333d2b36SAndroid Build Coastguard Worker // to disable the default. 75*333d2b36SAndroid Build Coastguard Worker Asset_dirs []string 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker // list of directories relative to the Blueprints file containing 78*333d2b36SAndroid Build Coastguard Worker // Android resources. Defaults to ["res"] if a directory called res exists. 79*333d2b36SAndroid Build Coastguard Worker // Set to [] to disable the default. 80*333d2b36SAndroid Build Coastguard Worker Resource_dirs proptools.Configurable[[]string] `android:"path"` 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker // list of zip files containing Android resources. 83*333d2b36SAndroid Build Coastguard Worker Resource_zips []string `android:"path"` 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker // path to AndroidManifest.xml. If unset, defaults to "AndroidManifest.xml". 86*333d2b36SAndroid Build Coastguard Worker Manifest *string `android:"path"` 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker // paths to additional manifest files to merge with main manifest. 89*333d2b36SAndroid Build Coastguard Worker Additional_manifests []string `android:"path"` 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker // do not include AndroidManifest from dependent libraries 92*333d2b36SAndroid Build Coastguard Worker Dont_merge_manifests *bool 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker // If use_resource_processor is set, use Bazel's resource processor instead of aapt2 to generate R.class files. 95*333d2b36SAndroid Build Coastguard Worker // The resource processor produces more optimal R.class files that only list resources in the package of the 96*333d2b36SAndroid Build Coastguard Worker // library that provided them, as opposed to aapt2 which produces R.java files for every package containing 97*333d2b36SAndroid Build Coastguard Worker // every resource. Using the resource processor can provide significant build time speedups, but requires 98*333d2b36SAndroid Build Coastguard Worker // fixing the module to use the correct package to reference each resource, and to avoid having any other 99*333d2b36SAndroid Build Coastguard Worker // libraries in the tree that use the same package name. Defaults to false, but will default to true in the 100*333d2b36SAndroid Build Coastguard Worker // future. 101*333d2b36SAndroid Build Coastguard Worker Use_resource_processor *bool 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker // true if RRO is enforced for any of the dependent modules 104*333d2b36SAndroid Build Coastguard Worker RROEnforcedForDependent bool `blueprint:"mutated"` 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker // Filter only specified product and ignore other products 107*333d2b36SAndroid Build Coastguard Worker Filter_product *string `blueprint:"mutated"` 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker // Names of aconfig_declarations modules that specify aconfig flags that the module depends on. 110*333d2b36SAndroid Build Coastguard Worker Flags_packages []string 111*333d2b36SAndroid Build Coastguard Worker} 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Workertype aapt struct { 114*333d2b36SAndroid Build Coastguard Worker aaptSrcJar android.Path 115*333d2b36SAndroid Build Coastguard Worker transitiveAaptRJars android.Paths 116*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackagesFile android.Path 117*333d2b36SAndroid Build Coastguard Worker exportPackage android.Path 118*333d2b36SAndroid Build Coastguard Worker manifestPath android.Path 119*333d2b36SAndroid Build Coastguard Worker proguardOptionsFile android.Path 120*333d2b36SAndroid Build Coastguard Worker rTxt android.Path 121*333d2b36SAndroid Build Coastguard Worker rJar android.Path 122*333d2b36SAndroid Build Coastguard Worker extraAaptPackagesFile android.Path 123*333d2b36SAndroid Build Coastguard Worker mergedManifestFile android.Path 124*333d2b36SAndroid Build Coastguard Worker noticeFile android.OptionalPath 125*333d2b36SAndroid Build Coastguard Worker assetPackage android.OptionalPath 126*333d2b36SAndroid Build Coastguard Worker isLibrary bool 127*333d2b36SAndroid Build Coastguard Worker defaultManifestVersion string 128*333d2b36SAndroid Build Coastguard Worker useEmbeddedNativeLibs bool 129*333d2b36SAndroid Build Coastguard Worker useEmbeddedDex bool 130*333d2b36SAndroid Build Coastguard Worker usesNonSdkApis bool 131*333d2b36SAndroid Build Coastguard Worker hasNoCode bool 132*333d2b36SAndroid Build Coastguard Worker LoggingParent string 133*333d2b36SAndroid Build Coastguard Worker resourceFiles android.Paths 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker splitNames []string 136*333d2b36SAndroid Build Coastguard Worker splits []split 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker aaptProperties aaptProperties 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker resourcesNodesDepSet depset.DepSet[*resourcesNode] 141*333d2b36SAndroid Build Coastguard Worker rroDirsDepSet depset.DepSet[rroDir] 142*333d2b36SAndroid Build Coastguard Worker manifestsDepSet depset.DepSet[android.Path] 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Worker manifestValues struct { 145*333d2b36SAndroid Build Coastguard Worker applicationId string 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker} 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Workertype split struct { 150*333d2b36SAndroid Build Coastguard Worker name string 151*333d2b36SAndroid Build Coastguard Worker suffix string 152*333d2b36SAndroid Build Coastguard Worker path android.Path 153*333d2b36SAndroid Build Coastguard Worker} 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Worker// Propagate RRO enforcement flag to static lib dependencies transitively. If EnforceRROGlobally is set then 156*333d2b36SAndroid Build Coastguard Worker// all modules will use the "" variant. If specific modules have RRO enforced, then modules (usually apps) with 157*333d2b36SAndroid Build Coastguard Worker// RRO enabled will use the "" variation for themselves, but use the "rro" variant of direct and transitive static 158*333d2b36SAndroid Build Coastguard Worker// android_library dependencies. 159*333d2b36SAndroid Build Coastguard Workertype propagateRROEnforcementTransitionMutator struct{} 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Workerfunc (p propagateRROEnforcementTransitionMutator) Split(ctx android.BaseModuleContext) []string { 162*333d2b36SAndroid Build Coastguard Worker // Never split modules, apps with or without RRO enabled use the "" variant, static android_library dependencies 163*333d2b36SAndroid Build Coastguard Worker // will use create the "rro" variant from incoming tranisitons. 164*333d2b36SAndroid Build Coastguard Worker return []string{""} 165*333d2b36SAndroid Build Coastguard Worker} 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Workerfunc (p propagateRROEnforcementTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { 168*333d2b36SAndroid Build Coastguard Worker // Non-static dependencies are not involved in RRO and always use the empty variant. 169*333d2b36SAndroid Build Coastguard Worker if ctx.DepTag() != staticLibTag { 170*333d2b36SAndroid Build Coastguard Worker return "" 171*333d2b36SAndroid Build Coastguard Worker } 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker m := ctx.Module() 174*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(AndroidLibraryDependency); ok { 175*333d2b36SAndroid Build Coastguard Worker // If RRO is enforced globally don't bother using "rro" variants, the empty variant will have RRO enabled. 176*333d2b36SAndroid Build Coastguard Worker if ctx.Config().EnforceRROGlobally() { 177*333d2b36SAndroid Build Coastguard Worker return "" 178*333d2b36SAndroid Build Coastguard Worker } 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Worker // If RRO is enabled for this module use the "rro" variants of static dependencies. IncomingTransition will 181*333d2b36SAndroid Build Coastguard Worker // rewrite this back to "" if the dependency is not an android_library. 182*333d2b36SAndroid Build Coastguard Worker if ctx.Config().EnforceRROForModule(ctx.Module().Name()) { 183*333d2b36SAndroid Build Coastguard Worker return "rro" 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker } 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Worker return sourceVariation 188*333d2b36SAndroid Build Coastguard Worker} 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Workerfunc (p propagateRROEnforcementTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { 191*333d2b36SAndroid Build Coastguard Worker // Propagate the "rro" variant to android_library modules, but use the empty variant for everything else. 192*333d2b36SAndroid Build Coastguard Worker if incomingVariation == "rro" { 193*333d2b36SAndroid Build Coastguard Worker m := ctx.Module() 194*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(AndroidLibraryDependency); ok { 195*333d2b36SAndroid Build Coastguard Worker return "rro" 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker return "" 198*333d2b36SAndroid Build Coastguard Worker } 199*333d2b36SAndroid Build Coastguard Worker 200*333d2b36SAndroid Build Coastguard Worker return "" 201*333d2b36SAndroid Build Coastguard Worker} 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Workerfunc (p propagateRROEnforcementTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { 204*333d2b36SAndroid Build Coastguard Worker m := ctx.Module() 205*333d2b36SAndroid Build Coastguard Worker if d, ok := m.(AndroidLibraryDependency); ok { 206*333d2b36SAndroid Build Coastguard Worker if variation == "rro" { 207*333d2b36SAndroid Build Coastguard Worker // This is the "rro" variant of a module that has both variants, mark this one as RRO enabled and 208*333d2b36SAndroid Build Coastguard Worker // hide it from make to avoid collisions with the non-RRO empty variant. 209*333d2b36SAndroid Build Coastguard Worker d.SetRROEnforcedForDependent(true) 210*333d2b36SAndroid Build Coastguard Worker m.HideFromMake() 211*333d2b36SAndroid Build Coastguard Worker } else if ctx.Config().EnforceRROGlobally() { 212*333d2b36SAndroid Build Coastguard Worker // RRO is enabled globally, mark it enabled for this module, but there is only one variant so no 213*333d2b36SAndroid Build Coastguard Worker // need to hide it from make. 214*333d2b36SAndroid Build Coastguard Worker d.SetRROEnforcedForDependent(true) 215*333d2b36SAndroid Build Coastguard Worker } 216*333d2b36SAndroid Build Coastguard Worker } 217*333d2b36SAndroid Build Coastguard Worker} 218*333d2b36SAndroid Build Coastguard Worker 219*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) useResourceProcessorBusyBox(ctx android.BaseModuleContext) bool { 220*333d2b36SAndroid Build Coastguard Worker return BoolDefault(a.aaptProperties.Use_resource_processor, ctx.Config().UseResourceProcessorByDefault()) && 221*333d2b36SAndroid Build Coastguard Worker // TODO(b/331641946): remove this when ResourceProcessorBusyBox supports generating shared libraries. 222*333d2b36SAndroid Build Coastguard Worker !slices.Contains(a.aaptProperties.Aaptflags, "--shared-lib") && 223*333d2b36SAndroid Build Coastguard Worker // Use the legacy resource processor in kythe builds. 224*333d2b36SAndroid Build Coastguard Worker // The legacy resource processor creates an R.srcjar, which kythe can use for generating crossrefs. 225*333d2b36SAndroid Build Coastguard Worker // TODO(b/354854007): Re-enable BusyBox in kythe builds 226*333d2b36SAndroid Build Coastguard Worker !ctx.Config().EmitXrefRules() 227*333d2b36SAndroid Build Coastguard Worker} 228*333d2b36SAndroid Build Coastguard Worker 229*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) filterProduct() string { 230*333d2b36SAndroid Build Coastguard Worker return String(a.aaptProperties.Filter_product) 231*333d2b36SAndroid Build Coastguard Worker} 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) ExportPackage() android.Path { 234*333d2b36SAndroid Build Coastguard Worker return a.exportPackage 235*333d2b36SAndroid Build Coastguard Worker} 236*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) ResourcesNodeDepSet() depset.DepSet[*resourcesNode] { 237*333d2b36SAndroid Build Coastguard Worker return a.resourcesNodesDepSet 238*333d2b36SAndroid Build Coastguard Worker} 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) RRODirsDepSet() depset.DepSet[rroDir] { 241*333d2b36SAndroid Build Coastguard Worker return a.rroDirsDepSet 242*333d2b36SAndroid Build Coastguard Worker} 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) ManifestsDepSet() depset.DepSet[android.Path] { 245*333d2b36SAndroid Build Coastguard Worker return a.manifestsDepSet 246*333d2b36SAndroid Build Coastguard Worker} 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) SetRROEnforcedForDependent(enforce bool) { 249*333d2b36SAndroid Build Coastguard Worker a.aaptProperties.RROEnforcedForDependent = enforce 250*333d2b36SAndroid Build Coastguard Worker} 251*333d2b36SAndroid Build Coastguard Worker 252*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) IsRROEnforced(ctx android.BaseModuleContext) bool { 253*333d2b36SAndroid Build Coastguard Worker // True if RRO is enforced for this module or... 254*333d2b36SAndroid Build Coastguard Worker return ctx.Config().EnforceRROForModule(ctx.ModuleName()) || 255*333d2b36SAndroid Build Coastguard Worker // if RRO is enforced for any of its dependents. 256*333d2b36SAndroid Build Coastguard Worker a.aaptProperties.RROEnforcedForDependent 257*333d2b36SAndroid Build Coastguard Worker} 258*333d2b36SAndroid Build Coastguard Worker 259*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext android.SdkContext, 260*333d2b36SAndroid Build Coastguard Worker manifestPath android.Path, doNotIncludeAssetDirImplicitly bool) (compileFlags, linkFlags []string, linkDeps android.Paths, 261*333d2b36SAndroid Build Coastguard Worker resDirs, overlayDirs []globbedResourceDir, rroDirs []rroDir, resZips android.Paths) { 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Worker hasVersionCode := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-code") 264*333d2b36SAndroid Build Coastguard Worker hasVersionName := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-name") 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Worker // Flags specified in Android.bp 267*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, a.aaptProperties.Aaptflags...) 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--enable-compact-entries") 270*333d2b36SAndroid Build Coastguard Worker 271*333d2b36SAndroid Build Coastguard Worker // Find implicit or explicit asset and resource dirs 272*333d2b36SAndroid Build Coastguard Worker assets := android.PathsRelativeToModuleSourceDir(android.SourceInput{ 273*333d2b36SAndroid Build Coastguard Worker Context: ctx, 274*333d2b36SAndroid Build Coastguard Worker Paths: a.aaptProperties.Assets, 275*333d2b36SAndroid Build Coastguard Worker IncludeDirs: false, 276*333d2b36SAndroid Build Coastguard Worker }) 277*333d2b36SAndroid Build Coastguard Worker var assetDirs android.Paths 278*333d2b36SAndroid Build Coastguard Worker if doNotIncludeAssetDirImplicitly { 279*333d2b36SAndroid Build Coastguard Worker assetDirs = android.PathsForModuleSrc(ctx, a.aaptProperties.Asset_dirs) 280*333d2b36SAndroid Build Coastguard Worker } else { 281*333d2b36SAndroid Build Coastguard Worker assetDirs = android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets") 282*333d2b36SAndroid Build Coastguard Worker } 283*333d2b36SAndroid Build Coastguard Worker resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs.GetOrDefault(ctx, nil), "res") 284*333d2b36SAndroid Build Coastguard Worker resourceZips := android.PathsForModuleSrc(ctx, a.aaptProperties.Resource_zips) 285*333d2b36SAndroid Build Coastguard Worker 286*333d2b36SAndroid Build Coastguard Worker // Glob directories into lists of paths 287*333d2b36SAndroid Build Coastguard Worker for _, dir := range resourceDirs { 288*333d2b36SAndroid Build Coastguard Worker resDirs = append(resDirs, globbedResourceDir{ 289*333d2b36SAndroid Build Coastguard Worker dir: dir, 290*333d2b36SAndroid Build Coastguard Worker files: androidResourceGlob(ctx, dir), 291*333d2b36SAndroid Build Coastguard Worker }) 292*333d2b36SAndroid Build Coastguard Worker resOverlayDirs, resRRODirs := overlayResourceGlob(ctx, a, dir) 293*333d2b36SAndroid Build Coastguard Worker overlayDirs = append(overlayDirs, resOverlayDirs...) 294*333d2b36SAndroid Build Coastguard Worker rroDirs = append(rroDirs, resRRODirs...) 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker assetDirsHasher := sha256.New() 298*333d2b36SAndroid Build Coastguard Worker var assetDeps android.Paths 299*333d2b36SAndroid Build Coastguard Worker for _, dir := range assetDirs { 300*333d2b36SAndroid Build Coastguard Worker // Add a dependency on every file in the asset directory. This ensures the aapt2 301*333d2b36SAndroid Build Coastguard Worker // rule will be rerun if one of the files in the asset directory is modified. 302*333d2b36SAndroid Build Coastguard Worker dirContents := androidResourceGlob(ctx, dir) 303*333d2b36SAndroid Build Coastguard Worker assetDeps = append(assetDeps, dirContents...) 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker // Add a hash of all the files in the asset directory to the command line. 306*333d2b36SAndroid Build Coastguard Worker // This ensures the aapt2 rule will be run if a file is removed from the asset directory, 307*333d2b36SAndroid Build Coastguard Worker // or a file is added whose timestamp is older than the output of aapt2. 308*333d2b36SAndroid Build Coastguard Worker for _, path := range dirContents.Strings() { 309*333d2b36SAndroid Build Coastguard Worker assetDirsHasher.Write([]byte(path)) 310*333d2b36SAndroid Build Coastguard Worker } 311*333d2b36SAndroid Build Coastguard Worker } 312*333d2b36SAndroid Build Coastguard Worker 313*333d2b36SAndroid Build Coastguard Worker assetDirStrings := assetDirs.Strings() 314*333d2b36SAndroid Build Coastguard Worker if a.noticeFile.Valid() { 315*333d2b36SAndroid Build Coastguard Worker assetDirStrings = append(assetDirStrings, filepath.Dir(a.noticeFile.Path().String())) 316*333d2b36SAndroid Build Coastguard Worker assetDeps = append(assetDeps, a.noticeFile.Path()) 317*333d2b36SAndroid Build Coastguard Worker } 318*333d2b36SAndroid Build Coastguard Worker if len(assets) > 0 { 319*333d2b36SAndroid Build Coastguard Worker // aapt2 doesn't support adding individual asset files. Create a temp directory to hold asset 320*333d2b36SAndroid Build Coastguard Worker // files and pass it to aapt2. 321*333d2b36SAndroid Build Coastguard Worker tmpAssetDir := android.PathForModuleOut(ctx, "tmp_asset_dir") 322*333d2b36SAndroid Build Coastguard Worker 323*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 324*333d2b36SAndroid Build Coastguard Worker rule.Command(). 325*333d2b36SAndroid Build Coastguard Worker Text("rm -rf").Text(tmpAssetDir.String()). 326*333d2b36SAndroid Build Coastguard Worker Text("&&"). 327*333d2b36SAndroid Build Coastguard Worker Text("mkdir -p").Text(tmpAssetDir.String()) 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Worker for _, asset := range assets { 330*333d2b36SAndroid Build Coastguard Worker output := tmpAssetDir.Join(ctx, asset.Rel()) 331*333d2b36SAndroid Build Coastguard Worker assetDeps = append(assetDeps, output) 332*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("mkdir -p").Text(filepath.Dir(output.String())) 333*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("cp").Input(asset).Output(output) 334*333d2b36SAndroid Build Coastguard Worker } 335*333d2b36SAndroid Build Coastguard Worker 336*333d2b36SAndroid Build Coastguard Worker rule.Build("tmp_asset_dir", "tmp_asset_dir") 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker assetDirStrings = append(assetDirStrings, tmpAssetDir.String()) 339*333d2b36SAndroid Build Coastguard Worker } 340*333d2b36SAndroid Build Coastguard Worker 341*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--manifest "+manifestPath.String()) 342*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, manifestPath) 343*333d2b36SAndroid Build Coastguard Worker 344*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, android.JoinWithPrefix(assetDirStrings, "-A ")) 345*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, fmt.Sprintf("$$(: %x)", assetDirsHasher.Sum(nil))) 346*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, assetDeps...) 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker // Returns the effective version for {min|target}_sdk_version 349*333d2b36SAndroid Build Coastguard Worker effectiveVersionString := func(sdkVersion android.SdkSpec, minSdkVersion android.ApiLevel) string { 350*333d2b36SAndroid Build Coastguard Worker // If {min|target}_sdk_version is current, use sdk_version to determine the effective level 351*333d2b36SAndroid Build Coastguard Worker // This is necessary for vendor modules. 352*333d2b36SAndroid Build Coastguard Worker // The effective version does not _only_ depend on {min|target}_sdk_version(level), 353*333d2b36SAndroid Build Coastguard Worker // but also on the sdk_version (kind+level) 354*333d2b36SAndroid Build Coastguard Worker if minSdkVersion.IsCurrent() { 355*333d2b36SAndroid Build Coastguard Worker ret, err := sdkVersion.EffectiveVersionString(ctx) 356*333d2b36SAndroid Build Coastguard Worker if err != nil { 357*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("invalid sdk_version: %s", err) 358*333d2b36SAndroid Build Coastguard Worker } 359*333d2b36SAndroid Build Coastguard Worker return ret 360*333d2b36SAndroid Build Coastguard Worker } 361*333d2b36SAndroid Build Coastguard Worker ret, err := minSdkVersion.EffectiveVersionString(ctx) 362*333d2b36SAndroid Build Coastguard Worker if err != nil { 363*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("invalid min_sdk_version: %s", err) 364*333d2b36SAndroid Build Coastguard Worker } 365*333d2b36SAndroid Build Coastguard Worker return ret 366*333d2b36SAndroid Build Coastguard Worker } 367*333d2b36SAndroid Build Coastguard Worker // SDK version flags 368*333d2b36SAndroid Build Coastguard Worker sdkVersion := sdkContext.SdkVersion(ctx) 369*333d2b36SAndroid Build Coastguard Worker minSdkVersion := effectiveVersionString(sdkVersion, sdkContext.MinSdkVersion(ctx)) 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--min-sdk-version "+minSdkVersion) 372*333d2b36SAndroid Build Coastguard Worker // Use minSdkVersion for target-sdk-version, even if `target_sdk_version` is set 373*333d2b36SAndroid Build Coastguard Worker // This behavior has been copied from Make. 374*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--target-sdk-version "+minSdkVersion) 375*333d2b36SAndroid Build Coastguard Worker 376*333d2b36SAndroid Build Coastguard Worker // Version code 377*333d2b36SAndroid Build Coastguard Worker if !hasVersionCode { 378*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--version-code", ctx.Config().PlatformSdkVersion().String()) 379*333d2b36SAndroid Build Coastguard Worker } 380*333d2b36SAndroid Build Coastguard Worker 381*333d2b36SAndroid Build Coastguard Worker if !hasVersionName { 382*333d2b36SAndroid Build Coastguard Worker var versionName string 383*333d2b36SAndroid Build Coastguard Worker if ctx.ModuleName() == "framework-res" { 384*333d2b36SAndroid Build Coastguard Worker // Some builds set AppsDefaultVersionName() to include the build number ("O-123456"). aapt2 copies the 385*333d2b36SAndroid Build Coastguard Worker // version name of framework-res into app manifests as compileSdkVersionCodename, which confuses things 386*333d2b36SAndroid Build Coastguard Worker // if it contains the build number. Use the PlatformVersionName instead. 387*333d2b36SAndroid Build Coastguard Worker versionName = ctx.Config().PlatformVersionName() 388*333d2b36SAndroid Build Coastguard Worker } else { 389*333d2b36SAndroid Build Coastguard Worker versionName = ctx.Config().AppsDefaultVersionName() 390*333d2b36SAndroid Build Coastguard Worker } 391*333d2b36SAndroid Build Coastguard Worker versionName = proptools.NinjaEscape(versionName) 392*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--version-name ", versionName) 393*333d2b36SAndroid Build Coastguard Worker } 394*333d2b36SAndroid Build Coastguard Worker 395*333d2b36SAndroid Build Coastguard Worker linkFlags, compileFlags = android.FilterList(linkFlags, []string{"--legacy"}) 396*333d2b36SAndroid Build Coastguard Worker 397*333d2b36SAndroid Build Coastguard Worker // Always set --pseudo-localize, it will be stripped out later for release 398*333d2b36SAndroid Build Coastguard Worker // builds that don't want it. 399*333d2b36SAndroid Build Coastguard Worker compileFlags = append(compileFlags, "--pseudo-localize") 400*333d2b36SAndroid Build Coastguard Worker 401*333d2b36SAndroid Build Coastguard Worker return compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resourceZips 402*333d2b36SAndroid Build Coastguard Worker} 403*333d2b36SAndroid Build Coastguard Worker 404*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkDep sdkDep) { 405*333d2b36SAndroid Build Coastguard Worker if sdkDep.frameworkResModule != "" { 406*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule) 407*333d2b36SAndroid Build Coastguard Worker } 408*333d2b36SAndroid Build Coastguard Worker} 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Workervar extractAssetsRule = pctx.AndroidStaticRule("extractAssets", 411*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 412*333d2b36SAndroid Build Coastguard Worker Command: `${config.Zip2ZipCmd} -i ${in} -o ${out} "assets/**/*"`, 413*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.Zip2ZipCmd}"}, 414*333d2b36SAndroid Build Coastguard Worker }) 415*333d2b36SAndroid Build Coastguard Worker 416*333d2b36SAndroid Build Coastguard Workertype aaptBuildActionOptions struct { 417*333d2b36SAndroid Build Coastguard Worker sdkContext android.SdkContext 418*333d2b36SAndroid Build Coastguard Worker classLoaderContexts dexpreopt.ClassLoaderContextMap 419*333d2b36SAndroid Build Coastguard Worker excludedLibs []string 420*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion bool 421*333d2b36SAndroid Build Coastguard Worker forceNonFinalResourceIDs bool 422*333d2b36SAndroid Build Coastguard Worker extraLinkFlags []string 423*333d2b36SAndroid Build Coastguard Worker aconfigTextFiles android.Paths 424*333d2b36SAndroid Build Coastguard Worker usesLibrary *usesLibrary 425*333d2b36SAndroid Build Coastguard Worker // If rroDirs is provided, it will be used to generate package-res.apk 426*333d2b36SAndroid Build Coastguard Worker rroDirs *android.Paths 427*333d2b36SAndroid Build Coastguard Worker // If manifestForAapt is not nil, it will be used for aapt instead of the default source manifest. 428*333d2b36SAndroid Build Coastguard Worker manifestForAapt android.Path 429*333d2b36SAndroid Build Coastguard Worker} 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Workerfunc filterRRO(rroDirsDepSet depset.DepSet[rroDir], filter overlayType) android.Paths { 432*333d2b36SAndroid Build Coastguard Worker var paths android.Paths 433*333d2b36SAndroid Build Coastguard Worker seen := make(map[android.Path]bool) 434*333d2b36SAndroid Build Coastguard Worker for _, d := range rroDirsDepSet.ToList() { 435*333d2b36SAndroid Build Coastguard Worker if d.overlayType == filter { 436*333d2b36SAndroid Build Coastguard Worker if seen[d.path] { 437*333d2b36SAndroid Build Coastguard Worker continue 438*333d2b36SAndroid Build Coastguard Worker } 439*333d2b36SAndroid Build Coastguard Worker seen[d.path] = true 440*333d2b36SAndroid Build Coastguard Worker paths = append(paths, d.path) 441*333d2b36SAndroid Build Coastguard Worker } 442*333d2b36SAndroid Build Coastguard Worker } 443*333d2b36SAndroid Build Coastguard Worker return paths 444*333d2b36SAndroid Build Coastguard Worker} 445*333d2b36SAndroid Build Coastguard Worker 446*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptions) { 447*333d2b36SAndroid Build Coastguard Worker 448*333d2b36SAndroid Build Coastguard Worker staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedExportPackages, libFlags := 449*333d2b36SAndroid Build Coastguard Worker aaptLibs(ctx, opts.sdkContext, opts.classLoaderContexts, opts.usesLibrary) 450*333d2b36SAndroid Build Coastguard Worker 451*333d2b36SAndroid Build Coastguard Worker // Exclude any libraries from the supplied list. 452*333d2b36SAndroid Build Coastguard Worker opts.classLoaderContexts = opts.classLoaderContexts.ExcludeLibs(opts.excludedLibs) 453*333d2b36SAndroid Build Coastguard Worker 454*333d2b36SAndroid Build Coastguard Worker // App manifest file 455*333d2b36SAndroid Build Coastguard Worker var manifestFilePath android.Path 456*333d2b36SAndroid Build Coastguard Worker if opts.manifestForAapt != nil { 457*333d2b36SAndroid Build Coastguard Worker manifestFilePath = opts.manifestForAapt 458*333d2b36SAndroid Build Coastguard Worker } else { 459*333d2b36SAndroid Build Coastguard Worker manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml") 460*333d2b36SAndroid Build Coastguard Worker manifestFilePath = android.PathForModuleSrc(ctx, manifestFile) 461*333d2b36SAndroid Build Coastguard Worker } 462*333d2b36SAndroid Build Coastguard Worker 463*333d2b36SAndroid Build Coastguard Worker manifestPath := ManifestFixer(ctx, manifestFilePath, ManifestFixerParams{ 464*333d2b36SAndroid Build Coastguard Worker SdkContext: opts.sdkContext, 465*333d2b36SAndroid Build Coastguard Worker ClassLoaderContexts: opts.classLoaderContexts, 466*333d2b36SAndroid Build Coastguard Worker IsLibrary: a.isLibrary, 467*333d2b36SAndroid Build Coastguard Worker DefaultManifestVersion: a.defaultManifestVersion, 468*333d2b36SAndroid Build Coastguard Worker UseEmbeddedNativeLibs: a.useEmbeddedNativeLibs, 469*333d2b36SAndroid Build Coastguard Worker UsesNonSdkApis: a.usesNonSdkApis, 470*333d2b36SAndroid Build Coastguard Worker UseEmbeddedDex: a.useEmbeddedDex, 471*333d2b36SAndroid Build Coastguard Worker HasNoCode: a.hasNoCode, 472*333d2b36SAndroid Build Coastguard Worker LoggingParent: a.LoggingParent, 473*333d2b36SAndroid Build Coastguard Worker EnforceDefaultTargetSdkVersion: opts.enforceDefaultTargetSdkVersion, 474*333d2b36SAndroid Build Coastguard Worker }) 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Worker staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList()) 477*333d2b36SAndroid Build Coastguard Worker sharedDeps := transitiveAarDeps(sharedResourcesNodesDepSet.ToList()) 478*333d2b36SAndroid Build Coastguard Worker 479*333d2b36SAndroid Build Coastguard Worker // Add additional manifest files to transitive manifests. 480*333d2b36SAndroid Build Coastguard Worker additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests) 481*333d2b36SAndroid Build Coastguard Worker transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...) 482*333d2b36SAndroid Build Coastguard Worker transitiveManifestPaths = append(transitiveManifestPaths, staticManifestsDepSet.ToList()...) 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Worker if len(transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) { 485*333d2b36SAndroid Build Coastguard Worker manifestMergerParams := ManifestMergerParams{ 486*333d2b36SAndroid Build Coastguard Worker staticLibManifests: transitiveManifestPaths[1:], 487*333d2b36SAndroid Build Coastguard Worker isLibrary: a.isLibrary, 488*333d2b36SAndroid Build Coastguard Worker packageName: a.manifestValues.applicationId, 489*333d2b36SAndroid Build Coastguard Worker } 490*333d2b36SAndroid Build Coastguard Worker a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], manifestMergerParams) 491*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(a.mergedManifestFile) 492*333d2b36SAndroid Build Coastguard Worker if !a.isLibrary { 493*333d2b36SAndroid Build Coastguard Worker // Only use the merged manifest for applications. For libraries, the transitive closure of manifests 494*333d2b36SAndroid Build Coastguard Worker // will be propagated to the final application and merged there. The merged manifest for libraries is 495*333d2b36SAndroid Build Coastguard Worker // only passed to Make, which can't handle transitive dependencies. 496*333d2b36SAndroid Build Coastguard Worker manifestPath = a.mergedManifestFile 497*333d2b36SAndroid Build Coastguard Worker } 498*333d2b36SAndroid Build Coastguard Worker } else { 499*333d2b36SAndroid Build Coastguard Worker a.mergedManifestFile = manifestPath 500*333d2b36SAndroid Build Coastguard Worker } 501*333d2b36SAndroid Build Coastguard Worker 502*333d2b36SAndroid Build Coastguard Worker // do not include assets in autogenerated RRO. 503*333d2b36SAndroid Build Coastguard Worker compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, opts.sdkContext, manifestPath, opts.rroDirs != nil) 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Worker a.rroDirsDepSet = depset.NewBuilder[rroDir](depset.TOPOLOGICAL). 506*333d2b36SAndroid Build Coastguard Worker Direct(rroDirs...). 507*333d2b36SAndroid Build Coastguard Worker Transitive(staticRRODirsDepSet).Build() 508*333d2b36SAndroid Build Coastguard Worker 509*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, libFlags...) 510*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, sharedExportPackages...) 511*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, staticDeps.resPackages()...) 512*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, opts.extraLinkFlags...) 513*333d2b36SAndroid Build Coastguard Worker if a.isLibrary { 514*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--static-lib") 515*333d2b36SAndroid Build Coastguard Worker } 516*333d2b36SAndroid Build Coastguard Worker if opts.forceNonFinalResourceIDs { 517*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--non-final-ids") 518*333d2b36SAndroid Build Coastguard Worker } 519*333d2b36SAndroid Build Coastguard Worker 520*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--no-static-lib-packages") 521*333d2b36SAndroid Build Coastguard Worker if a.isLibrary { 522*333d2b36SAndroid Build Coastguard Worker // Pass --merge-only to skip resource references validation until the final 523*333d2b36SAndroid Build Coastguard Worker // app link step when when all static libraries are present. 524*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--merge-only") 525*333d2b36SAndroid Build Coastguard Worker } 526*333d2b36SAndroid Build Coastguard Worker 527*333d2b36SAndroid Build Coastguard Worker packageRes := android.PathForModuleOut(ctx, "package-res.apk") 528*333d2b36SAndroid Build Coastguard Worker proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options") 529*333d2b36SAndroid Build Coastguard Worker rTxt := android.PathForModuleOut(ctx, "R.txt") 530*333d2b36SAndroid Build Coastguard Worker // This file isn't used by Soong, but is generated for exporting 531*333d2b36SAndroid Build Coastguard Worker extraPackages := android.PathForModuleOut(ctx, "extra_packages") 532*333d2b36SAndroid Build Coastguard Worker var transitiveRJars android.Paths 533*333d2b36SAndroid Build Coastguard Worker var srcJar android.WritablePath 534*333d2b36SAndroid Build Coastguard Worker 535*333d2b36SAndroid Build Coastguard Worker var compiledResDirs []android.Paths 536*333d2b36SAndroid Build Coastguard Worker for _, dir := range resDirs { 537*333d2b36SAndroid Build Coastguard Worker a.resourceFiles = append(a.resourceFiles, dir.files...) 538*333d2b36SAndroid Build Coastguard Worker compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files, 539*333d2b36SAndroid Build Coastguard Worker compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths()) 540*333d2b36SAndroid Build Coastguard Worker } 541*333d2b36SAndroid Build Coastguard Worker 542*333d2b36SAndroid Build Coastguard Worker for i, zip := range resZips { 543*333d2b36SAndroid Build Coastguard Worker flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i)) 544*333d2b36SAndroid Build Coastguard Worker aapt2CompileZip(ctx, flata, zip, "", compileFlags) 545*333d2b36SAndroid Build Coastguard Worker compiledResDirs = append(compiledResDirs, android.Paths{flata}) 546*333d2b36SAndroid Build Coastguard Worker } 547*333d2b36SAndroid Build Coastguard Worker 548*333d2b36SAndroid Build Coastguard Worker var compiledRes, compiledOverlay android.Paths 549*333d2b36SAndroid Build Coastguard Worker 550*333d2b36SAndroid Build Coastguard Worker // AAPT2 overlays are in lowest to highest priority order, reverse the topological order 551*333d2b36SAndroid Build Coastguard Worker // of transitiveStaticLibs. 552*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages()) 553*333d2b36SAndroid Build Coastguard Worker 554*333d2b36SAndroid Build Coastguard Worker if a.isLibrary && a.useResourceProcessorBusyBox(ctx) { 555*333d2b36SAndroid Build Coastguard Worker // When building an android_library with ResourceProcessorBusyBox enabled treat static library dependencies 556*333d2b36SAndroid Build Coastguard Worker // as imports. The resources from dependencies will not be merged into this module's package-res.apk, and 557*333d2b36SAndroid Build Coastguard Worker // instead modules depending on this module will reference package-res.apk from all transitive static 558*333d2b36SAndroid Build Coastguard Worker // dependencies. 559*333d2b36SAndroid Build Coastguard Worker for _, sharedDep := range sharedDeps { 560*333d2b36SAndroid Build Coastguard Worker if sharedDep.usedResourceProcessor { 561*333d2b36SAndroid Build Coastguard Worker transitiveRJars = append(transitiveRJars, sharedDep.rJar) 562*333d2b36SAndroid Build Coastguard Worker } 563*333d2b36SAndroid Build Coastguard Worker } 564*333d2b36SAndroid Build Coastguard Worker for _, staticDep := range staticDeps { 565*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, staticDep.resPackage) 566*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "-I "+staticDep.resPackage.String()) 567*333d2b36SAndroid Build Coastguard Worker if staticDep.usedResourceProcessor { 568*333d2b36SAndroid Build Coastguard Worker transitiveRJars = append(transitiveRJars, staticDep.rJar) 569*333d2b36SAndroid Build Coastguard Worker } 570*333d2b36SAndroid Build Coastguard Worker } 571*333d2b36SAndroid Build Coastguard Worker } else { 572*333d2b36SAndroid Build Coastguard Worker // When building an app or building a library without ResourceProcessorBusyBox enabled all static 573*333d2b36SAndroid Build Coastguard Worker // dependencies are compiled into this module's package-res.apk as overlays. 574*333d2b36SAndroid Build Coastguard Worker compiledOverlay = append(compiledOverlay, transitiveStaticLibs...) 575*333d2b36SAndroid Build Coastguard Worker } 576*333d2b36SAndroid Build Coastguard Worker 577*333d2b36SAndroid Build Coastguard Worker if len(transitiveStaticLibs) > 0 { 578*333d2b36SAndroid Build Coastguard Worker // If we are using static android libraries, every source file becomes an overlay. 579*333d2b36SAndroid Build Coastguard Worker // This is to emulate old AAPT behavior which simulated library support. 580*333d2b36SAndroid Build Coastguard Worker for _, compiledResDir := range compiledResDirs { 581*333d2b36SAndroid Build Coastguard Worker compiledOverlay = append(compiledOverlay, compiledResDir...) 582*333d2b36SAndroid Build Coastguard Worker } 583*333d2b36SAndroid Build Coastguard Worker } else if a.isLibrary { 584*333d2b36SAndroid Build Coastguard Worker // Otherwise, for a static library we treat all the resources equally with no overlay. 585*333d2b36SAndroid Build Coastguard Worker for _, compiledResDir := range compiledResDirs { 586*333d2b36SAndroid Build Coastguard Worker compiledRes = append(compiledRes, compiledResDir...) 587*333d2b36SAndroid Build Coastguard Worker } 588*333d2b36SAndroid Build Coastguard Worker } else if len(compiledResDirs) > 0 { 589*333d2b36SAndroid Build Coastguard Worker // Without static libraries, the first directory is our directory, which can then be 590*333d2b36SAndroid Build Coastguard Worker // overlaid by the rest. 591*333d2b36SAndroid Build Coastguard Worker compiledRes = append(compiledRes, compiledResDirs[0]...) 592*333d2b36SAndroid Build Coastguard Worker for _, compiledResDir := range compiledResDirs[1:] { 593*333d2b36SAndroid Build Coastguard Worker compiledOverlay = append(compiledOverlay, compiledResDir...) 594*333d2b36SAndroid Build Coastguard Worker } 595*333d2b36SAndroid Build Coastguard Worker } 596*333d2b36SAndroid Build Coastguard Worker 597*333d2b36SAndroid Build Coastguard Worker var compiledRro, compiledRroOverlay android.Paths 598*333d2b36SAndroid Build Coastguard Worker if opts.rroDirs != nil { 599*333d2b36SAndroid Build Coastguard Worker compiledRro, compiledRroOverlay = a.compileResInDir(ctx, *opts.rroDirs, compileFlags, opts.aconfigTextFiles) 600*333d2b36SAndroid Build Coastguard Worker } else { 601*333d2b36SAndroid Build Coastguard Worker // RRO enforcement is done based on module name. Compile the overlayDirs only if rroDirs is nil. 602*333d2b36SAndroid Build Coastguard Worker // This ensures that the autogenerated RROs do not compile the overlay dirs twice. 603*333d2b36SAndroid Build Coastguard Worker for _, dir := range overlayDirs { 604*333d2b36SAndroid Build Coastguard Worker compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files, 605*333d2b36SAndroid Build Coastguard Worker compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths()...) 606*333d2b36SAndroid Build Coastguard Worker } 607*333d2b36SAndroid Build Coastguard Worker } 608*333d2b36SAndroid Build Coastguard Worker 609*333d2b36SAndroid Build Coastguard Worker var splitPackages android.WritablePaths 610*333d2b36SAndroid Build Coastguard Worker var splits []split 611*333d2b36SAndroid Build Coastguard Worker 612*333d2b36SAndroid Build Coastguard Worker for _, s := range a.splitNames { 613*333d2b36SAndroid Build Coastguard Worker suffix := strings.Replace(s, ",", "_", -1) 614*333d2b36SAndroid Build Coastguard Worker path := android.PathForModuleOut(ctx, "package_"+suffix+".apk") 615*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--split", path.String()+":"+s) 616*333d2b36SAndroid Build Coastguard Worker splitPackages = append(splitPackages, path) 617*333d2b36SAndroid Build Coastguard Worker splits = append(splits, split{ 618*333d2b36SAndroid Build Coastguard Worker name: s, 619*333d2b36SAndroid Build Coastguard Worker suffix: suffix, 620*333d2b36SAndroid Build Coastguard Worker path: path, 621*333d2b36SAndroid Build Coastguard Worker }) 622*333d2b36SAndroid Build Coastguard Worker } 623*333d2b36SAndroid Build Coastguard Worker 624*333d2b36SAndroid Build Coastguard Worker if !a.useResourceProcessorBusyBox(ctx) { 625*333d2b36SAndroid Build Coastguard Worker // the subdir "android" is required to be filtered by package names 626*333d2b36SAndroid Build Coastguard Worker srcJar = android.PathForModuleGen(ctx, "android", "R.srcjar") 627*333d2b36SAndroid Build Coastguard Worker } 628*333d2b36SAndroid Build Coastguard Worker 629*333d2b36SAndroid Build Coastguard Worker // No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be 630*333d2b36SAndroid Build Coastguard Worker // provided to the final app aapt2Link step. 631*333d2b36SAndroid Build Coastguard Worker var transitiveAssets android.Paths 632*333d2b36SAndroid Build Coastguard Worker if !a.isLibrary { 633*333d2b36SAndroid Build Coastguard Worker transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets()) 634*333d2b36SAndroid Build Coastguard Worker } 635*333d2b36SAndroid Build Coastguard Worker if opts.rroDirs == nil { // link resources and overlay 636*333d2b36SAndroid Build Coastguard Worker aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, 637*333d2b36SAndroid Build Coastguard Worker linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages, 638*333d2b36SAndroid Build Coastguard Worker opts.aconfigTextFiles) 639*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(packageRes) 640*333d2b36SAndroid Build Coastguard Worker } else { // link autogenerated rro 641*333d2b36SAndroid Build Coastguard Worker if len(compiledRro) == 0 { 642*333d2b36SAndroid Build Coastguard Worker return 643*333d2b36SAndroid Build Coastguard Worker } 644*333d2b36SAndroid Build Coastguard Worker aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, 645*333d2b36SAndroid Build Coastguard Worker linkFlags, linkDeps, compiledRro, compiledRroOverlay, nil, nil, 646*333d2b36SAndroid Build Coastguard Worker opts.aconfigTextFiles) 647*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(packageRes) 648*333d2b36SAndroid Build Coastguard Worker } 649*333d2b36SAndroid Build Coastguard Worker 650*333d2b36SAndroid Build Coastguard Worker // Extract assets from the resource package output so that they can be used later in aapt2link 651*333d2b36SAndroid Build Coastguard Worker // for modules that depend on this one. 652*333d2b36SAndroid Build Coastguard Worker if android.PrefixInList(linkFlags, "-A ") { 653*333d2b36SAndroid Build Coastguard Worker assets := android.PathForModuleOut(ctx, "assets.zip") 654*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 655*333d2b36SAndroid Build Coastguard Worker Rule: extractAssetsRule, 656*333d2b36SAndroid Build Coastguard Worker Input: packageRes, 657*333d2b36SAndroid Build Coastguard Worker Output: assets, 658*333d2b36SAndroid Build Coastguard Worker Description: "extract assets from built resource file", 659*333d2b36SAndroid Build Coastguard Worker }) 660*333d2b36SAndroid Build Coastguard Worker a.assetPackage = android.OptionalPathForPath(assets) 661*333d2b36SAndroid Build Coastguard Worker } 662*333d2b36SAndroid Build Coastguard Worker 663*333d2b36SAndroid Build Coastguard Worker if a.useResourceProcessorBusyBox(ctx) { 664*333d2b36SAndroid Build Coastguard Worker rJar := android.PathForModuleOut(ctx, "busybox/R.jar") 665*333d2b36SAndroid Build Coastguard Worker resourceProcessorBusyBoxGenerateBinaryR(ctx, rTxt, a.mergedManifestFile, rJar, staticDeps, a.isLibrary, a.aaptProperties.Aaptflags, 666*333d2b36SAndroid Build Coastguard Worker opts.forceNonFinalResourceIDs) 667*333d2b36SAndroid Build Coastguard Worker aapt2ExtractExtraPackages(ctx, extraPackages, rJar) 668*333d2b36SAndroid Build Coastguard Worker transitiveRJars = append(transitiveRJars, rJar) 669*333d2b36SAndroid Build Coastguard Worker a.rJar = rJar 670*333d2b36SAndroid Build Coastguard Worker } else { 671*333d2b36SAndroid Build Coastguard Worker aapt2ExtractExtraPackages(ctx, extraPackages, srcJar) 672*333d2b36SAndroid Build Coastguard Worker } 673*333d2b36SAndroid Build Coastguard Worker 674*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackages := staticDeps.resPackages().Strings() 675*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool { 676*333d2b36SAndroid Build Coastguard Worker return p == packageRes.String() 677*333d2b36SAndroid Build Coastguard Worker }) 678*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages") 679*333d2b36SAndroid Build Coastguard Worker android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n")) 680*333d2b36SAndroid Build Coastguard Worker 681*333d2b36SAndroid Build Coastguard Worker // Reverse the list of R.jar files so that the current module comes first, and direct dependencies come before 682*333d2b36SAndroid Build Coastguard Worker // transitive dependencies. 683*333d2b36SAndroid Build Coastguard Worker transitiveRJars = android.ReversePaths(transitiveRJars) 684*333d2b36SAndroid Build Coastguard Worker 685*333d2b36SAndroid Build Coastguard Worker a.aaptSrcJar = srcJar 686*333d2b36SAndroid Build Coastguard Worker a.transitiveAaptRJars = transitiveRJars 687*333d2b36SAndroid Build Coastguard Worker a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile 688*333d2b36SAndroid Build Coastguard Worker a.exportPackage = packageRes 689*333d2b36SAndroid Build Coastguard Worker a.manifestPath = manifestPath 690*333d2b36SAndroid Build Coastguard Worker a.proguardOptionsFile = proguardOptionsFile 691*333d2b36SAndroid Build Coastguard Worker a.extraAaptPackagesFile = extraPackages 692*333d2b36SAndroid Build Coastguard Worker a.rTxt = rTxt 693*333d2b36SAndroid Build Coastguard Worker a.splits = splits 694*333d2b36SAndroid Build Coastguard Worker a.resourcesNodesDepSet = depset.NewBuilder[*resourcesNode](depset.TOPOLOGICAL). 695*333d2b36SAndroid Build Coastguard Worker Direct(&resourcesNode{ 696*333d2b36SAndroid Build Coastguard Worker resPackage: a.exportPackage, 697*333d2b36SAndroid Build Coastguard Worker manifest: a.manifestPath, 698*333d2b36SAndroid Build Coastguard Worker additionalManifests: additionalManifests, 699*333d2b36SAndroid Build Coastguard Worker rTxt: a.rTxt, 700*333d2b36SAndroid Build Coastguard Worker rJar: a.rJar, 701*333d2b36SAndroid Build Coastguard Worker assets: a.assetPackage, 702*333d2b36SAndroid Build Coastguard Worker 703*333d2b36SAndroid Build Coastguard Worker usedResourceProcessor: a.useResourceProcessorBusyBox(ctx), 704*333d2b36SAndroid Build Coastguard Worker }). 705*333d2b36SAndroid Build Coastguard Worker Transitive(staticResourcesNodesDepSet).Build() 706*333d2b36SAndroid Build Coastguard Worker a.manifestsDepSet = depset.NewBuilder[android.Path](depset.TOPOLOGICAL). 707*333d2b36SAndroid Build Coastguard Worker Direct(a.manifestPath). 708*333d2b36SAndroid Build Coastguard Worker DirectSlice(additionalManifests). 709*333d2b36SAndroid Build Coastguard Worker Transitive(staticManifestsDepSet).Build() 710*333d2b36SAndroid Build Coastguard Worker} 711*333d2b36SAndroid Build Coastguard Worker 712*333d2b36SAndroid Build Coastguard Worker// comileResInDir finds the resource files in dirs by globbing and then compiles them using aapt2 713*333d2b36SAndroid Build Coastguard Worker// returns the file paths of compiled resources 714*333d2b36SAndroid Build Coastguard Worker// dirs[0] is used as compileRes 715*333d2b36SAndroid Build Coastguard Worker// dirs[1:] is used as compileOverlay 716*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) compileResInDir(ctx android.ModuleContext, dirs android.Paths, compileFlags []string, aconfig android.Paths) (android.Paths, android.Paths) { 717*333d2b36SAndroid Build Coastguard Worker filesInDir := func(dir android.Path) android.Paths { 718*333d2b36SAndroid Build Coastguard Worker files, err := ctx.GlobWithDeps(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames) 719*333d2b36SAndroid Build Coastguard Worker if err != nil { 720*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("failed to glob overlay resource dir %q: %s", dir, err.Error()) 721*333d2b36SAndroid Build Coastguard Worker return nil 722*333d2b36SAndroid Build Coastguard Worker } 723*333d2b36SAndroid Build Coastguard Worker var filePaths android.Paths 724*333d2b36SAndroid Build Coastguard Worker for _, file := range files { 725*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(file, "/") { 726*333d2b36SAndroid Build Coastguard Worker continue // ignore directories 727*333d2b36SAndroid Build Coastguard Worker } 728*333d2b36SAndroid Build Coastguard Worker filePaths = append(filePaths, android.PathForSource(ctx, file)) 729*333d2b36SAndroid Build Coastguard Worker } 730*333d2b36SAndroid Build Coastguard Worker return filePaths 731*333d2b36SAndroid Build Coastguard Worker } 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Worker var compiledRes, compiledOverlay android.Paths 734*333d2b36SAndroid Build Coastguard Worker if len(dirs) == 0 { 735*333d2b36SAndroid Build Coastguard Worker return nil, nil 736*333d2b36SAndroid Build Coastguard Worker } 737*333d2b36SAndroid Build Coastguard Worker compiledRes = append(compiledRes, aapt2Compile(ctx, dirs[0], filesInDir(dirs[0]), compileFlags, a.filterProduct(), aconfig).Paths()...) 738*333d2b36SAndroid Build Coastguard Worker if len(dirs) > 0 { 739*333d2b36SAndroid Build Coastguard Worker for _, dir := range dirs[1:] { 740*333d2b36SAndroid Build Coastguard Worker compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir, filesInDir(dir), compileFlags, a.filterProduct(), aconfig).Paths()...) 741*333d2b36SAndroid Build Coastguard Worker } 742*333d2b36SAndroid Build Coastguard Worker } 743*333d2b36SAndroid Build Coastguard Worker return compiledRes, compiledOverlay 744*333d2b36SAndroid Build Coastguard Worker} 745*333d2b36SAndroid Build Coastguard Worker 746*333d2b36SAndroid Build Coastguard Workervar resourceProcessorBusyBox = pctx.AndroidStaticRule("resourceProcessorBusyBox", 747*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 748*333d2b36SAndroid Build Coastguard Worker Command: "${config.JavaCmd} -cp ${config.ResourceProcessorBusyBox} " + 749*333d2b36SAndroid Build Coastguard Worker "com.google.devtools.build.android.ResourceProcessorBusyBox --tool=GENERATE_BINARY_R -- @${out}.args && " + 750*333d2b36SAndroid Build Coastguard Worker "if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out}; fi", 751*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.ResourceProcessorBusyBox}"}, 752*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.args", 753*333d2b36SAndroid Build Coastguard Worker RspfileContent: "--primaryRTxt ${rTxt} --primaryManifest ${manifest} --classJarOutput ${out}.tmp ${args}", 754*333d2b36SAndroid Build Coastguard Worker Restat: true, 755*333d2b36SAndroid Build Coastguard Worker }, "rTxt", "manifest", "args") 756*333d2b36SAndroid Build Coastguard Worker 757*333d2b36SAndroid Build Coastguard Worker// resourceProcessorBusyBoxGenerateBinaryR converts the R.txt file produced by aapt2 into R.class files 758*333d2b36SAndroid Build Coastguard Worker// using Bazel's ResourceProcessorBusyBox tool, which is faster than compiling the R.java files and 759*333d2b36SAndroid Build Coastguard Worker// supports producing classes for static dependencies that only include resources from that dependency. 760*333d2b36SAndroid Build Coastguard Workerfunc resourceProcessorBusyBoxGenerateBinaryR(ctx android.ModuleContext, rTxt, manifest android.Path, 761*333d2b36SAndroid Build Coastguard Worker rJar android.WritablePath, transitiveDeps transitiveAarDeps, isLibrary bool, aaptFlags []string, 762*333d2b36SAndroid Build Coastguard Worker forceNonFinalIds bool) { 763*333d2b36SAndroid Build Coastguard Worker 764*333d2b36SAndroid Build Coastguard Worker var args []string 765*333d2b36SAndroid Build Coastguard Worker var deps android.Paths 766*333d2b36SAndroid Build Coastguard Worker 767*333d2b36SAndroid Build Coastguard Worker if !isLibrary { 768*333d2b36SAndroid Build Coastguard Worker // When compiling an app, pass all R.txt and AndroidManifest.xml from transitive static library dependencies 769*333d2b36SAndroid Build Coastguard Worker // to ResourceProcessorBusyBox so that it can regenerate R.class files with the final resource IDs for each 770*333d2b36SAndroid Build Coastguard Worker // package. 771*333d2b36SAndroid Build Coastguard Worker args, deps = transitiveDeps.resourceProcessorDeps() 772*333d2b36SAndroid Build Coastguard Worker if forceNonFinalIds { 773*333d2b36SAndroid Build Coastguard Worker args = append(args, "--finalFields=false") 774*333d2b36SAndroid Build Coastguard Worker } 775*333d2b36SAndroid Build Coastguard Worker } else { 776*333d2b36SAndroid Build Coastguard Worker // When compiling a library don't pass any dependencies as it only needs to generate an R.class file for this 777*333d2b36SAndroid Build Coastguard Worker // library. Pass --finalFields=false so that the R.class file contains non-final fields so they don't get 778*333d2b36SAndroid Build Coastguard Worker // inlined into the library before the final IDs are assigned during app compilation. 779*333d2b36SAndroid Build Coastguard Worker args = append(args, "--finalFields=false") 780*333d2b36SAndroid Build Coastguard Worker } 781*333d2b36SAndroid Build Coastguard Worker 782*333d2b36SAndroid Build Coastguard Worker for i, arg := range aaptFlags { 783*333d2b36SAndroid Build Coastguard Worker const AAPT_CUSTOM_PACKAGE = "--custom-package" 784*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(arg, AAPT_CUSTOM_PACKAGE) { 785*333d2b36SAndroid Build Coastguard Worker pkg := strings.TrimSpace(strings.TrimPrefix(arg, AAPT_CUSTOM_PACKAGE)) 786*333d2b36SAndroid Build Coastguard Worker if pkg == "" && i+1 < len(aaptFlags) { 787*333d2b36SAndroid Build Coastguard Worker pkg = aaptFlags[i+1] 788*333d2b36SAndroid Build Coastguard Worker } 789*333d2b36SAndroid Build Coastguard Worker args = append(args, "--packageForR "+pkg) 790*333d2b36SAndroid Build Coastguard Worker } 791*333d2b36SAndroid Build Coastguard Worker } 792*333d2b36SAndroid Build Coastguard Worker 793*333d2b36SAndroid Build Coastguard Worker deps = append(deps, rTxt, manifest) 794*333d2b36SAndroid Build Coastguard Worker 795*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 796*333d2b36SAndroid Build Coastguard Worker Rule: resourceProcessorBusyBox, 797*333d2b36SAndroid Build Coastguard Worker Output: rJar, 798*333d2b36SAndroid Build Coastguard Worker Implicits: deps, 799*333d2b36SAndroid Build Coastguard Worker Description: "ResourceProcessorBusyBox", 800*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 801*333d2b36SAndroid Build Coastguard Worker "rTxt": rTxt.String(), 802*333d2b36SAndroid Build Coastguard Worker "manifest": manifest.String(), 803*333d2b36SAndroid Build Coastguard Worker "args": strings.Join(args, " "), 804*333d2b36SAndroid Build Coastguard Worker }, 805*333d2b36SAndroid Build Coastguard Worker }) 806*333d2b36SAndroid Build Coastguard Worker} 807*333d2b36SAndroid Build Coastguard Worker 808*333d2b36SAndroid Build Coastguard Workertype resourcesNode struct { 809*333d2b36SAndroid Build Coastguard Worker resPackage android.Path 810*333d2b36SAndroid Build Coastguard Worker manifest android.Path 811*333d2b36SAndroid Build Coastguard Worker additionalManifests android.Paths 812*333d2b36SAndroid Build Coastguard Worker rTxt android.Path 813*333d2b36SAndroid Build Coastguard Worker rJar android.Path 814*333d2b36SAndroid Build Coastguard Worker assets android.OptionalPath 815*333d2b36SAndroid Build Coastguard Worker 816*333d2b36SAndroid Build Coastguard Worker usedResourceProcessor bool 817*333d2b36SAndroid Build Coastguard Worker} 818*333d2b36SAndroid Build Coastguard Worker 819*333d2b36SAndroid Build Coastguard Workertype transitiveAarDeps []*resourcesNode 820*333d2b36SAndroid Build Coastguard Worker 821*333d2b36SAndroid Build Coastguard Workerfunc (t transitiveAarDeps) resPackages() android.Paths { 822*333d2b36SAndroid Build Coastguard Worker paths := make(android.Paths, 0, len(t)) 823*333d2b36SAndroid Build Coastguard Worker for _, dep := range t { 824*333d2b36SAndroid Build Coastguard Worker paths = append(paths, dep.resPackage) 825*333d2b36SAndroid Build Coastguard Worker } 826*333d2b36SAndroid Build Coastguard Worker return paths 827*333d2b36SAndroid Build Coastguard Worker} 828*333d2b36SAndroid Build Coastguard Worker 829*333d2b36SAndroid Build Coastguard Workerfunc (t transitiveAarDeps) manifests() android.Paths { 830*333d2b36SAndroid Build Coastguard Worker paths := make(android.Paths, 0, len(t)) 831*333d2b36SAndroid Build Coastguard Worker for _, dep := range t { 832*333d2b36SAndroid Build Coastguard Worker paths = append(paths, dep.manifest) 833*333d2b36SAndroid Build Coastguard Worker paths = append(paths, dep.additionalManifests...) 834*333d2b36SAndroid Build Coastguard Worker } 835*333d2b36SAndroid Build Coastguard Worker return paths 836*333d2b36SAndroid Build Coastguard Worker} 837*333d2b36SAndroid Build Coastguard Worker 838*333d2b36SAndroid Build Coastguard Workerfunc (t transitiveAarDeps) resourceProcessorDeps() (args []string, deps android.Paths) { 839*333d2b36SAndroid Build Coastguard Worker for _, dep := range t { 840*333d2b36SAndroid Build Coastguard Worker args = append(args, "--library="+dep.rTxt.String()+","+dep.manifest.String()) 841*333d2b36SAndroid Build Coastguard Worker deps = append(deps, dep.rTxt, dep.manifest) 842*333d2b36SAndroid Build Coastguard Worker } 843*333d2b36SAndroid Build Coastguard Worker return args, deps 844*333d2b36SAndroid Build Coastguard Worker} 845*333d2b36SAndroid Build Coastguard Worker 846*333d2b36SAndroid Build Coastguard Workerfunc (t transitiveAarDeps) assets() android.Paths { 847*333d2b36SAndroid Build Coastguard Worker paths := make(android.Paths, 0, len(t)) 848*333d2b36SAndroid Build Coastguard Worker for _, dep := range t { 849*333d2b36SAndroid Build Coastguard Worker if dep.assets.Valid() { 850*333d2b36SAndroid Build Coastguard Worker paths = append(paths, dep.assets.Path()) 851*333d2b36SAndroid Build Coastguard Worker } 852*333d2b36SAndroid Build Coastguard Worker } 853*333d2b36SAndroid Build Coastguard Worker return paths 854*333d2b36SAndroid Build Coastguard Worker} 855*333d2b36SAndroid Build Coastguard Worker 856*333d2b36SAndroid Build Coastguard Worker// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths 857*333d2b36SAndroid Build Coastguard Workerfunc aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, 858*333d2b36SAndroid Build Coastguard Worker classLoaderContexts dexpreopt.ClassLoaderContextMap, usesLibrary *usesLibrary) ( 859*333d2b36SAndroid Build Coastguard Worker staticResourcesNodes, sharedResourcesNodes depset.DepSet[*resourcesNode], staticRRODirs depset.DepSet[rroDir], 860*333d2b36SAndroid Build Coastguard Worker staticManifests depset.DepSet[android.Path], sharedLibs android.Paths, flags []string) { 861*333d2b36SAndroid Build Coastguard Worker 862*333d2b36SAndroid Build Coastguard Worker if classLoaderContexts == nil { 863*333d2b36SAndroid Build Coastguard Worker // Not all callers need to compute class loader context, those who don't just pass nil. 864*333d2b36SAndroid Build Coastguard Worker // Create a temporary class loader context here (it will be computed, but not used). 865*333d2b36SAndroid Build Coastguard Worker classLoaderContexts = make(dexpreopt.ClassLoaderContextMap) 866*333d2b36SAndroid Build Coastguard Worker } 867*333d2b36SAndroid Build Coastguard Worker 868*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, sdkContext) 869*333d2b36SAndroid Build Coastguard Worker if sdkDep.useFiles { 870*333d2b36SAndroid Build Coastguard Worker sharedLibs = append(sharedLibs, sdkDep.jars...) 871*333d2b36SAndroid Build Coastguard Worker } 872*333d2b36SAndroid Build Coastguard Worker 873*333d2b36SAndroid Build Coastguard Worker var staticResourcesNodeDepSets []depset.DepSet[*resourcesNode] 874*333d2b36SAndroid Build Coastguard Worker var sharedResourcesNodeDepSets []depset.DepSet[*resourcesNode] 875*333d2b36SAndroid Build Coastguard Worker rroDirsDepSetBuilder := depset.NewBuilder[rroDir](depset.TOPOLOGICAL) 876*333d2b36SAndroid Build Coastguard Worker manifestsDepSetBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL) 877*333d2b36SAndroid Build Coastguard Worker 878*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 879*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(module) 880*333d2b36SAndroid Build Coastguard Worker 881*333d2b36SAndroid Build Coastguard Worker var exportPackage android.Path 882*333d2b36SAndroid Build Coastguard Worker aarDep, _ := module.(AndroidLibraryDependency) 883*333d2b36SAndroid Build Coastguard Worker if aarDep != nil { 884*333d2b36SAndroid Build Coastguard Worker exportPackage = aarDep.ExportPackage() 885*333d2b36SAndroid Build Coastguard Worker } 886*333d2b36SAndroid Build Coastguard Worker 887*333d2b36SAndroid Build Coastguard Worker switch depTag { 888*333d2b36SAndroid Build Coastguard Worker case instrumentationForTag: 889*333d2b36SAndroid Build Coastguard Worker // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2. 890*333d2b36SAndroid Build Coastguard Worker case sdkLibTag, libTag, rroDepTag: 891*333d2b36SAndroid Build Coastguard Worker if exportPackage != nil { 892*333d2b36SAndroid Build Coastguard Worker sharedResourcesNodeDepSets = append(sharedResourcesNodeDepSets, aarDep.ResourcesNodeDepSet()) 893*333d2b36SAndroid Build Coastguard Worker sharedLibs = append(sharedLibs, exportPackage) 894*333d2b36SAndroid Build Coastguard Worker } 895*333d2b36SAndroid Build Coastguard Worker case frameworkResTag: 896*333d2b36SAndroid Build Coastguard Worker if exportPackage != nil { 897*333d2b36SAndroid Build Coastguard Worker sharedLibs = append(sharedLibs, exportPackage) 898*333d2b36SAndroid Build Coastguard Worker } 899*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 900*333d2b36SAndroid Build Coastguard Worker if exportPackage != nil { 901*333d2b36SAndroid Build Coastguard Worker staticResourcesNodeDepSets = append(staticResourcesNodeDepSets, aarDep.ResourcesNodeDepSet()) 902*333d2b36SAndroid Build Coastguard Worker rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet()) 903*333d2b36SAndroid Build Coastguard Worker manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet()) 904*333d2b36SAndroid Build Coastguard Worker } 905*333d2b36SAndroid Build Coastguard Worker } 906*333d2b36SAndroid Build Coastguard Worker 907*333d2b36SAndroid Build Coastguard Worker addCLCFromDep(ctx, module, classLoaderContexts) 908*333d2b36SAndroid Build Coastguard Worker if usesLibrary != nil { 909*333d2b36SAndroid Build Coastguard Worker addMissingOptionalUsesLibsFromDep(ctx, module, usesLibrary) 910*333d2b36SAndroid Build Coastguard Worker } 911*333d2b36SAndroid Build Coastguard Worker }) 912*333d2b36SAndroid Build Coastguard Worker 913*333d2b36SAndroid Build Coastguard Worker // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later. 914*333d2b36SAndroid Build Coastguard Worker // Reverse the dependency order now going into the depset so that it comes out in order after the second 915*333d2b36SAndroid Build Coastguard Worker // reverse later. 916*333d2b36SAndroid Build Coastguard Worker // NOTE: this is legacy and probably incorrect behavior, for most other cases (e.g. conflicting classes in 917*333d2b36SAndroid Build Coastguard Worker // dependencies) the highest priority dependency is listed first, but for resources the highest priority 918*333d2b36SAndroid Build Coastguard Worker // dependency has to be listed last. This is also inconsistent with the way manifests from the same 919*333d2b36SAndroid Build Coastguard Worker // transitive dependencies are merged. 920*333d2b36SAndroid Build Coastguard Worker staticResourcesNodes = depset.New(depset.TOPOLOGICAL, nil, 921*333d2b36SAndroid Build Coastguard Worker android.ReverseSliceInPlace(staticResourcesNodeDepSets)) 922*333d2b36SAndroid Build Coastguard Worker sharedResourcesNodes = depset.New(depset.TOPOLOGICAL, nil, 923*333d2b36SAndroid Build Coastguard Worker android.ReverseSliceInPlace(sharedResourcesNodeDepSets)) 924*333d2b36SAndroid Build Coastguard Worker 925*333d2b36SAndroid Build Coastguard Worker staticRRODirs = rroDirsDepSetBuilder.Build() 926*333d2b36SAndroid Build Coastguard Worker staticManifests = manifestsDepSetBuilder.Build() 927*333d2b36SAndroid Build Coastguard Worker 928*333d2b36SAndroid Build Coastguard Worker if len(staticResourcesNodes.ToList()) > 0 { 929*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "--auto-add-overlay") 930*333d2b36SAndroid Build Coastguard Worker } 931*333d2b36SAndroid Build Coastguard Worker 932*333d2b36SAndroid Build Coastguard Worker for _, sharedLib := range sharedLibs { 933*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "-I "+sharedLib.String()) 934*333d2b36SAndroid Build Coastguard Worker } 935*333d2b36SAndroid Build Coastguard Worker 936*333d2b36SAndroid Build Coastguard Worker return staticResourcesNodes, sharedResourcesNodes, staticRRODirs, staticManifests, sharedLibs, flags 937*333d2b36SAndroid Build Coastguard Worker} 938*333d2b36SAndroid Build Coastguard Worker 939*333d2b36SAndroid Build Coastguard Workertype AndroidLibrary struct { 940*333d2b36SAndroid Build Coastguard Worker Library 941*333d2b36SAndroid Build Coastguard Worker aapt 942*333d2b36SAndroid Build Coastguard Worker 943*333d2b36SAndroid Build Coastguard Worker androidLibraryProperties androidLibraryProperties 944*333d2b36SAndroid Build Coastguard Worker 945*333d2b36SAndroid Build Coastguard Worker aarFile android.WritablePath 946*333d2b36SAndroid Build Coastguard Worker} 947*333d2b36SAndroid Build Coastguard Worker 948*333d2b36SAndroid Build Coastguard Workervar _ AndroidLibraryDependency = (*AndroidLibrary)(nil) 949*333d2b36SAndroid Build Coastguard Worker 950*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { 951*333d2b36SAndroid Build Coastguard Worker a.usesLibrary.deps(ctx, false) 952*333d2b36SAndroid Build Coastguard Worker a.Module.deps(ctx) 953*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, android.SdkContext(a)) 954*333d2b36SAndroid Build Coastguard Worker if sdkDep.hasFrameworkLibs() { 955*333d2b36SAndroid Build Coastguard Worker a.aapt.deps(ctx, sdkDep) 956*333d2b36SAndroid Build Coastguard Worker } 957*333d2b36SAndroid Build Coastguard Worker 958*333d2b36SAndroid Build Coastguard Worker for _, aconfig_declaration := range a.aaptProperties.Flags_packages { 959*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfig_declaration) 960*333d2b36SAndroid Build Coastguard Worker } 961*333d2b36SAndroid Build Coastguard Worker} 962*333d2b36SAndroid Build Coastguard Worker 963*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 964*333d2b36SAndroid Build Coastguard Worker a.aapt.isLibrary = true 965*333d2b36SAndroid Build Coastguard Worker a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx) 966*333d2b36SAndroid Build Coastguard Worker if a.usesLibrary.shouldDisableDexpreopt { 967*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.disableDexpreopt() 968*333d2b36SAndroid Build Coastguard Worker } 969*333d2b36SAndroid Build Coastguard Worker aconfigTextFilePaths := getAconfigFilePaths(ctx) 970*333d2b36SAndroid Build Coastguard Worker a.aapt.buildActions(ctx, 971*333d2b36SAndroid Build Coastguard Worker aaptBuildActionOptions{ 972*333d2b36SAndroid Build Coastguard Worker sdkContext: android.SdkContext(a), 973*333d2b36SAndroid Build Coastguard Worker classLoaderContexts: a.classLoaderContexts, 974*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: false, 975*333d2b36SAndroid Build Coastguard Worker aconfigTextFiles: aconfigTextFilePaths, 976*333d2b36SAndroid Build Coastguard Worker usesLibrary: &a.usesLibrary, 977*333d2b36SAndroid Build Coastguard Worker }, 978*333d2b36SAndroid Build Coastguard Worker ) 979*333d2b36SAndroid Build Coastguard Worker 980*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 981*333d2b36SAndroid Build Coastguard Worker a.hideApexVariantFromMake = !apexInfo.IsForPlatform() 982*333d2b36SAndroid Build Coastguard Worker 983*333d2b36SAndroid Build Coastguard Worker a.stem = proptools.StringDefault(a.overridableProperties.Stem, ctx.ModuleName()) 984*333d2b36SAndroid Build Coastguard Worker 985*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(a.aapt.proguardOptionsFile) 986*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(a.aapt.exportPackage) 987*333d2b36SAndroid Build Coastguard Worker if a.useResourceProcessorBusyBox(ctx) { 988*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(a.aapt.rJar) 989*333d2b36SAndroid Build Coastguard Worker } else { 990*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(a.aapt.aaptSrcJar) 991*333d2b36SAndroid Build Coastguard Worker } 992*333d2b36SAndroid Build Coastguard Worker 993*333d2b36SAndroid Build Coastguard Worker // apps manifests are handled by aapt, don't let Module see them 994*333d2b36SAndroid Build Coastguard Worker a.properties.Manifest = nil 995*333d2b36SAndroid Build Coastguard Worker 996*333d2b36SAndroid Build Coastguard Worker a.linter.mergedManifest = a.aapt.mergedManifestFile 997*333d2b36SAndroid Build Coastguard Worker a.linter.manifest = a.aapt.manifestPath 998*333d2b36SAndroid Build Coastguard Worker a.linter.resources = a.aapt.resourceFiles 999*333d2b36SAndroid Build Coastguard Worker 1000*333d2b36SAndroid Build Coastguard Worker proguardSpecInfo := a.collectProguardSpecInfo(ctx) 1001*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, ProguardSpecInfoProvider, proguardSpecInfo) 1002*333d2b36SAndroid Build Coastguard Worker exportedProguardFlagsFiles := proguardSpecInfo.ProguardFlagsFiles.ToList() 1003*333d2b36SAndroid Build Coastguard Worker a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, exportedProguardFlagsFiles...) 1004*333d2b36SAndroid Build Coastguard Worker a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, a.proguardOptionsFile) 1005*333d2b36SAndroid Build Coastguard Worker 1006*333d2b36SAndroid Build Coastguard Worker combinedExportedProguardFlagFile := android.PathForModuleOut(ctx, "export_proguard_flags") 1007*333d2b36SAndroid Build Coastguard Worker writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles) 1008*333d2b36SAndroid Build Coastguard Worker a.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile 1009*333d2b36SAndroid Build Coastguard Worker 1010*333d2b36SAndroid Build Coastguard Worker var extraSrcJars android.Paths 1011*333d2b36SAndroid Build Coastguard Worker var extraCombinedJars android.Paths 1012*333d2b36SAndroid Build Coastguard Worker var extraClasspathJars android.Paths 1013*333d2b36SAndroid Build Coastguard Worker if a.useResourceProcessorBusyBox(ctx) { 1014*333d2b36SAndroid Build Coastguard Worker // When building a library with ResourceProcessorBusyBox enabled ResourceProcessorBusyBox for this 1015*333d2b36SAndroid Build Coastguard Worker // library and each of the transitive static android_library dependencies has already created an 1016*333d2b36SAndroid Build Coastguard Worker // R.class file for the appropriate package. Add all of those R.class files to the classpath. 1017*333d2b36SAndroid Build Coastguard Worker extraClasspathJars = a.transitiveAaptRJars 1018*333d2b36SAndroid Build Coastguard Worker } else { 1019*333d2b36SAndroid Build Coastguard Worker // When building a library without ResourceProcessorBusyBox the aapt2 rule creates R.srcjar containing 1020*333d2b36SAndroid Build Coastguard Worker // R.java files for the library's package and the packages from all transitive static android_library 1021*333d2b36SAndroid Build Coastguard Worker // dependencies. Compile the srcjar alongside the rest of the sources. 1022*333d2b36SAndroid Build Coastguard Worker extraSrcJars = android.Paths{a.aapt.aaptSrcJar} 1023*333d2b36SAndroid Build Coastguard Worker } 1024*333d2b36SAndroid Build Coastguard Worker 1025*333d2b36SAndroid Build Coastguard Worker a.Module.compile(ctx, extraSrcJars, extraClasspathJars, extraCombinedJars, nil) 1026*333d2b36SAndroid Build Coastguard Worker 1027*333d2b36SAndroid Build Coastguard Worker a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar") 1028*333d2b36SAndroid Build Coastguard Worker var res android.Paths 1029*333d2b36SAndroid Build Coastguard Worker if a.androidLibraryProperties.BuildAAR { 1030*333d2b36SAndroid Build Coastguard Worker BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res) 1031*333d2b36SAndroid Build Coastguard Worker } 1032*333d2b36SAndroid Build Coastguard Worker 1033*333d2b36SAndroid Build Coastguard Worker prebuiltJniPackages := android.Paths{} 1034*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 1035*333d2b36SAndroid Build Coastguard Worker if info, ok := android.OtherModuleProvider(ctx, module, JniPackageProvider); ok { 1036*333d2b36SAndroid Build Coastguard Worker prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...) 1037*333d2b36SAndroid Build Coastguard Worker } 1038*333d2b36SAndroid Build Coastguard Worker }) 1039*333d2b36SAndroid Build Coastguard Worker if len(prebuiltJniPackages) > 0 { 1040*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{ 1041*333d2b36SAndroid Build Coastguard Worker JniPackages: prebuiltJniPackages, 1042*333d2b36SAndroid Build Coastguard Worker }) 1043*333d2b36SAndroid Build Coastguard Worker } 1044*333d2b36SAndroid Build Coastguard Worker 1045*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{ 1046*333d2b36SAndroid Build Coastguard Worker AconfigTextFiles: aconfigTextFilePaths, 1047*333d2b36SAndroid Build Coastguard Worker }) 1048*333d2b36SAndroid Build Coastguard Worker 1049*333d2b36SAndroid Build Coastguard Worker a.setOutputFiles(ctx) 1050*333d2b36SAndroid Build Coastguard Worker} 1051*333d2b36SAndroid Build Coastguard Worker 1052*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidLibrary) setOutputFiles(ctx android.ModuleContext) { 1053*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles([]android.Path{a.aarFile}, ".aar") 1054*333d2b36SAndroid Build Coastguard Worker setOutputFiles(ctx, a.Library.Module) 1055*333d2b36SAndroid Build Coastguard Worker} 1056*333d2b36SAndroid Build Coastguard Worker 1057*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidLibrary) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) { 1058*333d2b36SAndroid Build Coastguard Worker a.Library.IDEInfo(ctx, dpInfo) 1059*333d2b36SAndroid Build Coastguard Worker a.aapt.IDEInfo(ctx, dpInfo) 1060*333d2b36SAndroid Build Coastguard Worker} 1061*333d2b36SAndroid Build Coastguard Worker 1062*333d2b36SAndroid Build Coastguard Workerfunc (a *aapt) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) { 1063*333d2b36SAndroid Build Coastguard Worker if a.rJar != nil { 1064*333d2b36SAndroid Build Coastguard Worker dpInfo.Jars = append(dpInfo.Jars, a.rJar.String()) 1065*333d2b36SAndroid Build Coastguard Worker } 1066*333d2b36SAndroid Build Coastguard Worker} 1067*333d2b36SAndroid Build Coastguard Worker 1068*333d2b36SAndroid Build Coastguard Worker// android_library builds and links sources into a `.jar` file for the device along with Android resources. 1069*333d2b36SAndroid Build Coastguard Worker// 1070*333d2b36SAndroid Build Coastguard Worker// An android_library has a single variant that produces a `.jar` file containing `.class` files that were 1071*333d2b36SAndroid Build Coastguard Worker// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled 1072*333d2b36SAndroid Build Coastguard Worker// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of 1073*333d2b36SAndroid Build Coastguard Worker// an android_app module. 1074*333d2b36SAndroid Build Coastguard Workerfunc AndroidLibraryFactory() android.Module { 1075*333d2b36SAndroid Build Coastguard Worker module := &AndroidLibrary{} 1076*333d2b36SAndroid Build Coastguard Worker 1077*333d2b36SAndroid Build Coastguard Worker module.Module.addHostAndDeviceProperties() 1078*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 1079*333d2b36SAndroid Build Coastguard Worker &module.aaptProperties, 1080*333d2b36SAndroid Build Coastguard Worker &module.androidLibraryProperties, 1081*333d2b36SAndroid Build Coastguard Worker &module.sourceProperties) 1082*333d2b36SAndroid Build Coastguard Worker 1083*333d2b36SAndroid Build Coastguard Worker module.androidLibraryProperties.BuildAAR = true 1084*333d2b36SAndroid Build Coastguard Worker module.Module.linter.library = true 1085*333d2b36SAndroid Build Coastguard Worker 1086*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 1087*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.DeviceSupported) 1088*333d2b36SAndroid Build Coastguard Worker return module 1089*333d2b36SAndroid Build Coastguard Worker} 1090*333d2b36SAndroid Build Coastguard Worker 1091*333d2b36SAndroid Build Coastguard Worker// 1092*333d2b36SAndroid Build Coastguard Worker// AAR (android library) prebuilts 1093*333d2b36SAndroid Build Coastguard Worker// 1094*333d2b36SAndroid Build Coastguard Worker 1095*333d2b36SAndroid Build Coastguard Worker// Properties for android_library_import 1096*333d2b36SAndroid Build Coastguard Workertype AARImportProperties struct { 1097*333d2b36SAndroid Build Coastguard Worker // ARR (android library prebuilt) filepath. Exactly one ARR is required. 1098*333d2b36SAndroid Build Coastguard Worker Aars []string `android:"path"` 1099*333d2b36SAndroid Build Coastguard Worker // If not blank, set to the version of the sdk to compile against. 1100*333d2b36SAndroid Build Coastguard Worker // Defaults to private. 1101*333d2b36SAndroid Build Coastguard Worker // Values are of one of the following forms: 1102*333d2b36SAndroid Build Coastguard Worker // 1) numerical API level, "current", "none", or "core_platform" 1103*333d2b36SAndroid Build Coastguard Worker // 2) An SDK kind with an API level: "<sdk kind>_<API level>" 1104*333d2b36SAndroid Build Coastguard Worker // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds. 1105*333d2b36SAndroid Build Coastguard Worker // If the SDK kind is empty, it will be set to public 1106*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 1107*333d2b36SAndroid Build Coastguard Worker // If not blank, set the minimum version of the sdk that the compiled artifacts will run against. 1108*333d2b36SAndroid Build Coastguard Worker // Defaults to sdk_version if not set. See sdk_version for possible values. 1109*333d2b36SAndroid Build Coastguard Worker Min_sdk_version *string 1110*333d2b36SAndroid Build Coastguard Worker // List of java static libraries that the included ARR (android library prebuilts) has dependencies to. 1111*333d2b36SAndroid Build Coastguard Worker Static_libs proptools.Configurable[[]string] 1112*333d2b36SAndroid Build Coastguard Worker // List of java libraries that the included ARR (android library prebuilts) has dependencies to. 1113*333d2b36SAndroid Build Coastguard Worker Libs []string 1114*333d2b36SAndroid Build Coastguard Worker // If set to true, run Jetifier against .aar file. Defaults to false. 1115*333d2b36SAndroid Build Coastguard Worker Jetifier *bool 1116*333d2b36SAndroid Build Coastguard Worker // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and 1117*333d2b36SAndroid Build Coastguard Worker // will be passed transitively through android_libraries to an android_app. 1118*333d2b36SAndroid Build Coastguard Worker //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion 1119*333d2b36SAndroid Build Coastguard Worker Extract_jni *bool 1120*333d2b36SAndroid Build Coastguard Worker 1121*333d2b36SAndroid Build Coastguard Worker // If set, overrides the manifest extracted from the AAR with the provided path. 1122*333d2b36SAndroid Build Coastguard Worker Manifest *string `android:"path"` 1123*333d2b36SAndroid Build Coastguard Worker} 1124*333d2b36SAndroid Build Coastguard Worker 1125*333d2b36SAndroid Build Coastguard Workertype AARImport struct { 1126*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 1127*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 1128*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 1129*333d2b36SAndroid Build Coastguard Worker prebuilt android.Prebuilt 1130*333d2b36SAndroid Build Coastguard Worker 1131*333d2b36SAndroid Build Coastguard Worker // Functionality common to Module and Import. 1132*333d2b36SAndroid Build Coastguard Worker embeddableInModuleAndImport 1133*333d2b36SAndroid Build Coastguard Worker 1134*333d2b36SAndroid Build Coastguard Worker providesTransitiveHeaderJarsForR8 1135*333d2b36SAndroid Build Coastguard Worker 1136*333d2b36SAndroid Build Coastguard Worker properties AARImportProperties 1137*333d2b36SAndroid Build Coastguard Worker 1138*333d2b36SAndroid Build Coastguard Worker headerJarFile android.Path 1139*333d2b36SAndroid Build Coastguard Worker implementationJarFile android.Path 1140*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJarFile android.Path 1141*333d2b36SAndroid Build Coastguard Worker proguardFlags android.Path 1142*333d2b36SAndroid Build Coastguard Worker exportPackage android.Path 1143*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackagesFile android.Path 1144*333d2b36SAndroid Build Coastguard Worker extraAaptPackagesFile android.Path 1145*333d2b36SAndroid Build Coastguard Worker manifest android.Path 1146*333d2b36SAndroid Build Coastguard Worker assetsPackage android.Path 1147*333d2b36SAndroid Build Coastguard Worker rTxt android.Path 1148*333d2b36SAndroid Build Coastguard Worker rJar android.Path 1149*333d2b36SAndroid Build Coastguard Worker 1150*333d2b36SAndroid Build Coastguard Worker resourcesNodesDepSet depset.DepSet[*resourcesNode] 1151*333d2b36SAndroid Build Coastguard Worker manifestsDepSet depset.DepSet[android.Path] 1152*333d2b36SAndroid Build Coastguard Worker 1153*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 1154*333d2b36SAndroid Build Coastguard Worker 1155*333d2b36SAndroid Build Coastguard Worker aarPath android.Path 1156*333d2b36SAndroid Build Coastguard Worker jniPackages android.Paths 1157*333d2b36SAndroid Build Coastguard Worker 1158*333d2b36SAndroid Build Coastguard Worker sdkVersion android.SdkSpec 1159*333d2b36SAndroid Build Coastguard Worker minSdkVersion android.ApiLevel 1160*333d2b36SAndroid Build Coastguard Worker 1161*333d2b36SAndroid Build Coastguard Worker usesLibrary 1162*333d2b36SAndroid Build Coastguard Worker classLoaderContexts dexpreopt.ClassLoaderContextMap 1163*333d2b36SAndroid Build Coastguard Worker} 1164*333d2b36SAndroid Build Coastguard Worker 1165*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec { 1166*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version)) 1167*333d2b36SAndroid Build Coastguard Worker} 1168*333d2b36SAndroid Build Coastguard Worker 1169*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) SystemModules() string { 1170*333d2b36SAndroid Build Coastguard Worker return "" 1171*333d2b36SAndroid Build Coastguard Worker} 1172*333d2b36SAndroid Build Coastguard Worker 1173*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 1174*333d2b36SAndroid Build Coastguard Worker if a.properties.Min_sdk_version != nil { 1175*333d2b36SAndroid Build Coastguard Worker return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version) 1176*333d2b36SAndroid Build Coastguard Worker } 1177*333d2b36SAndroid Build Coastguard Worker return a.SdkVersion(ctx).ApiLevel 1178*333d2b36SAndroid Build Coastguard Worker} 1179*333d2b36SAndroid Build Coastguard Worker 1180*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel { 1181*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecFrom(ctx, "").ApiLevel 1182*333d2b36SAndroid Build Coastguard Worker} 1183*333d2b36SAndroid Build Coastguard Worker 1184*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 1185*333d2b36SAndroid Build Coastguard Worker return a.SdkVersion(ctx).ApiLevel 1186*333d2b36SAndroid Build Coastguard Worker} 1187*333d2b36SAndroid Build Coastguard Worker 1188*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) javaVersion() string { 1189*333d2b36SAndroid Build Coastguard Worker return "" 1190*333d2b36SAndroid Build Coastguard Worker} 1191*333d2b36SAndroid Build Coastguard Worker 1192*333d2b36SAndroid Build Coastguard Workervar _ AndroidLibraryDependency = (*AARImport)(nil) 1193*333d2b36SAndroid Build Coastguard Worker 1194*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) ExportPackage() android.Path { 1195*333d2b36SAndroid Build Coastguard Worker return a.exportPackage 1196*333d2b36SAndroid Build Coastguard Worker} 1197*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) ResourcesNodeDepSet() depset.DepSet[*resourcesNode] { 1198*333d2b36SAndroid Build Coastguard Worker return a.resourcesNodesDepSet 1199*333d2b36SAndroid Build Coastguard Worker} 1200*333d2b36SAndroid Build Coastguard Worker 1201*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) RRODirsDepSet() depset.DepSet[rroDir] { 1202*333d2b36SAndroid Build Coastguard Worker return depset.New[rroDir](depset.TOPOLOGICAL, nil, nil) 1203*333d2b36SAndroid Build Coastguard Worker} 1204*333d2b36SAndroid Build Coastguard Worker 1205*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) ManifestsDepSet() depset.DepSet[android.Path] { 1206*333d2b36SAndroid Build Coastguard Worker return a.manifestsDepSet 1207*333d2b36SAndroid Build Coastguard Worker} 1208*333d2b36SAndroid Build Coastguard Worker 1209*333d2b36SAndroid Build Coastguard Worker// RRO enforcement is not available on aar_import since its RRO dirs are not 1210*333d2b36SAndroid Build Coastguard Worker// exported. 1211*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) SetRROEnforcedForDependent(enforce bool) { 1212*333d2b36SAndroid Build Coastguard Worker} 1213*333d2b36SAndroid Build Coastguard Worker 1214*333d2b36SAndroid Build Coastguard Worker// RRO enforcement is not available on aar_import since its RRO dirs are not 1215*333d2b36SAndroid Build Coastguard Worker// exported. 1216*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool { 1217*333d2b36SAndroid Build Coastguard Worker return false 1218*333d2b36SAndroid Build Coastguard Worker} 1219*333d2b36SAndroid Build Coastguard Worker 1220*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) Prebuilt() *android.Prebuilt { 1221*333d2b36SAndroid Build Coastguard Worker return &a.prebuilt 1222*333d2b36SAndroid Build Coastguard Worker} 1223*333d2b36SAndroid Build Coastguard Worker 1224*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) Name() string { 1225*333d2b36SAndroid Build Coastguard Worker return a.prebuilt.Name(a.ModuleBase.Name()) 1226*333d2b36SAndroid Build Coastguard Worker} 1227*333d2b36SAndroid Build Coastguard Worker 1228*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) JacocoReportClassesFile() android.Path { 1229*333d2b36SAndroid Build Coastguard Worker return nil 1230*333d2b36SAndroid Build Coastguard Worker} 1231*333d2b36SAndroid Build Coastguard Worker 1232*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) { 1233*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AlwaysUsePrebuiltSdks() { 1234*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, android.SdkContext(a)) 1235*333d2b36SAndroid Build Coastguard Worker if sdkDep.useModule && sdkDep.frameworkResModule != "" { 1236*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule) 1237*333d2b36SAndroid Build Coastguard Worker } 1238*333d2b36SAndroid Build Coastguard Worker } 1239*333d2b36SAndroid Build Coastguard Worker 1240*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...) 1241*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs.GetOrDefault(ctx, nil)...) 1242*333d2b36SAndroid Build Coastguard Worker 1243*333d2b36SAndroid Build Coastguard Worker a.usesLibrary.deps(ctx, false) 1244*333d2b36SAndroid Build Coastguard Worker} 1245*333d2b36SAndroid Build Coastguard Worker 1246*333d2b36SAndroid Build Coastguard Workertype JniPackageInfo struct { 1247*333d2b36SAndroid Build Coastguard Worker // List of zip files containing JNI libraries 1248*333d2b36SAndroid Build Coastguard Worker // Zip files should have directory structure jni/<arch>/*.so 1249*333d2b36SAndroid Build Coastguard Worker JniPackages android.Paths 1250*333d2b36SAndroid Build Coastguard Worker} 1251*333d2b36SAndroid Build Coastguard Worker 1252*333d2b36SAndroid Build Coastguard Workervar JniPackageProvider = blueprint.NewProvider[JniPackageInfo]() 1253*333d2b36SAndroid Build Coastguard Worker 1254*333d2b36SAndroid Build Coastguard Worker// Unzip an AAR and extract the JNI libs for $archString. 1255*333d2b36SAndroid Build Coastguard Workervar extractJNI = pctx.AndroidStaticRule("extractJNI", 1256*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 1257*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf $out $outDir && touch $out && ` + 1258*333d2b36SAndroid Build Coastguard Worker `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` + 1259*333d2b36SAndroid Build Coastguard Worker `jni_files=$$(find $outDir/jni -type f) && ` + 1260*333d2b36SAndroid Build Coastguard Worker // print error message if there are no JNI libs for this arch 1261*333d2b36SAndroid Build Coastguard Worker `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` + 1262*333d2b36SAndroid Build Coastguard Worker `${config.SoongZipCmd} -o $out -L 0 -P 'lib/${archString}' ` + 1263*333d2b36SAndroid Build Coastguard Worker `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`, 1264*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.SoongZipCmd}"}, 1265*333d2b36SAndroid Build Coastguard Worker }, 1266*333d2b36SAndroid Build Coastguard Worker "outDir", "archString") 1267*333d2b36SAndroid Build Coastguard Worker 1268*333d2b36SAndroid Build Coastguard Worker// Unzip an AAR into its constituent files and directories. Any files in Outputs that don't exist in the AAR will be 1269*333d2b36SAndroid Build Coastguard Worker// touched to create an empty file. The res directory is not extracted, as it will be extracted in its own rule. 1270*333d2b36SAndroid Build Coastguard Workervar unzipAAR = pctx.AndroidStaticRule("unzipAAR", 1271*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 1272*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf $outDir && mkdir -p $outDir && ` + 1273*333d2b36SAndroid Build Coastguard Worker `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` + 1274*333d2b36SAndroid Build Coastguard Worker `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` + 1275*333d2b36SAndroid Build Coastguard Worker `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`, 1276*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"}, 1277*333d2b36SAndroid Build Coastguard Worker }, 1278*333d2b36SAndroid Build Coastguard Worker "outDir", "combinedClassesJar", "assetsPackage") 1279*333d2b36SAndroid Build Coastguard Worker 1280*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { 1281*333d2b36SAndroid Build Coastguard Worker if len(a.properties.Aars) != 1 { 1282*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("aars", "exactly one aar is required") 1283*333d2b36SAndroid Build Coastguard Worker return 1284*333d2b36SAndroid Build Coastguard Worker } 1285*333d2b36SAndroid Build Coastguard Worker 1286*333d2b36SAndroid Build Coastguard Worker a.sdkVersion = a.SdkVersion(ctx) 1287*333d2b36SAndroid Build Coastguard Worker a.minSdkVersion = a.MinSdkVersion(ctx) 1288*333d2b36SAndroid Build Coastguard Worker 1289*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 1290*333d2b36SAndroid Build Coastguard Worker a.hideApexVariantFromMake = !apexInfo.IsForPlatform() 1291*333d2b36SAndroid Build Coastguard Worker 1292*333d2b36SAndroid Build Coastguard Worker aarName := ctx.ModuleName() + ".aar" 1293*333d2b36SAndroid Build Coastguard Worker a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0]) 1294*333d2b36SAndroid Build Coastguard Worker 1295*333d2b36SAndroid Build Coastguard Worker if Bool(a.properties.Jetifier) { 1296*333d2b36SAndroid Build Coastguard Worker inputFile := a.aarPath 1297*333d2b36SAndroid Build Coastguard Worker jetifierPath := android.PathForModuleOut(ctx, "jetifier", aarName) 1298*333d2b36SAndroid Build Coastguard Worker TransformJetifier(ctx, jetifierPath, inputFile) 1299*333d2b36SAndroid Build Coastguard Worker a.aarPath = jetifierPath 1300*333d2b36SAndroid Build Coastguard Worker } 1301*333d2b36SAndroid Build Coastguard Worker 1302*333d2b36SAndroid Build Coastguard Worker jarName := ctx.ModuleName() + ".jar" 1303*333d2b36SAndroid Build Coastguard Worker extractedAARDir := android.PathForModuleOut(ctx, "aar") 1304*333d2b36SAndroid Build Coastguard Worker classpathFile := extractedAARDir.Join(ctx, jarName) 1305*333d2b36SAndroid Build Coastguard Worker 1306*333d2b36SAndroid Build Coastguard Worker extractedManifest := extractedAARDir.Join(ctx, "AndroidManifest.xml") 1307*333d2b36SAndroid Build Coastguard Worker providedManifest := android.OptionalPathForModuleSrc(ctx, a.properties.Manifest) 1308*333d2b36SAndroid Build Coastguard Worker if providedManifest.Valid() { 1309*333d2b36SAndroid Build Coastguard Worker a.manifest = providedManifest.Path() 1310*333d2b36SAndroid Build Coastguard Worker } else { 1311*333d2b36SAndroid Build Coastguard Worker a.manifest = extractedManifest 1312*333d2b36SAndroid Build Coastguard Worker } 1313*333d2b36SAndroid Build Coastguard Worker 1314*333d2b36SAndroid Build Coastguard Worker rTxt := extractedAARDir.Join(ctx, "R.txt") 1315*333d2b36SAndroid Build Coastguard Worker assetsPackage := android.PathForModuleOut(ctx, "assets.zip") 1316*333d2b36SAndroid Build Coastguard Worker proguardFlags := extractedAARDir.Join(ctx, "proguard.txt") 1317*333d2b36SAndroid Build Coastguard Worker transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx) 1318*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{ 1319*333d2b36SAndroid Build Coastguard Worker ProguardFlagsFiles: depset.New[android.Path]( 1320*333d2b36SAndroid Build Coastguard Worker depset.POSTORDER, 1321*333d2b36SAndroid Build Coastguard Worker android.Paths{proguardFlags}, 1322*333d2b36SAndroid Build Coastguard Worker transitiveProguardFlags, 1323*333d2b36SAndroid Build Coastguard Worker ), 1324*333d2b36SAndroid Build Coastguard Worker UnconditionallyExportedProguardFlags: depset.New[android.Path]( 1325*333d2b36SAndroid Build Coastguard Worker depset.POSTORDER, 1326*333d2b36SAndroid Build Coastguard Worker nil, 1327*333d2b36SAndroid Build Coastguard Worker transitiveUnconditionalExportedFlags, 1328*333d2b36SAndroid Build Coastguard Worker ), 1329*333d2b36SAndroid Build Coastguard Worker }) 1330*333d2b36SAndroid Build Coastguard Worker 1331*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1332*333d2b36SAndroid Build Coastguard Worker Rule: unzipAAR, 1333*333d2b36SAndroid Build Coastguard Worker Input: a.aarPath, 1334*333d2b36SAndroid Build Coastguard Worker Outputs: android.WritablePaths{classpathFile, proguardFlags, extractedManifest, assetsPackage, rTxt}, 1335*333d2b36SAndroid Build Coastguard Worker Description: "unzip AAR", 1336*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1337*333d2b36SAndroid Build Coastguard Worker "outDir": extractedAARDir.String(), 1338*333d2b36SAndroid Build Coastguard Worker "combinedClassesJar": classpathFile.String(), 1339*333d2b36SAndroid Build Coastguard Worker "assetsPackage": assetsPackage.String(), 1340*333d2b36SAndroid Build Coastguard Worker }, 1341*333d2b36SAndroid Build Coastguard Worker }) 1342*333d2b36SAndroid Build Coastguard Worker 1343*333d2b36SAndroid Build Coastguard Worker a.proguardFlags = proguardFlags 1344*333d2b36SAndroid Build Coastguard Worker a.assetsPackage = assetsPackage 1345*333d2b36SAndroid Build Coastguard Worker a.rTxt = rTxt 1346*333d2b36SAndroid Build Coastguard Worker 1347*333d2b36SAndroid Build Coastguard Worker // Always set --pseudo-localize, it will be stripped out later for release 1348*333d2b36SAndroid Build Coastguard Worker // builds that don't want it. 1349*333d2b36SAndroid Build Coastguard Worker compileFlags := []string{"--pseudo-localize"} 1350*333d2b36SAndroid Build Coastguard Worker compiledResDir := android.PathForModuleOut(ctx, "flat-res") 1351*333d2b36SAndroid Build Coastguard Worker flata := compiledResDir.Join(ctx, "gen_res.flata") 1352*333d2b36SAndroid Build Coastguard Worker aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags) 1353*333d2b36SAndroid Build Coastguard Worker 1354*333d2b36SAndroid Build Coastguard Worker exportPackage := android.PathForModuleOut(ctx, "package-res.apk") 1355*333d2b36SAndroid Build Coastguard Worker proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options") 1356*333d2b36SAndroid Build Coastguard Worker aaptRTxt := android.PathForModuleOut(ctx, "R.txt") 1357*333d2b36SAndroid Build Coastguard Worker extraAaptPackagesFile := android.PathForModuleOut(ctx, "extra_packages") 1358*333d2b36SAndroid Build Coastguard Worker 1359*333d2b36SAndroid Build Coastguard Worker var linkDeps android.Paths 1360*333d2b36SAndroid Build Coastguard Worker 1361*333d2b36SAndroid Build Coastguard Worker linkFlags := []string{ 1362*333d2b36SAndroid Build Coastguard Worker "--static-lib", 1363*333d2b36SAndroid Build Coastguard Worker "--merge-only", 1364*333d2b36SAndroid Build Coastguard Worker "--auto-add-overlay", 1365*333d2b36SAndroid Build Coastguard Worker "--no-static-lib-packages", 1366*333d2b36SAndroid Build Coastguard Worker } 1367*333d2b36SAndroid Build Coastguard Worker 1368*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "--manifest "+a.manifest.String()) 1369*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, a.manifest) 1370*333d2b36SAndroid Build Coastguard Worker 1371*333d2b36SAndroid Build Coastguard Worker staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags := 1372*333d2b36SAndroid Build Coastguard Worker aaptLibs(ctx, android.SdkContext(a), nil, nil) 1373*333d2b36SAndroid Build Coastguard Worker 1374*333d2b36SAndroid Build Coastguard Worker _ = sharedResourcesNodesDepSet 1375*333d2b36SAndroid Build Coastguard Worker _ = staticRRODirsDepSet 1376*333d2b36SAndroid Build Coastguard Worker 1377*333d2b36SAndroid Build Coastguard Worker staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList()) 1378*333d2b36SAndroid Build Coastguard Worker 1379*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, sharedLibs...) 1380*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, staticDeps.resPackages()...) 1381*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, libFlags...) 1382*333d2b36SAndroid Build Coastguard Worker 1383*333d2b36SAndroid Build Coastguard Worker overlayRes := android.Paths{flata} 1384*333d2b36SAndroid Build Coastguard Worker 1385*333d2b36SAndroid Build Coastguard Worker // Treat static library dependencies of static libraries as imports. 1386*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibs := staticDeps.resPackages() 1387*333d2b36SAndroid Build Coastguard Worker linkDeps = append(linkDeps, transitiveStaticLibs...) 1388*333d2b36SAndroid Build Coastguard Worker for _, staticLib := range transitiveStaticLibs { 1389*333d2b36SAndroid Build Coastguard Worker linkFlags = append(linkFlags, "-I "+staticLib.String()) 1390*333d2b36SAndroid Build Coastguard Worker } 1391*333d2b36SAndroid Build Coastguard Worker 1392*333d2b36SAndroid Build Coastguard Worker transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets()) 1393*333d2b36SAndroid Build Coastguard Worker aapt2Link(ctx, exportPackage, nil, proguardOptionsFile, aaptRTxt, 1394*333d2b36SAndroid Build Coastguard Worker linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil, nil) 1395*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(exportPackage) 1396*333d2b36SAndroid Build Coastguard Worker a.exportPackage = exportPackage 1397*333d2b36SAndroid Build Coastguard Worker 1398*333d2b36SAndroid Build Coastguard Worker rJar := android.PathForModuleOut(ctx, "busybox/R.jar") 1399*333d2b36SAndroid Build Coastguard Worker resourceProcessorBusyBoxGenerateBinaryR(ctx, a.rTxt, a.manifest, rJar, nil, true, nil, false) 1400*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(rJar) 1401*333d2b36SAndroid Build Coastguard Worker a.rJar = rJar 1402*333d2b36SAndroid Build Coastguard Worker 1403*333d2b36SAndroid Build Coastguard Worker aapt2ExtractExtraPackages(ctx, extraAaptPackagesFile, a.rJar) 1404*333d2b36SAndroid Build Coastguard Worker a.extraAaptPackagesFile = extraAaptPackagesFile 1405*333d2b36SAndroid Build Coastguard Worker 1406*333d2b36SAndroid Build Coastguard Worker resourcesNodesDepSetBuilder := depset.NewBuilder[*resourcesNode](depset.TOPOLOGICAL) 1407*333d2b36SAndroid Build Coastguard Worker resourcesNodesDepSetBuilder.Direct(&resourcesNode{ 1408*333d2b36SAndroid Build Coastguard Worker resPackage: a.exportPackage, 1409*333d2b36SAndroid Build Coastguard Worker manifest: a.manifest, 1410*333d2b36SAndroid Build Coastguard Worker rTxt: a.rTxt, 1411*333d2b36SAndroid Build Coastguard Worker rJar: a.rJar, 1412*333d2b36SAndroid Build Coastguard Worker assets: android.OptionalPathForPath(a.assetsPackage), 1413*333d2b36SAndroid Build Coastguard Worker 1414*333d2b36SAndroid Build Coastguard Worker usedResourceProcessor: true, 1415*333d2b36SAndroid Build Coastguard Worker }) 1416*333d2b36SAndroid Build Coastguard Worker resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet) 1417*333d2b36SAndroid Build Coastguard Worker a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build() 1418*333d2b36SAndroid Build Coastguard Worker 1419*333d2b36SAndroid Build Coastguard Worker manifestDepSetBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL).Direct(a.manifest) 1420*333d2b36SAndroid Build Coastguard Worker manifestDepSetBuilder.Transitive(staticManifestsDepSet) 1421*333d2b36SAndroid Build Coastguard Worker a.manifestsDepSet = manifestDepSetBuilder.Build() 1422*333d2b36SAndroid Build Coastguard Worker 1423*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackages := staticDeps.resPackages().Strings() 1424*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool { 1425*333d2b36SAndroid Build Coastguard Worker return p == a.exportPackage.String() 1426*333d2b36SAndroid Build Coastguard Worker }) 1427*333d2b36SAndroid Build Coastguard Worker transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages") 1428*333d2b36SAndroid Build Coastguard Worker android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n")) 1429*333d2b36SAndroid Build Coastguard Worker a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile 1430*333d2b36SAndroid Build Coastguard Worker 1431*333d2b36SAndroid Build Coastguard Worker a.collectTransitiveHeaderJarsForR8(ctx) 1432*333d2b36SAndroid Build Coastguard Worker 1433*333d2b36SAndroid Build Coastguard Worker a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx) 1434*333d2b36SAndroid Build Coastguard Worker 1435*333d2b36SAndroid Build Coastguard Worker var staticJars android.Paths 1436*333d2b36SAndroid Build Coastguard Worker var staticHeaderJars android.Paths 1437*333d2b36SAndroid Build Coastguard Worker var staticResourceJars android.Paths 1438*333d2b36SAndroid Build Coastguard Worker var transitiveStaticLibsHeaderJars []depset.DepSet[android.Path] 1439*333d2b36SAndroid Build Coastguard Worker var transitiveStaticLibsImplementationJars []depset.DepSet[android.Path] 1440*333d2b36SAndroid Build Coastguard Worker var transitiveStaticLibsResourceJars []depset.DepSet[android.Path] 1441*333d2b36SAndroid Build Coastguard Worker 1442*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 1443*333d2b36SAndroid Build Coastguard Worker if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 1444*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(module) 1445*333d2b36SAndroid Build Coastguard Worker switch tag { 1446*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 1447*333d2b36SAndroid Build Coastguard Worker staticJars = append(staticJars, dep.ImplementationJars...) 1448*333d2b36SAndroid Build Coastguard Worker staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...) 1449*333d2b36SAndroid Build Coastguard Worker staticResourceJars = append(staticResourceJars, dep.ResourceJars...) 1450*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars = append(transitiveStaticLibsHeaderJars, dep.TransitiveStaticLibsHeaderJars) 1451*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsImplementationJars = append(transitiveStaticLibsImplementationJars, dep.TransitiveStaticLibsImplementationJars) 1452*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsResourceJars = append(transitiveStaticLibsResourceJars, dep.TransitiveStaticLibsResourceJars) 1453*333d2b36SAndroid Build Coastguard Worker } 1454*333d2b36SAndroid Build Coastguard Worker } 1455*333d2b36SAndroid Build Coastguard Worker addCLCFromDep(ctx, module, a.classLoaderContexts) 1456*333d2b36SAndroid Build Coastguard Worker addMissingOptionalUsesLibsFromDep(ctx, module, &a.usesLibrary) 1457*333d2b36SAndroid Build Coastguard Worker }) 1458*333d2b36SAndroid Build Coastguard Worker 1459*333d2b36SAndroid Build Coastguard Worker completeStaticLibsHeaderJars := depset.New(depset.PREORDER, android.Paths{classpathFile}, transitiveStaticLibsHeaderJars) 1460*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars := depset.New(depset.PREORDER, android.Paths{classpathFile}, transitiveStaticLibsImplementationJars) 1461*333d2b36SAndroid Build Coastguard Worker completeStaticLibsResourceJars := depset.New(depset.PREORDER, nil, transitiveStaticLibsResourceJars) 1462*333d2b36SAndroid Build Coastguard Worker 1463*333d2b36SAndroid Build Coastguard Worker var implementationJarFile android.Path 1464*333d2b36SAndroid Build Coastguard Worker var combineJars android.Paths 1465*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1466*333d2b36SAndroid Build Coastguard Worker combineJars = completeStaticLibsImplementationJars.ToList() 1467*333d2b36SAndroid Build Coastguard Worker } else { 1468*333d2b36SAndroid Build Coastguard Worker combineJars = append(android.Paths{classpathFile}, staticJars...) 1469*333d2b36SAndroid Build Coastguard Worker } 1470*333d2b36SAndroid Build Coastguard Worker 1471*333d2b36SAndroid Build Coastguard Worker if len(combineJars) > 1 { 1472*333d2b36SAndroid Build Coastguard Worker implementationJarOutputPath := android.PathForModuleOut(ctx, "combined", jarName) 1473*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, implementationJarOutputPath, "combine", combineJars, android.OptionalPath{}, false, nil, nil) 1474*333d2b36SAndroid Build Coastguard Worker implementationJarFile = implementationJarOutputPath 1475*333d2b36SAndroid Build Coastguard Worker } else { 1476*333d2b36SAndroid Build Coastguard Worker implementationJarFile = classpathFile 1477*333d2b36SAndroid Build Coastguard Worker } 1478*333d2b36SAndroid Build Coastguard Worker 1479*333d2b36SAndroid Build Coastguard Worker var resourceJarFile android.Path 1480*333d2b36SAndroid Build Coastguard Worker var resourceJars android.Paths 1481*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1482*333d2b36SAndroid Build Coastguard Worker resourceJars = completeStaticLibsResourceJars.ToList() 1483*333d2b36SAndroid Build Coastguard Worker } else { 1484*333d2b36SAndroid Build Coastguard Worker resourceJars = staticResourceJars 1485*333d2b36SAndroid Build Coastguard Worker } 1486*333d2b36SAndroid Build Coastguard Worker if len(resourceJars) > 1 { 1487*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName) 1488*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for resources", resourceJars, android.OptionalPath{}, 1489*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 1490*333d2b36SAndroid Build Coastguard Worker resourceJarFile = combinedJar 1491*333d2b36SAndroid Build Coastguard Worker } else if len(resourceJars) == 1 { 1492*333d2b36SAndroid Build Coastguard Worker resourceJarFile = resourceJars[0] 1493*333d2b36SAndroid Build Coastguard Worker } 1494*333d2b36SAndroid Build Coastguard Worker 1495*333d2b36SAndroid Build Coastguard Worker // merge implementation jar with resources if necessary 1496*333d2b36SAndroid Build Coastguard Worker var implementationAndResourcesJars android.Paths 1497*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1498*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJars = append(slices.Clone(resourceJars), combineJars...) 1499*333d2b36SAndroid Build Coastguard Worker } else { 1500*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJars = android.PathsIfNonNil(resourceJarFile, implementationJarFile) 1501*333d2b36SAndroid Build Coastguard Worker } 1502*333d2b36SAndroid Build Coastguard Worker var implementationAndResourcesJar android.Path 1503*333d2b36SAndroid Build Coastguard Worker if len(implementationAndResourcesJars) > 1 { 1504*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "withres", jarName) 1505*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for resources", implementationAndResourcesJars, android.OptionalPath{}, 1506*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 1507*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJar = combinedJar 1508*333d2b36SAndroid Build Coastguard Worker } else { 1509*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJar = implementationAndResourcesJars[0] 1510*333d2b36SAndroid Build Coastguard Worker } 1511*333d2b36SAndroid Build Coastguard Worker 1512*333d2b36SAndroid Build Coastguard Worker a.implementationJarFile = implementationJarFile 1513*333d2b36SAndroid Build Coastguard Worker // Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource 1514*333d2b36SAndroid Build Coastguard Worker a.implementationAndResourcesJarFile = implementationAndResourcesJar.WithoutRel() 1515*333d2b36SAndroid Build Coastguard Worker 1516*333d2b36SAndroid Build Coastguard Worker var headerJars android.Paths 1517*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1518*333d2b36SAndroid Build Coastguard Worker headerJars = completeStaticLibsHeaderJars.ToList() 1519*333d2b36SAndroid Build Coastguard Worker } else { 1520*333d2b36SAndroid Build Coastguard Worker headerJars = append(android.Paths{classpathFile}, staticHeaderJars...) 1521*333d2b36SAndroid Build Coastguard Worker } 1522*333d2b36SAndroid Build Coastguard Worker if len(headerJars) > 1 { 1523*333d2b36SAndroid Build Coastguard Worker headerJarFile := android.PathForModuleOut(ctx, "turbine-combined", jarName) 1524*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, headerJarFile, "combine header jars", headerJars, android.OptionalPath{}, false, nil, nil) 1525*333d2b36SAndroid Build Coastguard Worker a.headerJarFile = headerJarFile 1526*333d2b36SAndroid Build Coastguard Worker } else { 1527*333d2b36SAndroid Build Coastguard Worker a.headerJarFile = headerJars[0] 1528*333d2b36SAndroid Build Coastguard Worker } 1529*333d2b36SAndroid Build Coastguard Worker 1530*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1531*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(classpathFile) 1532*333d2b36SAndroid Build Coastguard Worker } else { 1533*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(a.headerJarFile) 1534*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(a.implementationJarFile) 1535*333d2b36SAndroid Build Coastguard Worker } 1536*333d2b36SAndroid Build Coastguard Worker 1537*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ 1538*333d2b36SAndroid Build Coastguard Worker HeaderJars: android.PathsIfNonNil(a.headerJarFile), 1539*333d2b36SAndroid Build Coastguard Worker LocalHeaderJars: android.PathsIfNonNil(classpathFile), 1540*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJars: completeStaticLibsHeaderJars, 1541*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsImplementationJars: completeStaticLibsImplementationJars, 1542*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsResourceJars: completeStaticLibsResourceJars, 1543*333d2b36SAndroid Build Coastguard Worker ResourceJars: android.PathsIfNonNil(resourceJarFile), 1544*333d2b36SAndroid Build Coastguard Worker TransitiveLibsHeaderJarsForR8: a.transitiveLibsHeaderJarsForR8, 1545*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJarsForR8: a.transitiveStaticLibsHeaderJarsForR8, 1546*333d2b36SAndroid Build Coastguard Worker ImplementationAndResourcesJars: android.PathsIfNonNil(a.implementationAndResourcesJarFile), 1547*333d2b36SAndroid Build Coastguard Worker ImplementationJars: android.PathsIfNonNil(a.implementationJarFile), 1548*333d2b36SAndroid Build Coastguard Worker StubsLinkType: Implementation, 1549*333d2b36SAndroid Build Coastguard Worker // TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts 1550*333d2b36SAndroid Build Coastguard Worker }) 1551*333d2b36SAndroid Build Coastguard Worker 1552*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(a.properties.Extract_jni) { 1553*333d2b36SAndroid Build Coastguard Worker for _, t := range ctx.MultiTargets() { 1554*333d2b36SAndroid Build Coastguard Worker arch := t.Arch.Abi[0] 1555*333d2b36SAndroid Build Coastguard Worker path := android.PathForModuleOut(ctx, arch+"_jni.zip") 1556*333d2b36SAndroid Build Coastguard Worker a.jniPackages = append(a.jniPackages, path) 1557*333d2b36SAndroid Build Coastguard Worker 1558*333d2b36SAndroid Build Coastguard Worker outDir := android.PathForModuleOut(ctx, "aarForJni") 1559*333d2b36SAndroid Build Coastguard Worker aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0]) 1560*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1561*333d2b36SAndroid Build Coastguard Worker Rule: extractJNI, 1562*333d2b36SAndroid Build Coastguard Worker Input: aarPath, 1563*333d2b36SAndroid Build Coastguard Worker Outputs: android.WritablePaths{path}, 1564*333d2b36SAndroid Build Coastguard Worker Description: "extract JNI from AAR", 1565*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1566*333d2b36SAndroid Build Coastguard Worker "outDir": outDir.String(), 1567*333d2b36SAndroid Build Coastguard Worker "archString": arch, 1568*333d2b36SAndroid Build Coastguard Worker }, 1569*333d2b36SAndroid Build Coastguard Worker }) 1570*333d2b36SAndroid Build Coastguard Worker } 1571*333d2b36SAndroid Build Coastguard Worker } 1572*333d2b36SAndroid Build Coastguard Worker 1573*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{ 1574*333d2b36SAndroid Build Coastguard Worker JniPackages: a.jniPackages, 1575*333d2b36SAndroid Build Coastguard Worker }) 1576*333d2b36SAndroid Build Coastguard Worker 1577*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles([]android.Path{a.implementationAndResourcesJarFile}, "") 1578*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles([]android.Path{a.aarPath}, ".aar") 1579*333d2b36SAndroid Build Coastguard Worker} 1580*333d2b36SAndroid Build Coastguard Worker 1581*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) HeaderJars() android.Paths { 1582*333d2b36SAndroid Build Coastguard Worker return android.Paths{a.headerJarFile} 1583*333d2b36SAndroid Build Coastguard Worker} 1584*333d2b36SAndroid Build Coastguard Worker 1585*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) ImplementationAndResourcesJars() android.Paths { 1586*333d2b36SAndroid Build Coastguard Worker return android.Paths{a.implementationAndResourcesJarFile} 1587*333d2b36SAndroid Build Coastguard Worker} 1588*333d2b36SAndroid Build Coastguard Worker 1589*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { 1590*333d2b36SAndroid Build Coastguard Worker return OptionalDexJarPath{} 1591*333d2b36SAndroid Build Coastguard Worker} 1592*333d2b36SAndroid Build Coastguard Worker 1593*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) DexJarInstallPath() android.Path { 1594*333d2b36SAndroid Build Coastguard Worker return nil 1595*333d2b36SAndroid Build Coastguard Worker} 1596*333d2b36SAndroid Build Coastguard Worker 1597*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { 1598*333d2b36SAndroid Build Coastguard Worker return a.classLoaderContexts 1599*333d2b36SAndroid Build Coastguard Worker} 1600*333d2b36SAndroid Build Coastguard Worker 1601*333d2b36SAndroid Build Coastguard Workervar _ UsesLibraryDependency = (*AARImport)(nil) 1602*333d2b36SAndroid Build Coastguard Worker 1603*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*AARImport)(nil) 1604*333d2b36SAndroid Build Coastguard Worker 1605*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 1606*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 1607*333d2b36SAndroid Build Coastguard Worker return a.depIsInSameApex(ctx, dep) 1608*333d2b36SAndroid Build Coastguard Worker} 1609*333d2b36SAndroid Build Coastguard Worker 1610*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 1611*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext, 1612*333d2b36SAndroid Build Coastguard Worker sdkVersion android.ApiLevel) error { 1613*333d2b36SAndroid Build Coastguard Worker return nil 1614*333d2b36SAndroid Build Coastguard Worker} 1615*333d2b36SAndroid Build Coastguard Worker 1616*333d2b36SAndroid Build Coastguard Workervar _ android.PrebuiltInterface = (*AARImport)(nil) 1617*333d2b36SAndroid Build Coastguard Worker 1618*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) UsesLibrary() *usesLibrary { 1619*333d2b36SAndroid Build Coastguard Worker return &a.usesLibrary 1620*333d2b36SAndroid Build Coastguard Worker} 1621*333d2b36SAndroid Build Coastguard Worker 1622*333d2b36SAndroid Build Coastguard Workervar _ ModuleWithUsesLibrary = (*AARImport)(nil) 1623*333d2b36SAndroid Build Coastguard Worker 1624*333d2b36SAndroid Build Coastguard Worker// android_library_import imports an `.aar` file into the build graph as if it was built with android_library. 1625*333d2b36SAndroid Build Coastguard Worker// 1626*333d2b36SAndroid Build Coastguard Worker// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of 1627*333d2b36SAndroid Build Coastguard Worker// an android_app module. 1628*333d2b36SAndroid Build Coastguard Workerfunc AARImportFactory() android.Module { 1629*333d2b36SAndroid Build Coastguard Worker module := &AARImport{} 1630*333d2b36SAndroid Build Coastguard Worker 1631*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 1632*333d2b36SAndroid Build Coastguard Worker &module.properties, 1633*333d2b36SAndroid Build Coastguard Worker &module.usesLibrary.usesLibraryProperties, 1634*333d2b36SAndroid Build Coastguard Worker ) 1635*333d2b36SAndroid Build Coastguard Worker 1636*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModule(module, &module.properties.Aars) 1637*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 1638*333d2b36SAndroid Build Coastguard Worker InitJavaModuleMultiTargets(module, android.DeviceSupported) 1639*333d2b36SAndroid Build Coastguard Worker return module 1640*333d2b36SAndroid Build Coastguard Worker} 1641*333d2b36SAndroid Build Coastguard Worker 1642*333d2b36SAndroid Build Coastguard Workerfunc (a *AARImport) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) { 1643*333d2b36SAndroid Build Coastguard Worker dpInfo.Jars = append(dpInfo.Jars, a.headerJarFile.String(), a.rJar.String()) 1644*333d2b36SAndroid Build Coastguard Worker} 1645