1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker// This file contains the module implementations for android_app_import and android_test_import. 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerimport ( 20*333d2b36SAndroid Build Coastguard Worker "reflect" 21*333d2b36SAndroid Build Coastguard Worker "strings" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 28*333d2b36SAndroid Build Coastguard Worker "android/soong/provenance" 29*333d2b36SAndroid Build Coastguard Worker) 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerfunc init() { 32*333d2b36SAndroid Build Coastguard Worker RegisterAppImportBuildComponents(android.InitRegistrationContext) 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker initAndroidAppImportVariantGroupTypes() 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workervar ( 38*333d2b36SAndroid Build Coastguard Worker uncompressEmbeddedJniLibsRule = pctx.AndroidStaticRule("uncompress-embedded-jni-libs", blueprint.RuleParams{ 39*333d2b36SAndroid Build Coastguard Worker Command: `if (zipinfo $in 'lib/*.so' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then ` + 40*333d2b36SAndroid Build Coastguard Worker `${config.Zip2ZipCmd} -i $in -o $out -0 'lib/**/*.so'` + 41*333d2b36SAndroid Build Coastguard Worker `; else cp -f $in $out; fi`, 42*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.Zip2ZipCmd}"}, 43*333d2b36SAndroid Build Coastguard Worker Description: "Uncompress embedded JNI libs", 44*333d2b36SAndroid Build Coastguard Worker }) 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker uncompressDexRule = pctx.AndroidStaticRule("uncompress-dex", blueprint.RuleParams{ 47*333d2b36SAndroid Build Coastguard Worker Command: `if (zipinfo $in '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then ` + 48*333d2b36SAndroid Build Coastguard Worker `${config.Zip2ZipCmd} -i $in -o $out -0 'classes*.dex'` + 49*333d2b36SAndroid Build Coastguard Worker `; else cp -f $in $out; fi`, 50*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.Zip2ZipCmd}"}, 51*333d2b36SAndroid Build Coastguard Worker Description: "Uncompress dex files", 52*333d2b36SAndroid Build Coastguard Worker }) 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Worker checkPresignedApkRule = pctx.AndroidStaticRule("check-presigned-apk", blueprint.RuleParams{ 55*333d2b36SAndroid Build Coastguard Worker Command: "build/soong/scripts/check_prebuilt_presigned_apk.py --aapt2 ${config.Aapt2Cmd} --zipalign ${config.ZipAlign} $extraArgs $in $out", 56*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"build/soong/scripts/check_prebuilt_presigned_apk.py", "${config.Aapt2Cmd}", "${config.ZipAlign}"}, 57*333d2b36SAndroid Build Coastguard Worker Description: "Check presigned apk", 58*333d2b36SAndroid Build Coastguard Worker }, "extraArgs") 59*333d2b36SAndroid Build Coastguard Worker) 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Workerfunc RegisterAppImportBuildComponents(ctx android.RegistrationContext) { 62*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("android_app_import", AndroidAppImportFactory) 63*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("android_test_import", AndroidTestImportFactory) 64*333d2b36SAndroid Build Coastguard Worker ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) { 65*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("disable_prebuilts_without_apk", disablePrebuiltsWithoutApkMutator) 66*333d2b36SAndroid Build Coastguard Worker }) 67*333d2b36SAndroid Build Coastguard Worker} 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Workertype AndroidAppImport struct { 70*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 71*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 72*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 73*333d2b36SAndroid Build Coastguard Worker prebuilt android.Prebuilt 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker properties AndroidAppImportProperties 76*333d2b36SAndroid Build Coastguard Worker dpiVariants interface{} 77*333d2b36SAndroid Build Coastguard Worker archVariants interface{} 78*333d2b36SAndroid Build Coastguard Worker arch_dpiVariants interface{} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker outputFile android.Path 81*333d2b36SAndroid Build Coastguard Worker certificate Certificate 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker dexpreopter 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker usesLibrary usesLibrary 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker installPath android.InstallPath 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker provenanceMetaDataFile android.Path 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workertype AndroidAppImportProperties struct { 95*333d2b36SAndroid Build Coastguard Worker // A prebuilt apk to import 96*333d2b36SAndroid Build Coastguard Worker Apk proptools.Configurable[string] `android:"path,replace_instead_of_append"` 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker // The name of a certificate in the default certificate directory or an android_app_certificate 99*333d2b36SAndroid Build Coastguard Worker // module name in the form ":module". Should be empty if presigned or default_dev_cert is set. 100*333d2b36SAndroid Build Coastguard Worker Certificate proptools.Configurable[string] `android:"replace_instead_of_append"` 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker // Names of extra android_app_certificate modules to sign the apk with in the form ":module". 103*333d2b36SAndroid Build Coastguard Worker Additional_certificates []string 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Worker // Set this flag to true if the prebuilt apk is already signed. The certificate property must not 106*333d2b36SAndroid Build Coastguard Worker // be set for presigned modules. 107*333d2b36SAndroid Build Coastguard Worker Presigned *bool 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker // Name of the signing certificate lineage file or filegroup module. 110*333d2b36SAndroid Build Coastguard Worker Lineage *string `android:"path"` 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker // For overriding the --rotation-min-sdk-version property of apksig 113*333d2b36SAndroid Build Coastguard Worker RotationMinSdkVersion *string 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker // Sign with the default system dev certificate. Must be used judiciously. Most imported apps 116*333d2b36SAndroid Build Coastguard Worker // need to either specify a specific certificate or be presigned. 117*333d2b36SAndroid Build Coastguard Worker Default_dev_cert *bool 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker // Specifies that this app should be installed to the priv-app directory, 120*333d2b36SAndroid Build Coastguard Worker // where the system will grant it additional privileges not available to 121*333d2b36SAndroid Build Coastguard Worker // normal apps. 122*333d2b36SAndroid Build Coastguard Worker Privileged *bool 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Worker // Names of modules to be overridden. Listed modules can only be other binaries 125*333d2b36SAndroid Build Coastguard Worker // (in Make or Soong). 126*333d2b36SAndroid Build Coastguard Worker // This does not completely prevent installation of the overridden binaries, but if both 127*333d2b36SAndroid Build Coastguard Worker // binaries would be installed by default (in PRODUCT_PACKAGES) the other binary will be removed 128*333d2b36SAndroid Build Coastguard Worker // from PRODUCT_PACKAGES. 129*333d2b36SAndroid Build Coastguard Worker Overrides []string 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker // Optional name for the installed app. If unspecified, it is derived from the module name. 132*333d2b36SAndroid Build Coastguard Worker Filename *string 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker // If set, create package-export.apk, which other packages can 135*333d2b36SAndroid Build Coastguard Worker // use to get PRODUCT-agnostic resource data like IDs and type definitions. 136*333d2b36SAndroid Build Coastguard Worker Export_package_resources *bool 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker // Optional. Install to a subdirectory of the default install path for the module 139*333d2b36SAndroid Build Coastguard Worker Relative_install_path *string 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker // Whether the prebuilt apk can be installed without additional processing. Default is false. 142*333d2b36SAndroid Build Coastguard Worker Preprocessed *bool 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Worker // Whether or not to skip checking the preprocessed apk for proper alignment and uncompressed 145*333d2b36SAndroid Build Coastguard Worker // JNI libs and dex files. Default is false 146*333d2b36SAndroid Build Coastguard Worker Skip_preprocessed_apk_checks *bool 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker // Name of the source soong module that gets shadowed by this prebuilt 149*333d2b36SAndroid Build Coastguard Worker // If unspecified, follows the naming convention that the source module of 150*333d2b36SAndroid Build Coastguard Worker // the prebuilt is Name() without "prebuilt_" prefix 151*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 152*333d2b36SAndroid Build Coastguard Worker 153*333d2b36SAndroid Build Coastguard Worker // Path to the .prebuilt_info file of the prebuilt app. 154*333d2b36SAndroid Build Coastguard Worker // In case of mainline modules, the .prebuilt_info file contains the build_id that was used 155*333d2b36SAndroid Build Coastguard Worker // to generate the prebuilt. 156*333d2b36SAndroid Build Coastguard Worker Prebuilt_info *string `android:"path"` 157*333d2b36SAndroid Build Coastguard Worker} 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) IsInstallable() bool { 160*333d2b36SAndroid Build Coastguard Worker return true 161*333d2b36SAndroid Build Coastguard Worker} 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Worker// Updates properties with variant-specific values. 164*333d2b36SAndroid Build Coastguard Worker// This happens as a DefaultableHook instead of a LoadHook because we want to run it after 165*333d2b36SAndroid Build Coastguard Worker// soong config variables are applied. 166*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) processVariants(ctx android.DefaultableHookContext) { 167*333d2b36SAndroid Build Coastguard Worker config := ctx.Config() 168*333d2b36SAndroid Build Coastguard Worker dpiProps := reflect.ValueOf(a.dpiVariants).Elem().FieldByName(DpiGroupName) 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker // Try DPI variant matches in the reverse-priority order so that the highest priority match 171*333d2b36SAndroid Build Coastguard Worker // overwrites everything else. 172*333d2b36SAndroid Build Coastguard Worker // TODO(jungjw): Can we optimize this by making it priority order? 173*333d2b36SAndroid Build Coastguard Worker for i := len(config.ProductAAPTPrebuiltDPI()) - 1; i >= 0; i-- { 174*333d2b36SAndroid Build Coastguard Worker MergePropertiesFromVariant(ctx, &a.properties, dpiProps, config.ProductAAPTPrebuiltDPI()[i]) 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker if config.ProductAAPTPreferredConfig() != "" { 177*333d2b36SAndroid Build Coastguard Worker MergePropertiesFromVariant(ctx, &a.properties, dpiProps, config.ProductAAPTPreferredConfig()) 178*333d2b36SAndroid Build Coastguard Worker } 179*333d2b36SAndroid Build Coastguard Worker archProps := reflect.ValueOf(a.archVariants).Elem().FieldByName(ArchGroupName) 180*333d2b36SAndroid Build Coastguard Worker archType := ctx.Config().AndroidFirstDeviceTarget.Arch.ArchType 181*333d2b36SAndroid Build Coastguard Worker MergePropertiesFromVariant(ctx, &a.properties, archProps, archType.Name) 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker // Process "arch" includes "dpi_variants" 184*333d2b36SAndroid Build Coastguard Worker archStructPtr := reflect.ValueOf(a.arch_dpiVariants).Elem().FieldByName(ArchGroupName) 185*333d2b36SAndroid Build Coastguard Worker if archStruct := archStructPtr.Elem(); archStruct.IsValid() { 186*333d2b36SAndroid Build Coastguard Worker archPartPropsPtr := archStruct.FieldByName(proptools.FieldNameForProperty(archType.Name)) 187*333d2b36SAndroid Build Coastguard Worker if archPartProps := archPartPropsPtr.Elem(); archPartProps.IsValid() { 188*333d2b36SAndroid Build Coastguard Worker archDpiPropsPtr := archPartProps.FieldByName(DpiGroupName) 189*333d2b36SAndroid Build Coastguard Worker if archDpiProps := archDpiPropsPtr.Elem(); archDpiProps.IsValid() { 190*333d2b36SAndroid Build Coastguard Worker for i := len(config.ProductAAPTPrebuiltDPI()) - 1; i >= 0; i-- { 191*333d2b36SAndroid Build Coastguard Worker MergePropertiesFromVariant(ctx, &a.properties, archDpiProps, config.ProductAAPTPrebuiltDPI()[i]) 192*333d2b36SAndroid Build Coastguard Worker } 193*333d2b36SAndroid Build Coastguard Worker if config.ProductAAPTPreferredConfig() != "" { 194*333d2b36SAndroid Build Coastguard Worker MergePropertiesFromVariant(ctx, &a.properties, archDpiProps, config.ProductAAPTPreferredConfig()) 195*333d2b36SAndroid Build Coastguard Worker } 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker } 198*333d2b36SAndroid Build Coastguard Worker } 199*333d2b36SAndroid Build Coastguard Worker} 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Workerfunc MergePropertiesFromVariant(ctx android.EarlyModuleContext, 202*333d2b36SAndroid Build Coastguard Worker dst interface{}, variantGroup reflect.Value, variant string) { 203*333d2b36SAndroid Build Coastguard Worker src := variantGroup.FieldByName(proptools.FieldNameForProperty(variant)) 204*333d2b36SAndroid Build Coastguard Worker if !src.IsValid() { 205*333d2b36SAndroid Build Coastguard Worker return 206*333d2b36SAndroid Build Coastguard Worker } 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker err := proptools.ExtendMatchingProperties([]interface{}{dst}, src.Interface(), nil, proptools.OrderAppend) 209*333d2b36SAndroid Build Coastguard Worker if err != nil { 210*333d2b36SAndroid Build Coastguard Worker if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok { 211*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error()) 212*333d2b36SAndroid Build Coastguard Worker } else { 213*333d2b36SAndroid Build Coastguard Worker panic(err) 214*333d2b36SAndroid Build Coastguard Worker } 215*333d2b36SAndroid Build Coastguard Worker } 216*333d2b36SAndroid Build Coastguard Worker} 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Worker// disablePrebuiltsWithoutApkMutator is a pre-arch mutator that disables AndroidAppImport or 219*333d2b36SAndroid Build Coastguard Worker// AndroidTestImport modules that don't have an apk set. We need this separate mutator instead 220*333d2b36SAndroid Build Coastguard Worker// of doing it in processVariants because processVariants is a defaultable hook, and configurable 221*333d2b36SAndroid Build Coastguard Worker// properties can only be evaluated after the defaults (and eventually, base configurabtion) 222*333d2b36SAndroid Build Coastguard Worker// mutators. 223*333d2b36SAndroid Build Coastguard Workerfunc disablePrebuiltsWithoutApkMutator(ctx android.BottomUpMutatorContext) { 224*333d2b36SAndroid Build Coastguard Worker switch a := ctx.Module().(type) { 225*333d2b36SAndroid Build Coastguard Worker case *AndroidAppImport: 226*333d2b36SAndroid Build Coastguard Worker if a.properties.Apk.GetOrDefault(ctx, "") == "" { 227*333d2b36SAndroid Build Coastguard Worker // Disable this module since the apk property is still empty after processing all 228*333d2b36SAndroid Build Coastguard Worker // matching variants. This likely means there is no matching variant, and the default 229*333d2b36SAndroid Build Coastguard Worker // variant doesn't have an apk property value either. 230*333d2b36SAndroid Build Coastguard Worker a.Disable() 231*333d2b36SAndroid Build Coastguard Worker } 232*333d2b36SAndroid Build Coastguard Worker case *AndroidTestImport: 233*333d2b36SAndroid Build Coastguard Worker if a.properties.Apk.GetOrDefault(ctx, "") == "" { 234*333d2b36SAndroid Build Coastguard Worker // Disable this module since the apk property is still empty after processing all 235*333d2b36SAndroid Build Coastguard Worker // matching variants. This likely means there is no matching variant, and the default 236*333d2b36SAndroid Build Coastguard Worker // variant doesn't have an apk property value either. 237*333d2b36SAndroid Build Coastguard Worker a.Disable() 238*333d2b36SAndroid Build Coastguard Worker } 239*333d2b36SAndroid Build Coastguard Worker } 240*333d2b36SAndroid Build Coastguard Worker} 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) DepsMutator(ctx android.BottomUpMutatorContext) { 243*333d2b36SAndroid Build Coastguard Worker cert := android.SrcIsModule(a.properties.Certificate.GetOrDefault(ctx, "")) 244*333d2b36SAndroid Build Coastguard Worker if cert != "" { 245*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), certificateTag, cert) 246*333d2b36SAndroid Build Coastguard Worker } 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Worker for _, cert := range a.properties.Additional_certificates { 249*333d2b36SAndroid Build Coastguard Worker cert = android.SrcIsModule(cert) 250*333d2b36SAndroid Build Coastguard Worker if cert != "" { 251*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), certificateTag, cert) 252*333d2b36SAndroid Build Coastguard Worker } else { 253*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("additional_certificates", 254*333d2b36SAndroid Build Coastguard Worker `must be names of android_app_certificate modules in the form ":module"`) 255*333d2b36SAndroid Build Coastguard Worker } 256*333d2b36SAndroid Build Coastguard Worker } 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker a.usesLibrary.deps(ctx, true) 259*333d2b36SAndroid Build Coastguard Worker} 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) uncompressEmbeddedJniLibs( 262*333d2b36SAndroid Build Coastguard Worker ctx android.ModuleContext, inputPath android.Path, outputPath android.WritablePath) { 263*333d2b36SAndroid Build Coastguard Worker // Test apps don't need their JNI libraries stored uncompressed. As a matter of fact, messing 264*333d2b36SAndroid Build Coastguard Worker // with them may invalidate pre-existing signature data. 265*333d2b36SAndroid Build Coastguard Worker if ctx.InstallInTestcases() && (Bool(a.properties.Presigned) || Bool(a.properties.Preprocessed)) { 266*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 267*333d2b36SAndroid Build Coastguard Worker Rule: android.Cp, 268*333d2b36SAndroid Build Coastguard Worker Output: outputPath, 269*333d2b36SAndroid Build Coastguard Worker Input: inputPath, 270*333d2b36SAndroid Build Coastguard Worker }) 271*333d2b36SAndroid Build Coastguard Worker return 272*333d2b36SAndroid Build Coastguard Worker } 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 275*333d2b36SAndroid Build Coastguard Worker Rule: uncompressEmbeddedJniLibsRule, 276*333d2b36SAndroid Build Coastguard Worker Input: inputPath, 277*333d2b36SAndroid Build Coastguard Worker Output: outputPath, 278*333d2b36SAndroid Build Coastguard Worker }) 279*333d2b36SAndroid Build Coastguard Worker} 280*333d2b36SAndroid Build Coastguard Worker 281*333d2b36SAndroid Build Coastguard Worker// Returns whether this module should have the dex file stored uncompressed in the APK. 282*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) shouldUncompressDex(ctx android.ModuleContext) bool { 283*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UnbundledBuild() || proptools.Bool(a.properties.Preprocessed) { 284*333d2b36SAndroid Build Coastguard Worker return false 285*333d2b36SAndroid Build Coastguard Worker } 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker // Uncompress dex in APKs of priv-apps if and only if DONT_UNCOMPRESS_PRIV_APPS_DEXS is false. 288*333d2b36SAndroid Build Coastguard Worker if a.Privileged() { 289*333d2b36SAndroid Build Coastguard Worker return ctx.Config().UncompressPrivAppDex() 290*333d2b36SAndroid Build Coastguard Worker } 291*333d2b36SAndroid Build Coastguard Worker 292*333d2b36SAndroid Build Coastguard Worker return shouldUncompressDex(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), &a.dexpreopter) 293*333d2b36SAndroid Build Coastguard Worker} 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { 296*333d2b36SAndroid Build Coastguard Worker a.generateAndroidBuildActions(ctx) 297*333d2b36SAndroid Build Coastguard Worker} 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) InstallApkName() string { 300*333d2b36SAndroid Build Coastguard Worker return a.BaseModuleName() 301*333d2b36SAndroid Build Coastguard Worker} 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) BaseModuleName() string { 304*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(a.properties.Source_module_name, a.ModuleBase.Name()) 305*333d2b36SAndroid Build Coastguard Worker} 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext) { 308*333d2b36SAndroid Build Coastguard Worker if a.Name() == "prebuilt_framework-res" { 309*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("prebuilt_framework-res found. This used to have special handling in soong, but was removed due to prebuilt_framework-res no longer existing. This check is to ensure it doesn't come back without readding the special handling.") 310*333d2b36SAndroid Build Coastguard Worker } 311*333d2b36SAndroid Build Coastguard Worker 312*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 313*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 314*333d2b36SAndroid Build Coastguard Worker a.hideApexVariantFromMake = true 315*333d2b36SAndroid Build Coastguard Worker } 316*333d2b36SAndroid Build Coastguard Worker 317*333d2b36SAndroid Build Coastguard Worker if Bool(a.properties.Preprocessed) { 318*333d2b36SAndroid Build Coastguard Worker if a.properties.Presigned != nil && !*a.properties.Presigned { 319*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Setting preprocessed: true implies presigned: true, so you cannot set presigned to false") 320*333d2b36SAndroid Build Coastguard Worker } 321*333d2b36SAndroid Build Coastguard Worker t := true 322*333d2b36SAndroid Build Coastguard Worker a.properties.Presigned = &t 323*333d2b36SAndroid Build Coastguard Worker } 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker numCertPropsSet := 0 326*333d2b36SAndroid Build Coastguard Worker if a.properties.Certificate.GetOrDefault(ctx, "") != "" { 327*333d2b36SAndroid Build Coastguard Worker numCertPropsSet++ 328*333d2b36SAndroid Build Coastguard Worker } 329*333d2b36SAndroid Build Coastguard Worker if Bool(a.properties.Presigned) { 330*333d2b36SAndroid Build Coastguard Worker numCertPropsSet++ 331*333d2b36SAndroid Build Coastguard Worker } 332*333d2b36SAndroid Build Coastguard Worker if Bool(a.properties.Default_dev_cert) { 333*333d2b36SAndroid Build Coastguard Worker numCertPropsSet++ 334*333d2b36SAndroid Build Coastguard Worker } 335*333d2b36SAndroid Build Coastguard Worker if numCertPropsSet != 1 { 336*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("One and only one of certficate, presigned (implied by preprocessed), and default_dev_cert properties must be set") 337*333d2b36SAndroid Build Coastguard Worker } 338*333d2b36SAndroid Build Coastguard Worker 339*333d2b36SAndroid Build Coastguard Worker // TODO: LOCAL_EXTRACT_APK/LOCAL_EXTRACT_DPI_APK 340*333d2b36SAndroid Build Coastguard Worker // TODO: LOCAL_PACKAGE_SPLITS 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Worker srcApk := a.prebuilt.SingleSourcePath(ctx) 343*333d2b36SAndroid Build Coastguard Worker 344*333d2b36SAndroid Build Coastguard Worker // TODO: Install or embed JNI libraries 345*333d2b36SAndroid Build Coastguard Worker 346*333d2b36SAndroid Build Coastguard Worker // Uncompress JNI libraries in the apk 347*333d2b36SAndroid Build Coastguard Worker jnisUncompressed := android.PathForModuleOut(ctx, "jnis-uncompressed", ctx.ModuleName()+".apk") 348*333d2b36SAndroid Build Coastguard Worker a.uncompressEmbeddedJniLibs(ctx, srcApk, jnisUncompressed) 349*333d2b36SAndroid Build Coastguard Worker 350*333d2b36SAndroid Build Coastguard Worker var pathFragments []string 351*333d2b36SAndroid Build Coastguard Worker relInstallPath := String(a.properties.Relative_install_path) 352*333d2b36SAndroid Build Coastguard Worker 353*333d2b36SAndroid Build Coastguard Worker if Bool(a.properties.Privileged) { 354*333d2b36SAndroid Build Coastguard Worker pathFragments = []string{"priv-app", relInstallPath, a.BaseModuleName()} 355*333d2b36SAndroid Build Coastguard Worker } else if ctx.InstallInTestcases() { 356*333d2b36SAndroid Build Coastguard Worker pathFragments = []string{relInstallPath, a.BaseModuleName(), ctx.DeviceConfig().DeviceArch()} 357*333d2b36SAndroid Build Coastguard Worker } else { 358*333d2b36SAndroid Build Coastguard Worker pathFragments = []string{"app", relInstallPath, a.BaseModuleName()} 359*333d2b36SAndroid Build Coastguard Worker } 360*333d2b36SAndroid Build Coastguard Worker 361*333d2b36SAndroid Build Coastguard Worker installDir := android.PathForModuleInstall(ctx, pathFragments...) 362*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.isApp = true 363*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.installPath = installDir.Join(ctx, a.BaseModuleName()+".apk") 364*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.isPresignedPrebuilt = Bool(a.properties.Presigned) 365*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.uncompressedDex = a.shouldUncompressDex(ctx) 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.enforceUsesLibs = a.usesLibrary.enforceUsesLibraries(ctx) 368*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx) 369*333d2b36SAndroid Build Coastguard Worker if a.usesLibrary.shouldDisableDexpreopt { 370*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.disableDexpreopt() 371*333d2b36SAndroid Build Coastguard Worker } 372*333d2b36SAndroid Build Coastguard Worker 373*333d2b36SAndroid Build Coastguard Worker if a.usesLibrary.enforceUsesLibraries(ctx) { 374*333d2b36SAndroid Build Coastguard Worker a.usesLibrary.verifyUsesLibrariesAPK(ctx, srcApk, &a.dexpreopter.classLoaderContexts) 375*333d2b36SAndroid Build Coastguard Worker } 376*333d2b36SAndroid Build Coastguard Worker 377*333d2b36SAndroid Build Coastguard Worker a.dexpreopter.dexpreopt(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), jnisUncompressed) 378*333d2b36SAndroid Build Coastguard Worker if a.dexpreopter.uncompressedDex { 379*333d2b36SAndroid Build Coastguard Worker dexUncompressed := android.PathForModuleOut(ctx, "dex-uncompressed", ctx.ModuleName()+".apk") 380*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 381*333d2b36SAndroid Build Coastguard Worker Rule: uncompressDexRule, 382*333d2b36SAndroid Build Coastguard Worker Input: jnisUncompressed, 383*333d2b36SAndroid Build Coastguard Worker Output: dexUncompressed, 384*333d2b36SAndroid Build Coastguard Worker }) 385*333d2b36SAndroid Build Coastguard Worker jnisUncompressed = dexUncompressed 386*333d2b36SAndroid Build Coastguard Worker } 387*333d2b36SAndroid Build Coastguard Worker 388*333d2b36SAndroid Build Coastguard Worker apkFilename := proptools.StringDefault(a.properties.Filename, a.BaseModuleName()+".apk") 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker // TODO: Handle EXTERNAL 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Worker // Sign or align the package if package has not been preprocessed 393*333d2b36SAndroid Build Coastguard Worker 394*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(a.properties.Preprocessed) { 395*333d2b36SAndroid Build Coastguard Worker validationStamp := a.validatePresignedApk(ctx, srcApk) 396*333d2b36SAndroid Build Coastguard Worker output := android.PathForModuleOut(ctx, apkFilename) 397*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 398*333d2b36SAndroid Build Coastguard Worker Rule: android.Cp, 399*333d2b36SAndroid Build Coastguard Worker Input: srcApk, 400*333d2b36SAndroid Build Coastguard Worker Output: output, 401*333d2b36SAndroid Build Coastguard Worker Validation: validationStamp, 402*333d2b36SAndroid Build Coastguard Worker }) 403*333d2b36SAndroid Build Coastguard Worker a.outputFile = output 404*333d2b36SAndroid Build Coastguard Worker a.certificate = PresignedCertificate 405*333d2b36SAndroid Build Coastguard Worker } else if !Bool(a.properties.Presigned) { 406*333d2b36SAndroid Build Coastguard Worker // If the certificate property is empty at this point, default_dev_cert must be set to true. 407*333d2b36SAndroid Build Coastguard Worker // Which makes processMainCert's behavior for the empty cert string WAI. 408*333d2b36SAndroid Build Coastguard Worker _, _, certificates := collectAppDeps(ctx, a, false, false) 409*333d2b36SAndroid Build Coastguard Worker a.certificate, certificates = processMainCert(a.ModuleBase, a.properties.Certificate.GetOrDefault(ctx, ""), certificates, ctx) 410*333d2b36SAndroid Build Coastguard Worker signed := android.PathForModuleOut(ctx, "signed", apkFilename) 411*333d2b36SAndroid Build Coastguard Worker var lineageFile android.Path 412*333d2b36SAndroid Build Coastguard Worker if lineage := String(a.properties.Lineage); lineage != "" { 413*333d2b36SAndroid Build Coastguard Worker lineageFile = android.PathForModuleSrc(ctx, lineage) 414*333d2b36SAndroid Build Coastguard Worker } 415*333d2b36SAndroid Build Coastguard Worker 416*333d2b36SAndroid Build Coastguard Worker rotationMinSdkVersion := String(a.properties.RotationMinSdkVersion) 417*333d2b36SAndroid Build Coastguard Worker 418*333d2b36SAndroid Build Coastguard Worker SignAppPackage(ctx, signed, jnisUncompressed, certificates, nil, lineageFile, rotationMinSdkVersion) 419*333d2b36SAndroid Build Coastguard Worker a.outputFile = signed 420*333d2b36SAndroid Build Coastguard Worker } else { 421*333d2b36SAndroid Build Coastguard Worker validationStamp := a.validatePresignedApk(ctx, srcApk) 422*333d2b36SAndroid Build Coastguard Worker alignedApk := android.PathForModuleOut(ctx, "zip-aligned", apkFilename) 423*333d2b36SAndroid Build Coastguard Worker TransformZipAlign(ctx, alignedApk, jnisUncompressed, []android.Path{validationStamp}) 424*333d2b36SAndroid Build Coastguard Worker a.outputFile = alignedApk 425*333d2b36SAndroid Build Coastguard Worker a.certificate = PresignedCertificate 426*333d2b36SAndroid Build Coastguard Worker } 427*333d2b36SAndroid Build Coastguard Worker 428*333d2b36SAndroid Build Coastguard Worker // TODO: Optionally compress the output apk. 429*333d2b36SAndroid Build Coastguard Worker 430*333d2b36SAndroid Build Coastguard Worker if apexInfo.IsForPlatform() { 431*333d2b36SAndroid Build Coastguard Worker a.installPath = ctx.InstallFile(installDir, apkFilename, a.outputFile) 432*333d2b36SAndroid Build Coastguard Worker artifactPath := android.PathForModuleSrc(ctx, a.properties.Apk.GetOrDefault(ctx, "")) 433*333d2b36SAndroid Build Coastguard Worker a.provenanceMetaDataFile = provenance.GenerateArtifactProvenanceMetaData(ctx, artifactPath, a.installPath) 434*333d2b36SAndroid Build Coastguard Worker } 435*333d2b36SAndroid Build Coastguard Worker 436*333d2b36SAndroid Build Coastguard Worker providePrebuiltInfo(ctx, 437*333d2b36SAndroid Build Coastguard Worker prebuiltInfoProps{ 438*333d2b36SAndroid Build Coastguard Worker baseModuleName: a.BaseModuleName(), 439*333d2b36SAndroid Build Coastguard Worker isPrebuilt: true, 440*333d2b36SAndroid Build Coastguard Worker prebuiltInfo: a.properties.Prebuilt_info, 441*333d2b36SAndroid Build Coastguard Worker }, 442*333d2b36SAndroid Build Coastguard Worker ) 443*333d2b36SAndroid Build Coastguard Worker 444*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles([]android.Path{a.outputFile}, "") 445*333d2b36SAndroid Build Coastguard Worker 446*333d2b36SAndroid Build Coastguard Worker // TODO: androidmk converter jni libs 447*333d2b36SAndroid Build Coastguard Worker} 448*333d2b36SAndroid Build Coastguard Worker 449*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) validatePresignedApk(ctx android.ModuleContext, srcApk android.Path) android.Path { 450*333d2b36SAndroid Build Coastguard Worker stamp := android.PathForModuleOut(ctx, "validated-prebuilt", "check.stamp") 451*333d2b36SAndroid Build Coastguard Worker var extraArgs []string 452*333d2b36SAndroid Build Coastguard Worker if a.Privileged() { 453*333d2b36SAndroid Build Coastguard Worker extraArgs = append(extraArgs, "--privileged") 454*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UncompressPrivAppDex() { 455*333d2b36SAndroid Build Coastguard Worker extraArgs = append(extraArgs, "--uncompress-priv-app-dex") 456*333d2b36SAndroid Build Coastguard Worker } 457*333d2b36SAndroid Build Coastguard Worker } 458*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(a.properties.Skip_preprocessed_apk_checks) { 459*333d2b36SAndroid Build Coastguard Worker extraArgs = append(extraArgs, "--skip-preprocessed-apk-checks") 460*333d2b36SAndroid Build Coastguard Worker } 461*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(a.properties.Preprocessed) { 462*333d2b36SAndroid Build Coastguard Worker extraArgs = append(extraArgs, "--preprocessed") 463*333d2b36SAndroid Build Coastguard Worker } 464*333d2b36SAndroid Build Coastguard Worker 465*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 466*333d2b36SAndroid Build Coastguard Worker Rule: checkPresignedApkRule, 467*333d2b36SAndroid Build Coastguard Worker Input: srcApk, 468*333d2b36SAndroid Build Coastguard Worker Output: stamp, 469*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 470*333d2b36SAndroid Build Coastguard Worker "extraArgs": strings.Join(extraArgs, " "), 471*333d2b36SAndroid Build Coastguard Worker }, 472*333d2b36SAndroid Build Coastguard Worker }) 473*333d2b36SAndroid Build Coastguard Worker return stamp 474*333d2b36SAndroid Build Coastguard Worker} 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) Prebuilt() *android.Prebuilt { 477*333d2b36SAndroid Build Coastguard Worker return &a.prebuilt 478*333d2b36SAndroid Build Coastguard Worker} 479*333d2b36SAndroid Build Coastguard Worker 480*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) Name() string { 481*333d2b36SAndroid Build Coastguard Worker return a.prebuilt.Name(a.ModuleBase.Name()) 482*333d2b36SAndroid Build Coastguard Worker} 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) OutputFile() android.Path { 485*333d2b36SAndroid Build Coastguard Worker return a.outputFile 486*333d2b36SAndroid Build Coastguard Worker} 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) JacocoReportClassesFile() android.Path { 489*333d2b36SAndroid Build Coastguard Worker return nil 490*333d2b36SAndroid Build Coastguard Worker} 491*333d2b36SAndroid Build Coastguard Worker 492*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) Certificate() Certificate { 493*333d2b36SAndroid Build Coastguard Worker return a.certificate 494*333d2b36SAndroid Build Coastguard Worker} 495*333d2b36SAndroid Build Coastguard Worker 496*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) ProvenanceMetaDataFile() android.Path { 497*333d2b36SAndroid Build Coastguard Worker return a.provenanceMetaDataFile 498*333d2b36SAndroid Build Coastguard Worker} 499*333d2b36SAndroid Build Coastguard Worker 500*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) PrivAppAllowlist() android.OptionalPath { 501*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 502*333d2b36SAndroid Build Coastguard Worker} 503*333d2b36SAndroid Build Coastguard Worker 504*333d2b36SAndroid Build Coastguard Workerconst ( 505*333d2b36SAndroid Build Coastguard Worker ArchGroupName = "Arch" 506*333d2b36SAndroid Build Coastguard Worker DpiGroupName = "Dpi_variants" 507*333d2b36SAndroid Build Coastguard Worker) 508*333d2b36SAndroid Build Coastguard Worker 509*333d2b36SAndroid Build Coastguard Workervar dpiVariantGroupType reflect.Type 510*333d2b36SAndroid Build Coastguard Workervar archVariantGroupType reflect.Type 511*333d2b36SAndroid Build Coastguard Workervar archdpiVariantGroupType reflect.Type 512*333d2b36SAndroid Build Coastguard Workervar supportedDpis = []string{"ldpi", "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"} 513*333d2b36SAndroid Build Coastguard Worker 514*333d2b36SAndroid Build Coastguard Workerfunc initAndroidAppImportVariantGroupTypes() { 515*333d2b36SAndroid Build Coastguard Worker dpiVariantGroupType = createVariantGroupType(supportedDpis, DpiGroupName) 516*333d2b36SAndroid Build Coastguard Worker 517*333d2b36SAndroid Build Coastguard Worker archNames := make([]string, len(android.ArchTypeList())) 518*333d2b36SAndroid Build Coastguard Worker for i, archType := range android.ArchTypeList() { 519*333d2b36SAndroid Build Coastguard Worker archNames[i] = archType.Name 520*333d2b36SAndroid Build Coastguard Worker } 521*333d2b36SAndroid Build Coastguard Worker archVariantGroupType = createVariantGroupType(archNames, ArchGroupName) 522*333d2b36SAndroid Build Coastguard Worker archdpiVariantGroupType = createArchDpiVariantGroupType(archNames, supportedDpis) 523*333d2b36SAndroid Build Coastguard Worker} 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Worker// Populates all variant struct properties at creation time. 526*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) populateAllVariantStructs() { 527*333d2b36SAndroid Build Coastguard Worker a.dpiVariants = reflect.New(dpiVariantGroupType).Interface() 528*333d2b36SAndroid Build Coastguard Worker a.AddProperties(a.dpiVariants) 529*333d2b36SAndroid Build Coastguard Worker 530*333d2b36SAndroid Build Coastguard Worker a.archVariants = reflect.New(archVariantGroupType).Interface() 531*333d2b36SAndroid Build Coastguard Worker a.AddProperties(a.archVariants) 532*333d2b36SAndroid Build Coastguard Worker 533*333d2b36SAndroid Build Coastguard Worker a.arch_dpiVariants = reflect.New(archdpiVariantGroupType).Interface() 534*333d2b36SAndroid Build Coastguard Worker a.AddProperties(a.arch_dpiVariants) 535*333d2b36SAndroid Build Coastguard Worker} 536*333d2b36SAndroid Build Coastguard Worker 537*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) Privileged() bool { 538*333d2b36SAndroid Build Coastguard Worker return Bool(a.properties.Privileged) 539*333d2b36SAndroid Build Coastguard Worker} 540*333d2b36SAndroid Build Coastguard Worker 541*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) DepIsInSameApex(_ android.BaseModuleContext, _ android.Module) bool { 542*333d2b36SAndroid Build Coastguard Worker // android_app_import might have extra dependencies via uses_libs property. 543*333d2b36SAndroid Build Coastguard Worker // Don't track the dependency as we don't automatically add those libraries 544*333d2b36SAndroid Build Coastguard Worker // to the classpath. It should be explicitly added to java_libs property of APEX 545*333d2b36SAndroid Build Coastguard Worker return false 546*333d2b36SAndroid Build Coastguard Worker} 547*333d2b36SAndroid Build Coastguard Worker 548*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec { 549*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecPrivate 550*333d2b36SAndroid Build Coastguard Worker} 551*333d2b36SAndroid Build Coastguard Worker 552*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 553*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecPrivate.ApiLevel 554*333d2b36SAndroid Build Coastguard Worker} 555*333d2b36SAndroid Build Coastguard Worker 556*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*AndroidAppImport)(nil) 557*333d2b36SAndroid Build Coastguard Worker 558*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 559*333d2b36SAndroid Build Coastguard Workerfunc (j *AndroidAppImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext, 560*333d2b36SAndroid Build Coastguard Worker sdkVersion android.ApiLevel) error { 561*333d2b36SAndroid Build Coastguard Worker // Do not check for prebuilts against the min_sdk_version of enclosing APEX 562*333d2b36SAndroid Build Coastguard Worker return nil 563*333d2b36SAndroid Build Coastguard Worker} 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Workerfunc createVariantGroupType(variants []string, variantGroupName string) reflect.Type { 566*333d2b36SAndroid Build Coastguard Worker props := reflect.TypeOf((*AndroidAppImportProperties)(nil)) 567*333d2b36SAndroid Build Coastguard Worker 568*333d2b36SAndroid Build Coastguard Worker variantFields := make([]reflect.StructField, len(variants)) 569*333d2b36SAndroid Build Coastguard Worker for i, variant := range variants { 570*333d2b36SAndroid Build Coastguard Worker variantFields[i] = reflect.StructField{ 571*333d2b36SAndroid Build Coastguard Worker Name: proptools.FieldNameForProperty(variant), 572*333d2b36SAndroid Build Coastguard Worker Type: props, 573*333d2b36SAndroid Build Coastguard Worker } 574*333d2b36SAndroid Build Coastguard Worker } 575*333d2b36SAndroid Build Coastguard Worker 576*333d2b36SAndroid Build Coastguard Worker variantGroupStruct := reflect.StructOf(variantFields) 577*333d2b36SAndroid Build Coastguard Worker return reflect.StructOf([]reflect.StructField{ 578*333d2b36SAndroid Build Coastguard Worker { 579*333d2b36SAndroid Build Coastguard Worker Name: variantGroupName, 580*333d2b36SAndroid Build Coastguard Worker Type: variantGroupStruct, 581*333d2b36SAndroid Build Coastguard Worker }, 582*333d2b36SAndroid Build Coastguard Worker }) 583*333d2b36SAndroid Build Coastguard Worker} 584*333d2b36SAndroid Build Coastguard Worker 585*333d2b36SAndroid Build Coastguard Workerfunc createArchDpiVariantGroupType(archNames []string, dpiNames []string) reflect.Type { 586*333d2b36SAndroid Build Coastguard Worker props := reflect.TypeOf((*AndroidAppImportProperties)(nil)) 587*333d2b36SAndroid Build Coastguard Worker 588*333d2b36SAndroid Build Coastguard Worker dpiVariantFields := make([]reflect.StructField, len(dpiNames)) 589*333d2b36SAndroid Build Coastguard Worker for i, variant_dpi := range dpiNames { 590*333d2b36SAndroid Build Coastguard Worker dpiVariantFields[i] = reflect.StructField{ 591*333d2b36SAndroid Build Coastguard Worker Name: proptools.FieldNameForProperty(variant_dpi), 592*333d2b36SAndroid Build Coastguard Worker Type: props, 593*333d2b36SAndroid Build Coastguard Worker } 594*333d2b36SAndroid Build Coastguard Worker } 595*333d2b36SAndroid Build Coastguard Worker dpiVariantGroupStruct := reflect.StructOf(dpiVariantFields) 596*333d2b36SAndroid Build Coastguard Worker dpi_struct := reflect.StructOf([]reflect.StructField{ 597*333d2b36SAndroid Build Coastguard Worker { 598*333d2b36SAndroid Build Coastguard Worker Name: DpiGroupName, 599*333d2b36SAndroid Build Coastguard Worker Type: reflect.PointerTo(dpiVariantGroupStruct), 600*333d2b36SAndroid Build Coastguard Worker }, 601*333d2b36SAndroid Build Coastguard Worker }) 602*333d2b36SAndroid Build Coastguard Worker 603*333d2b36SAndroid Build Coastguard Worker archVariantFields := make([]reflect.StructField, len(archNames)) 604*333d2b36SAndroid Build Coastguard Worker for i, variant_arch := range archNames { 605*333d2b36SAndroid Build Coastguard Worker archVariantFields[i] = reflect.StructField{ 606*333d2b36SAndroid Build Coastguard Worker Name: proptools.FieldNameForProperty(variant_arch), 607*333d2b36SAndroid Build Coastguard Worker Type: reflect.PointerTo(dpi_struct), 608*333d2b36SAndroid Build Coastguard Worker } 609*333d2b36SAndroid Build Coastguard Worker } 610*333d2b36SAndroid Build Coastguard Worker archVariantGroupStruct := reflect.StructOf(archVariantFields) 611*333d2b36SAndroid Build Coastguard Worker 612*333d2b36SAndroid Build Coastguard Worker return_struct := reflect.StructOf([]reflect.StructField{ 613*333d2b36SAndroid Build Coastguard Worker { 614*333d2b36SAndroid Build Coastguard Worker Name: ArchGroupName, 615*333d2b36SAndroid Build Coastguard Worker Type: reflect.PointerTo(archVariantGroupStruct), 616*333d2b36SAndroid Build Coastguard Worker }, 617*333d2b36SAndroid Build Coastguard Worker }) 618*333d2b36SAndroid Build Coastguard Worker return return_struct 619*333d2b36SAndroid Build Coastguard Worker} 620*333d2b36SAndroid Build Coastguard Worker 621*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidAppImport) UsesLibrary() *usesLibrary { 622*333d2b36SAndroid Build Coastguard Worker return &a.usesLibrary 623*333d2b36SAndroid Build Coastguard Worker} 624*333d2b36SAndroid Build Coastguard Worker 625*333d2b36SAndroid Build Coastguard Workervar _ ModuleWithUsesLibrary = (*AndroidAppImport)(nil) 626*333d2b36SAndroid Build Coastguard Worker 627*333d2b36SAndroid Build Coastguard Worker// android_app_import imports a prebuilt apk with additional processing specified in the module. 628*333d2b36SAndroid Build Coastguard Worker// DPI-specific apk source files can be specified using dpi_variants. Example: 629*333d2b36SAndroid Build Coastguard Worker// 630*333d2b36SAndroid Build Coastguard Worker// android_app_import { 631*333d2b36SAndroid Build Coastguard Worker// name: "example_import", 632*333d2b36SAndroid Build Coastguard Worker// apk: "prebuilts/example.apk", 633*333d2b36SAndroid Build Coastguard Worker// dpi_variants: { 634*333d2b36SAndroid Build Coastguard Worker// mdpi: { 635*333d2b36SAndroid Build Coastguard Worker// apk: "prebuilts/example_mdpi.apk", 636*333d2b36SAndroid Build Coastguard Worker// }, 637*333d2b36SAndroid Build Coastguard Worker// xhdpi: { 638*333d2b36SAndroid Build Coastguard Worker// apk: "prebuilts/example_xhdpi.apk", 639*333d2b36SAndroid Build Coastguard Worker// }, 640*333d2b36SAndroid Build Coastguard Worker// }, 641*333d2b36SAndroid Build Coastguard Worker// presigned: true, 642*333d2b36SAndroid Build Coastguard Worker// } 643*333d2b36SAndroid Build Coastguard Workerfunc AndroidAppImportFactory() android.Module { 644*333d2b36SAndroid Build Coastguard Worker module := &AndroidAppImport{} 645*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 646*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.dexpreoptProperties) 647*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.usesLibrary.usesLibraryProperties) 648*333d2b36SAndroid Build Coastguard Worker module.populateAllVariantStructs() 649*333d2b36SAndroid Build Coastguard Worker module.SetDefaultableHook(func(ctx android.DefaultableHookContext) { 650*333d2b36SAndroid Build Coastguard Worker module.processVariants(ctx) 651*333d2b36SAndroid Build Coastguard Worker }) 652*333d2b36SAndroid Build Coastguard Worker 653*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 654*333d2b36SAndroid Build Coastguard Worker android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) 655*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 656*333d2b36SAndroid Build Coastguard Worker android.InitConfigurablePrebuiltModuleString(module, &module.properties.Apk, "Apk") 657*333d2b36SAndroid Build Coastguard Worker 658*333d2b36SAndroid Build Coastguard Worker module.usesLibrary.enforce = true 659*333d2b36SAndroid Build Coastguard Worker 660*333d2b36SAndroid Build Coastguard Worker return module 661*333d2b36SAndroid Build Coastguard Worker} 662*333d2b36SAndroid Build Coastguard Worker 663*333d2b36SAndroid Build Coastguard Workertype AndroidTestImport struct { 664*333d2b36SAndroid Build Coastguard Worker AndroidAppImport 665*333d2b36SAndroid Build Coastguard Worker 666*333d2b36SAndroid Build Coastguard Worker testProperties struct { 667*333d2b36SAndroid Build Coastguard Worker // list of compatibility suites (for example "cts", "vts") that the module should be 668*333d2b36SAndroid Build Coastguard Worker // installed into. 669*333d2b36SAndroid Build Coastguard Worker Test_suites []string `android:"arch_variant"` 670*333d2b36SAndroid Build Coastguard Worker 671*333d2b36SAndroid Build Coastguard Worker // list of files or filegroup modules that provide data that should be installed alongside 672*333d2b36SAndroid Build Coastguard Worker // the test 673*333d2b36SAndroid Build Coastguard Worker Data []string `android:"path"` 674*333d2b36SAndroid Build Coastguard Worker 675*333d2b36SAndroid Build Coastguard Worker // Install the test into a folder named for the module in all test suites. 676*333d2b36SAndroid Build Coastguard Worker Per_testcase_directory *bool 677*333d2b36SAndroid Build Coastguard Worker } 678*333d2b36SAndroid Build Coastguard Worker 679*333d2b36SAndroid Build Coastguard Worker data android.Paths 680*333d2b36SAndroid Build Coastguard Worker} 681*333d2b36SAndroid Build Coastguard Worker 682*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { 683*333d2b36SAndroid Build Coastguard Worker a.generateAndroidBuildActions(ctx) 684*333d2b36SAndroid Build Coastguard Worker 685*333d2b36SAndroid Build Coastguard Worker a.data = android.PathsForModuleSrc(ctx, a.testProperties.Data) 686*333d2b36SAndroid Build Coastguard Worker} 687*333d2b36SAndroid Build Coastguard Worker 688*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidTestImport) InstallInTestcases() bool { 689*333d2b36SAndroid Build Coastguard Worker return true 690*333d2b36SAndroid Build Coastguard Worker} 691*333d2b36SAndroid Build Coastguard Worker 692*333d2b36SAndroid Build Coastguard Worker// android_test_import imports a prebuilt test apk with additional processing specified in the 693*333d2b36SAndroid Build Coastguard Worker// module. DPI or arch variant configurations can be made as with android_app_import. 694*333d2b36SAndroid Build Coastguard Workerfunc AndroidTestImportFactory() android.Module { 695*333d2b36SAndroid Build Coastguard Worker module := &AndroidTestImport{} 696*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 697*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.dexpreoptProperties) 698*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.testProperties) 699*333d2b36SAndroid Build Coastguard Worker module.populateAllVariantStructs() 700*333d2b36SAndroid Build Coastguard Worker module.SetDefaultableHook(func(ctx android.DefaultableHookContext) { 701*333d2b36SAndroid Build Coastguard Worker module.processVariants(ctx) 702*333d2b36SAndroid Build Coastguard Worker }) 703*333d2b36SAndroid Build Coastguard Worker 704*333d2b36SAndroid Build Coastguard Worker module.dexpreopter.isTest = true 705*333d2b36SAndroid Build Coastguard Worker 706*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 707*333d2b36SAndroid Build Coastguard Worker android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) 708*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 709*333d2b36SAndroid Build Coastguard Worker android.InitConfigurablePrebuiltModuleString(module, &module.properties.Apk, "Apk") 710*333d2b36SAndroid Build Coastguard Worker 711*333d2b36SAndroid Build Coastguard Worker return module 712*333d2b36SAndroid Build Coastguard Worker} 713