1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2019 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage apex 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "encoding/json" 19*333d2b36SAndroid Build Coastguard Worker "fmt" 20*333d2b36SAndroid Build Coastguard Worker "path" 21*333d2b36SAndroid Build Coastguard Worker "path/filepath" 22*333d2b36SAndroid Build Coastguard Worker "runtime" 23*333d2b36SAndroid Build Coastguard Worker "sort" 24*333d2b36SAndroid Build Coastguard Worker "strconv" 25*333d2b36SAndroid Build Coastguard Worker "strings" 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker "android/soong/aconfig" 28*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 29*333d2b36SAndroid Build Coastguard Worker "android/soong/java" 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 32*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 33*333d2b36SAndroid Build Coastguard Worker) 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workervar ( 36*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/apex") 37*333d2b36SAndroid Build Coastguard Worker) 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Workerfunc init() { 40*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/aconfig") 41*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/android") 42*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/cc/config") 43*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/java") 44*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("apexer", "apexer") 45*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("apexer_with_DCLA_preprocessing", "apexer_with_DCLA_preprocessing") 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Worker // ART minimal builds (using the master-art manifest) do not have the "frameworks/base" 48*333d2b36SAndroid Build Coastguard Worker // projects, and hence cannot build 'aapt2'. Use the SDK prebuilt instead. 49*333d2b36SAndroid Build Coastguard Worker hostBinToolVariableWithPrebuilt := func(name, prebuiltDir, tool string) { 50*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc(name, func(ctx android.PackageVarContext) string { 51*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().FrameworksBaseDirExists(ctx) { 52*333d2b36SAndroid Build Coastguard Worker return filepath.Join(prebuiltDir, runtime.GOOS, "bin", tool) 53*333d2b36SAndroid Build Coastguard Worker } else { 54*333d2b36SAndroid Build Coastguard Worker return ctx.Config().HostToolPath(ctx, tool).String() 55*333d2b36SAndroid Build Coastguard Worker } 56*333d2b36SAndroid Build Coastguard Worker }) 57*333d2b36SAndroid Build Coastguard Worker } 58*333d2b36SAndroid Build Coastguard Worker hostBinToolVariableWithPrebuilt("aapt2", "prebuilts/sdk/tools", "aapt2") 59*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("avbtool", "avbtool") 60*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("e2fsdroid", "e2fsdroid") 61*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("merge_zips", "merge_zips") 62*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("mke2fs", "mke2fs") 63*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("resize2fs", "resize2fs") 64*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("sefcontext_compile", "sefcontext_compile") 65*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("soong_zip", "soong_zip") 66*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("zip2zip", "zip2zip") 67*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("zipalign", "zipalign") 68*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("jsonmodify", "jsonmodify") 69*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("conv_apex_manifest", "conv_apex_manifest") 70*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("extract_apks", "extract_apks") 71*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("make_f2fs", "make_f2fs") 72*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("sload_f2fs", "sload_f2fs") 73*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("make_erofs", "make_erofs") 74*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("apex_compression_tool", "apex_compression_tool") 75*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("dexdeps", "dexdeps") 76*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("apex_sepolicy_tests", "apex_sepolicy_tests") 77*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("deapexer", "deapexer") 78*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("debugfs_static", "debugfs_static") 79*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("fsck_erofs", "fsck.erofs") 80*333d2b36SAndroid Build Coastguard Worker pctx.SourcePathVariable("genNdkUsedbyApexPath", "build/soong/scripts/gen_ndk_usedby_apex.sh") 81*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("conv_linker_config", "conv_linker_config") 82*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("assemble_vintf", "assemble_vintf") 83*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("apex_elf_checker", "apex_elf_checker") 84*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("aconfig", "aconfig") 85*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("host_apex_verifier", "host_apex_verifier") 86*333d2b36SAndroid Build Coastguard Worker} 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Workertype createStorageStruct struct { 89*333d2b36SAndroid Build Coastguard Worker Output_file string 90*333d2b36SAndroid Build Coastguard Worker Desc string 91*333d2b36SAndroid Build Coastguard Worker File_type string 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workervar createStorageInfo = []createStorageStruct{ 95*333d2b36SAndroid Build Coastguard Worker {"package.map", "create_aconfig_package_map_file", "package_map"}, 96*333d2b36SAndroid Build Coastguard Worker {"flag.map", "create_aconfig_flag_map_file", "flag_map"}, 97*333d2b36SAndroid Build Coastguard Worker {"flag.val", "create_aconfig_flag_val_file", "flag_val"}, 98*333d2b36SAndroid Build Coastguard Worker {"flag.info", "create_aconfig_flag_info_file", "flag_info"}, 99*333d2b36SAndroid Build Coastguard Worker} 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workervar ( 102*333d2b36SAndroid Build Coastguard Worker apexManifestRule = pctx.StaticRule("apexManifestRule", blueprint.RuleParams{ 103*333d2b36SAndroid Build Coastguard Worker Command: `rm -f $out && ${jsonmodify} $in ` + 104*333d2b36SAndroid Build Coastguard Worker `-a provideNativeLibs ${provideNativeLibs} ` + 105*333d2b36SAndroid Build Coastguard Worker `-a requireNativeLibs ${requireNativeLibs} ` + 106*333d2b36SAndroid Build Coastguard Worker `-se version 0 ${default_version} ` + 107*333d2b36SAndroid Build Coastguard Worker `${opt} ` + 108*333d2b36SAndroid Build Coastguard Worker `-o $out`, 109*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${jsonmodify}"}, 110*333d2b36SAndroid Build Coastguard Worker Description: "prepare ${out}", 111*333d2b36SAndroid Build Coastguard Worker }, "provideNativeLibs", "requireNativeLibs", "default_version", "opt") 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Worker stripApexManifestRule = pctx.StaticRule("stripApexManifestRule", blueprint.RuleParams{ 114*333d2b36SAndroid Build Coastguard Worker Command: `rm -f $out && ${conv_apex_manifest} strip $in -o $out`, 115*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${conv_apex_manifest}"}, 116*333d2b36SAndroid Build Coastguard Worker Description: "strip ${in}=>${out}", 117*333d2b36SAndroid Build Coastguard Worker }) 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker pbApexManifestRule = pctx.StaticRule("pbApexManifestRule", blueprint.RuleParams{ 120*333d2b36SAndroid Build Coastguard Worker Command: `rm -f $out && ${conv_apex_manifest} proto $in -o $out`, 121*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${conv_apex_manifest}"}, 122*333d2b36SAndroid Build Coastguard Worker Description: "convert ${in}=>${out}", 123*333d2b36SAndroid Build Coastguard Worker }) 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker // TODO(b/113233103): make sure that file_contexts is as expected, i.e., validate 126*333d2b36SAndroid Build Coastguard Worker // against the binary policy using sefcontext_compiler -p <policy>. 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Worker // TODO(b/114327326): automate the generation of file_contexts 129*333d2b36SAndroid Build Coastguard Worker apexRule = pctx.StaticRule("apexRule", blueprint.RuleParams{ 130*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf ${image_dir} && mkdir -p ${image_dir} && ` + 131*333d2b36SAndroid Build Coastguard Worker `(. ${out}.copy_commands) && ` + 132*333d2b36SAndroid Build Coastguard Worker `APEXER_TOOL_PATH=${tool_path} ` + 133*333d2b36SAndroid Build Coastguard Worker `${apexer} --force --manifest ${manifest} ` + 134*333d2b36SAndroid Build Coastguard Worker `--file_contexts ${file_contexts} ` + 135*333d2b36SAndroid Build Coastguard Worker `--canned_fs_config ${canned_fs_config} ` + 136*333d2b36SAndroid Build Coastguard Worker `--include_build_info ` + 137*333d2b36SAndroid Build Coastguard Worker `--payload_type image ` + 138*333d2b36SAndroid Build Coastguard Worker `--key ${key} ${opt_flags} ${image_dir} ${out} `, 139*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${apexer}", "${avbtool}", "${e2fsdroid}", "${merge_zips}", 140*333d2b36SAndroid Build Coastguard Worker "${mke2fs}", "${resize2fs}", "${sefcontext_compile}", "${make_f2fs}", "${sload_f2fs}", "${make_erofs}", 141*333d2b36SAndroid Build Coastguard Worker "${soong_zip}", "${zipalign}", "${aapt2}", "prebuilts/sdk/current/public/android.jar"}, 142*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.copy_commands", 143*333d2b36SAndroid Build Coastguard Worker RspfileContent: "${copy_commands}", 144*333d2b36SAndroid Build Coastguard Worker Description: "APEX ${image_dir} => ${out}", 145*333d2b36SAndroid Build Coastguard Worker }, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", 146*333d2b36SAndroid Build Coastguard Worker "opt_flags", "manifest") 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker DCLAApexRule = pctx.StaticRule("DCLAApexRule", blueprint.RuleParams{ 149*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf ${image_dir} && mkdir -p ${image_dir} && ` + 150*333d2b36SAndroid Build Coastguard Worker `(. ${out}.copy_commands) && ` + 151*333d2b36SAndroid Build Coastguard Worker `APEXER_TOOL_PATH=${tool_path} ` + 152*333d2b36SAndroid Build Coastguard Worker `${apexer_with_DCLA_preprocessing} ` + 153*333d2b36SAndroid Build Coastguard Worker `--apexer ${apexer} ` + 154*333d2b36SAndroid Build Coastguard Worker `--canned_fs_config ${canned_fs_config} ` + 155*333d2b36SAndroid Build Coastguard Worker `${image_dir} ` + 156*333d2b36SAndroid Build Coastguard Worker `${out} ` + 157*333d2b36SAndroid Build Coastguard Worker `-- ` + 158*333d2b36SAndroid Build Coastguard Worker `--include_build_info ` + 159*333d2b36SAndroid Build Coastguard Worker `--force ` + 160*333d2b36SAndroid Build Coastguard Worker `--payload_type image ` + 161*333d2b36SAndroid Build Coastguard Worker `--key ${key} ` + 162*333d2b36SAndroid Build Coastguard Worker `--file_contexts ${file_contexts} ` + 163*333d2b36SAndroid Build Coastguard Worker `--manifest ${manifest} ` + 164*333d2b36SAndroid Build Coastguard Worker `${opt_flags} `, 165*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${apexer_with_DCLA_preprocessing}", "${apexer}", "${avbtool}", "${e2fsdroid}", 166*333d2b36SAndroid Build Coastguard Worker "${merge_zips}", "${mke2fs}", "${resize2fs}", "${sefcontext_compile}", "${make_f2fs}", 167*333d2b36SAndroid Build Coastguard Worker "${sload_f2fs}", "${make_erofs}", "${soong_zip}", "${zipalign}", "${aapt2}", 168*333d2b36SAndroid Build Coastguard Worker "prebuilts/sdk/current/public/android.jar"}, 169*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.copy_commands", 170*333d2b36SAndroid Build Coastguard Worker RspfileContent: "${copy_commands}", 171*333d2b36SAndroid Build Coastguard Worker Description: "APEX ${image_dir} => ${out}", 172*333d2b36SAndroid Build Coastguard Worker }, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", 173*333d2b36SAndroid Build Coastguard Worker "opt_flags", "manifest", "is_DCLA") 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Worker apexProtoConvertRule = pctx.AndroidStaticRule("apexProtoConvertRule", 176*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 177*333d2b36SAndroid Build Coastguard Worker Command: `${aapt2} convert --output-format proto $in -o $out`, 178*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${aapt2}"}, 179*333d2b36SAndroid Build Coastguard Worker }) 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker apexBundleRule = pctx.StaticRule("apexBundleRule", blueprint.RuleParams{ 182*333d2b36SAndroid Build Coastguard Worker Command: `${zip2zip} -i $in -o $out.base ` + 183*333d2b36SAndroid Build Coastguard Worker `apex_payload.img:apex/${abi}.img ` + 184*333d2b36SAndroid Build Coastguard Worker `apex_build_info.pb:apex/${abi}.build_info.pb ` + 185*333d2b36SAndroid Build Coastguard Worker `apex_manifest.json:root/apex_manifest.json ` + 186*333d2b36SAndroid Build Coastguard Worker `apex_manifest.pb:root/apex_manifest.pb ` + 187*333d2b36SAndroid Build Coastguard Worker `AndroidManifest.xml:manifest/AndroidManifest.xml ` + 188*333d2b36SAndroid Build Coastguard Worker `assets/NOTICE.html.gz:assets/NOTICE.html.gz &&` + 189*333d2b36SAndroid Build Coastguard Worker `${soong_zip} -o $out.config -C $$(dirname ${config}) -f ${config} && ` + 190*333d2b36SAndroid Build Coastguard Worker `${merge_zips} $out $out.base $out.config`, 191*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${zip2zip}", "${soong_zip}", "${merge_zips}"}, 192*333d2b36SAndroid Build Coastguard Worker Description: "app bundle", 193*333d2b36SAndroid Build Coastguard Worker }, "abi", "config") 194*333d2b36SAndroid Build Coastguard Worker 195*333d2b36SAndroid Build Coastguard Worker diffApexContentRule = pctx.StaticRule("diffApexContentRule", blueprint.RuleParams{ 196*333d2b36SAndroid Build Coastguard Worker Command: `diff --unchanged-group-format='' \` + 197*333d2b36SAndroid Build Coastguard Worker `--changed-group-format='%<' \` + 198*333d2b36SAndroid Build Coastguard Worker `${image_content_file} ${allowed_files_file} || (` + 199*333d2b36SAndroid Build Coastguard Worker `echo "New unexpected files were added to ${apex_module_name}." ` + 200*333d2b36SAndroid Build Coastguard Worker ` "To fix the build run following command:" && ` + 201*333d2b36SAndroid Build Coastguard Worker `echo "system/apex/tools/update_allowed_list.sh ${allowed_files_file} ${image_content_file}" && ` + 202*333d2b36SAndroid Build Coastguard Worker `exit 1); touch ${out}`, 203*333d2b36SAndroid Build Coastguard Worker Description: "Diff ${image_content_file} and ${allowed_files_file}", 204*333d2b36SAndroid Build Coastguard Worker }, "image_content_file", "allowed_files_file", "apex_module_name") 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker generateAPIsUsedbyApexRule = pctx.StaticRule("generateAPIsUsedbyApexRule", blueprint.RuleParams{ 207*333d2b36SAndroid Build Coastguard Worker Command: "$genNdkUsedbyApexPath ${image_dir} ${readelf} ${out}", 208*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${genNdkUsedbyApexPath}"}, 209*333d2b36SAndroid Build Coastguard Worker Description: "Generate symbol list used by Apex", 210*333d2b36SAndroid Build Coastguard Worker }, "image_dir", "readelf") 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Worker apexSepolicyTestsRule = pctx.StaticRule("apexSepolicyTestsRule", blueprint.RuleParams{ 213*333d2b36SAndroid Build Coastguard Worker Command: `${deapexer} --debugfs_path ${debugfs_static} list -Z ${in} > ${out}.fc` + 214*333d2b36SAndroid Build Coastguard Worker ` && ${apex_sepolicy_tests} -f ${out}.fc && touch ${out}`, 215*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${apex_sepolicy_tests}", "${deapexer}", "${debugfs_static}"}, 216*333d2b36SAndroid Build Coastguard Worker Description: "run apex_sepolicy_tests", 217*333d2b36SAndroid Build Coastguard Worker }) 218*333d2b36SAndroid Build Coastguard Worker 219*333d2b36SAndroid Build Coastguard Worker apexLinkerconfigValidationRule = pctx.StaticRule("apexLinkerconfigValidationRule", blueprint.RuleParams{ 220*333d2b36SAndroid Build Coastguard Worker Command: `${conv_linker_config} validate --type apex ${image_dir} && touch ${out}`, 221*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${conv_linker_config}"}, 222*333d2b36SAndroid Build Coastguard Worker Description: "run apex_linkerconfig_validation", 223*333d2b36SAndroid Build Coastguard Worker }, "image_dir") 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Worker apexHostVerifierRule = pctx.StaticRule("apexHostVerifierRule", blueprint.RuleParams{ 226*333d2b36SAndroid Build Coastguard Worker Command: `${host_apex_verifier} --deapexer=${deapexer} --debugfs=${debugfs_static} ` + 227*333d2b36SAndroid Build Coastguard Worker `--fsckerofs=${fsck_erofs} --apex=${in} --partition_tag=${partition_tag} && touch ${out}`, 228*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${host_apex_verifier}", "${deapexer}", "${debugfs_static}", "${fsck_erofs}"}, 229*333d2b36SAndroid Build Coastguard Worker Description: "run host_apex_verifier", 230*333d2b36SAndroid Build Coastguard Worker }, "partition_tag") 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Worker assembleVintfRule = pctx.StaticRule("assembleVintfRule", blueprint.RuleParams{ 233*333d2b36SAndroid Build Coastguard Worker Command: `rm -f $out && VINTF_IGNORE_TARGET_FCM_VERSION=true ${assemble_vintf} -i $in -o $out`, 234*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${assemble_vintf}"}, 235*333d2b36SAndroid Build Coastguard Worker Description: "run assemble_vintf", 236*333d2b36SAndroid Build Coastguard Worker }) 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Worker apexElfCheckerUnwantedRule = pctx.StaticRule("apexElfCheckerUnwantedRule", blueprint.RuleParams{ 239*333d2b36SAndroid Build Coastguard Worker Command: `${apex_elf_checker} --tool_path ${tool_path} --unwanted ${unwanted} ${in} && touch ${out}`, 240*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${apex_elf_checker}", "${deapexer}", "${debugfs_static}", "${fsck_erofs}", "${config.ClangBin}/llvm-readelf"}, 241*333d2b36SAndroid Build Coastguard Worker Description: "run apex_elf_checker --unwanted", 242*333d2b36SAndroid Build Coastguard Worker }, "tool_path", "unwanted") 243*333d2b36SAndroid Build Coastguard Worker) 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildAconfigFiles(ctx android.ModuleContext) []apexFile { 246*333d2b36SAndroid Build Coastguard Worker var aconfigFiles android.Paths 247*333d2b36SAndroid Build Coastguard Worker for _, file := range a.filesInfo { 248*333d2b36SAndroid Build Coastguard Worker if file.module == nil { 249*333d2b36SAndroid Build Coastguard Worker continue 250*333d2b36SAndroid Build Coastguard Worker } 251*333d2b36SAndroid Build Coastguard Worker if dep, ok := android.OtherModuleProvider(ctx, file.module, android.AconfigPropagatingProviderKey); ok { 252*333d2b36SAndroid Build Coastguard Worker if len(dep.AconfigFiles) > 0 && dep.AconfigFiles[ctx.ModuleName()] != nil { 253*333d2b36SAndroid Build Coastguard Worker aconfigFiles = append(aconfigFiles, dep.AconfigFiles[ctx.ModuleName()]...) 254*333d2b36SAndroid Build Coastguard Worker } 255*333d2b36SAndroid Build Coastguard Worker } 256*333d2b36SAndroid Build Coastguard Worker 257*333d2b36SAndroid Build Coastguard Worker validationFlag := ctx.DeviceConfig().AconfigContainerValidation() 258*333d2b36SAndroid Build Coastguard Worker if validationFlag == "error" || validationFlag == "warning" { 259*333d2b36SAndroid Build Coastguard Worker android.VerifyAconfigBuildMode(ctx, ctx.ModuleName(), file.module, validationFlag == "error") 260*333d2b36SAndroid Build Coastguard Worker } 261*333d2b36SAndroid Build Coastguard Worker } 262*333d2b36SAndroid Build Coastguard Worker aconfigFiles = android.FirstUniquePaths(aconfigFiles) 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Worker var files []apexFile 265*333d2b36SAndroid Build Coastguard Worker if len(aconfigFiles) > 0 { 266*333d2b36SAndroid Build Coastguard Worker apexAconfigFile := android.PathForModuleOut(ctx, "aconfig_flags.pb") 267*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 268*333d2b36SAndroid Build Coastguard Worker Rule: aconfig.AllDeclarationsRule, 269*333d2b36SAndroid Build Coastguard Worker Inputs: aconfigFiles, 270*333d2b36SAndroid Build Coastguard Worker Output: apexAconfigFile, 271*333d2b36SAndroid Build Coastguard Worker Description: "combine_aconfig_declarations", 272*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 273*333d2b36SAndroid Build Coastguard Worker "cache_files": android.JoinPathsWithPrefix(aconfigFiles, "--cache "), 274*333d2b36SAndroid Build Coastguard Worker }, 275*333d2b36SAndroid Build Coastguard Worker }) 276*333d2b36SAndroid Build Coastguard Worker files = append(files, newApexFile(ctx, apexAconfigFile, "aconfig_flags", "etc", etc, nil)) 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Worker for _, info := range createStorageInfo { 279*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, info.Output_file) 280*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 281*333d2b36SAndroid Build Coastguard Worker Rule: aconfig.CreateStorageRule, 282*333d2b36SAndroid Build Coastguard Worker Inputs: aconfigFiles, 283*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 284*333d2b36SAndroid Build Coastguard Worker Description: info.Desc, 285*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 286*333d2b36SAndroid Build Coastguard Worker "container": ctx.ModuleName(), 287*333d2b36SAndroid Build Coastguard Worker "file_type": info.File_type, 288*333d2b36SAndroid Build Coastguard Worker "cache_files": android.JoinPathsWithPrefix(aconfigFiles, "--cache "), 289*333d2b36SAndroid Build Coastguard Worker }, 290*333d2b36SAndroid Build Coastguard Worker }) 291*333d2b36SAndroid Build Coastguard Worker files = append(files, newApexFile(ctx, outputFile, info.File_type, "etc", etc, nil)) 292*333d2b36SAndroid Build Coastguard Worker } 293*333d2b36SAndroid Build Coastguard Worker } 294*333d2b36SAndroid Build Coastguard Worker return files 295*333d2b36SAndroid Build Coastguard Worker} 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker// buildManifest creates buile rules to modify the input apex_manifest.json to add information 298*333d2b36SAndroid Build Coastguard Worker// gathered by the build system such as provided/required native libraries. Two output files having 299*333d2b36SAndroid Build Coastguard Worker// different formats are generated. a.manifestJsonOut is JSON format for Q devices, and 300*333d2b36SAndroid Build Coastguard Worker// a.manifest.PbOut is protobuf format for R+ devices. 301*333d2b36SAndroid Build Coastguard Worker// TODO(jiyong): make this to return paths instead of directly storing the paths to apexBundle 302*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, requireNativeLibs []string) { 303*333d2b36SAndroid Build Coastguard Worker src := android.PathForModuleSrc(ctx, proptools.StringDefault(a.properties.Manifest, "apex_manifest.json")) 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker // Put dependency({provide|require}NativeLibs) in apex_manifest.json 306*333d2b36SAndroid Build Coastguard Worker provideNativeLibs = android.SortedUniqueStrings(provideNativeLibs) 307*333d2b36SAndroid Build Coastguard Worker requireNativeLibs = android.SortedUniqueStrings(android.RemoveListFromList(requireNativeLibs, provideNativeLibs)) 308*333d2b36SAndroid Build Coastguard Worker 309*333d2b36SAndroid Build Coastguard Worker // VNDK APEX name is determined at runtime, so update "name" in apex_manifest 310*333d2b36SAndroid Build Coastguard Worker optCommands := []string{} 311*333d2b36SAndroid Build Coastguard Worker if a.vndkApex { 312*333d2b36SAndroid Build Coastguard Worker apexName := vndkApexNamePrefix + a.vndkVersion() 313*333d2b36SAndroid Build Coastguard Worker optCommands = append(optCommands, "-v name "+apexName) 314*333d2b36SAndroid Build Coastguard Worker } 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker // Collect jniLibs. Notice that a.filesInfo is already sorted 317*333d2b36SAndroid Build Coastguard Worker var jniLibs []string 318*333d2b36SAndroid Build Coastguard Worker for _, fi := range a.filesInfo { 319*333d2b36SAndroid Build Coastguard Worker if fi.isJniLib && !android.InList(fi.stem(), jniLibs) { 320*333d2b36SAndroid Build Coastguard Worker jniLibs = append(jniLibs, fi.stem()) 321*333d2b36SAndroid Build Coastguard Worker } 322*333d2b36SAndroid Build Coastguard Worker } 323*333d2b36SAndroid Build Coastguard Worker if len(jniLibs) > 0 { 324*333d2b36SAndroid Build Coastguard Worker optCommands = append(optCommands, "-a jniLibs "+strings.Join(jniLibs, " ")) 325*333d2b36SAndroid Build Coastguard Worker } 326*333d2b36SAndroid Build Coastguard Worker 327*333d2b36SAndroid Build Coastguard Worker if android.InList(":vndk", requireNativeLibs) { 328*333d2b36SAndroid Build Coastguard Worker if _, vndkVersion := a.getImageVariationPair(); vndkVersion != "" { 329*333d2b36SAndroid Build Coastguard Worker optCommands = append(optCommands, "-v vndkVersion "+vndkVersion) 330*333d2b36SAndroid Build Coastguard Worker } 331*333d2b36SAndroid Build Coastguard Worker } 332*333d2b36SAndroid Build Coastguard Worker 333*333d2b36SAndroid Build Coastguard Worker manifestJsonFullOut := android.PathForModuleOut(ctx, "apex_manifest_full.json") 334*333d2b36SAndroid Build Coastguard Worker defaultVersion := ctx.Config().ReleaseDefaultUpdatableModuleVersion() 335*333d2b36SAndroid Build Coastguard Worker if a.properties.Variant_version != nil { 336*333d2b36SAndroid Build Coastguard Worker defaultVersionInt, err := strconv.Atoi(defaultVersion) 337*333d2b36SAndroid Build Coastguard Worker if err != nil { 338*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("expected RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION to be an int, but got %s", defaultVersion) 339*333d2b36SAndroid Build Coastguard Worker } 340*333d2b36SAndroid Build Coastguard Worker if defaultVersionInt%10 != 0 { 341*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("expected RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION to end in a zero, but got %s", defaultVersion) 342*333d2b36SAndroid Build Coastguard Worker } 343*333d2b36SAndroid Build Coastguard Worker variantVersion := []rune(*a.properties.Variant_version) 344*333d2b36SAndroid Build Coastguard Worker if len(variantVersion) != 1 || variantVersion[0] < '0' || variantVersion[0] > '9' { 345*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("variant_version", "expected an integer between 0-9; got %s", *a.properties.Variant_version) 346*333d2b36SAndroid Build Coastguard Worker } 347*333d2b36SAndroid Build Coastguard Worker defaultVersionRunes := []rune(defaultVersion) 348*333d2b36SAndroid Build Coastguard Worker defaultVersionRunes[len(defaultVersion)-1] = []rune(variantVersion)[0] 349*333d2b36SAndroid Build Coastguard Worker defaultVersion = string(defaultVersionRunes) 350*333d2b36SAndroid Build Coastguard Worker } 351*333d2b36SAndroid Build Coastguard Worker if override := ctx.Config().Getenv("OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION"); override != "" { 352*333d2b36SAndroid Build Coastguard Worker defaultVersion = override 353*333d2b36SAndroid Build Coastguard Worker } 354*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 355*333d2b36SAndroid Build Coastguard Worker Rule: apexManifestRule, 356*333d2b36SAndroid Build Coastguard Worker Input: src, 357*333d2b36SAndroid Build Coastguard Worker Output: manifestJsonFullOut, 358*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 359*333d2b36SAndroid Build Coastguard Worker "provideNativeLibs": strings.Join(provideNativeLibs, " "), 360*333d2b36SAndroid Build Coastguard Worker "requireNativeLibs": strings.Join(requireNativeLibs, " "), 361*333d2b36SAndroid Build Coastguard Worker "default_version": defaultVersion, 362*333d2b36SAndroid Build Coastguard Worker "opt": strings.Join(optCommands, " "), 363*333d2b36SAndroid Build Coastguard Worker }, 364*333d2b36SAndroid Build Coastguard Worker }) 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Worker // b/143654022 Q apexd can't understand newly added keys in apex_manifest.json prepare 367*333d2b36SAndroid Build Coastguard Worker // stripped-down version so that APEX modules built from R+ can be installed to Q 368*333d2b36SAndroid Build Coastguard Worker minSdkVersion := a.minSdkVersion(ctx) 369*333d2b36SAndroid Build Coastguard Worker if minSdkVersion.EqualTo(android.SdkVersion_Android10) { 370*333d2b36SAndroid Build Coastguard Worker a.manifestJsonOut = android.PathForModuleOut(ctx, "apex_manifest.json") 371*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 372*333d2b36SAndroid Build Coastguard Worker Rule: stripApexManifestRule, 373*333d2b36SAndroid Build Coastguard Worker Input: manifestJsonFullOut, 374*333d2b36SAndroid Build Coastguard Worker Output: a.manifestJsonOut, 375*333d2b36SAndroid Build Coastguard Worker }) 376*333d2b36SAndroid Build Coastguard Worker } 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Worker // From R+, protobuf binary format (.pb) is the standard format for apex_manifest 379*333d2b36SAndroid Build Coastguard Worker a.manifestPbOut = android.PathForModuleOut(ctx, "apex_manifest.pb") 380*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 381*333d2b36SAndroid Build Coastguard Worker Rule: pbApexManifestRule, 382*333d2b36SAndroid Build Coastguard Worker Input: manifestJsonFullOut, 383*333d2b36SAndroid Build Coastguard Worker Output: a.manifestPbOut, 384*333d2b36SAndroid Build Coastguard Worker }) 385*333d2b36SAndroid Build Coastguard Worker} 386*333d2b36SAndroid Build Coastguard Worker 387*333d2b36SAndroid Build Coastguard Worker// buildFileContexts create build rules to append an entry for apex_manifest.pb to the file_contexts 388*333d2b36SAndroid Build Coastguard Worker// file for this APEX which is either from /systme/sepolicy/apex/<apexname>-file_contexts or from 389*333d2b36SAndroid Build Coastguard Worker// the file_contexts property of this APEX. This is to make sure that the manifest file is correctly 390*333d2b36SAndroid Build Coastguard Worker// labeled as system_file or vendor_apex_metadata_file. 391*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildFileContexts(ctx android.ModuleContext) android.Path { 392*333d2b36SAndroid Build Coastguard Worker var fileContexts android.Path 393*333d2b36SAndroid Build Coastguard Worker var fileContextsDir string 394*333d2b36SAndroid Build Coastguard Worker isFileContextsModule := false 395*333d2b36SAndroid Build Coastguard Worker if a.properties.File_contexts == nil { 396*333d2b36SAndroid Build Coastguard Worker fileContexts = android.PathForSource(ctx, "system/sepolicy/apex", ctx.ModuleName()+"-file_contexts") 397*333d2b36SAndroid Build Coastguard Worker } else { 398*333d2b36SAndroid Build Coastguard Worker if m, t := android.SrcIsModuleWithTag(*a.properties.File_contexts); m != "" { 399*333d2b36SAndroid Build Coastguard Worker isFileContextsModule = true 400*333d2b36SAndroid Build Coastguard Worker otherModule := android.GetModuleProxyFromPathDep(ctx, m, t) 401*333d2b36SAndroid Build Coastguard Worker if otherModule != nil { 402*333d2b36SAndroid Build Coastguard Worker fileContextsDir = ctx.OtherModuleDir(*otherModule) 403*333d2b36SAndroid Build Coastguard Worker } 404*333d2b36SAndroid Build Coastguard Worker } 405*333d2b36SAndroid Build Coastguard Worker fileContexts = android.PathForModuleSrc(ctx, *a.properties.File_contexts) 406*333d2b36SAndroid Build Coastguard Worker } 407*333d2b36SAndroid Build Coastguard Worker if fileContextsDir == "" { 408*333d2b36SAndroid Build Coastguard Worker fileContextsDir = filepath.Dir(fileContexts.String()) 409*333d2b36SAndroid Build Coastguard Worker } 410*333d2b36SAndroid Build Coastguard Worker fileContextsDir += string(filepath.Separator) 411*333d2b36SAndroid Build Coastguard Worker 412*333d2b36SAndroid Build Coastguard Worker if a.Platform() { 413*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(fileContextsDir, "system/sepolicy/") { 414*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("file_contexts", "should be under system/sepolicy, but found in %q", fileContextsDir) 415*333d2b36SAndroid Build Coastguard Worker } 416*333d2b36SAndroid Build Coastguard Worker } 417*333d2b36SAndroid Build Coastguard Worker if !isFileContextsModule && !android.ExistentPathForSource(ctx, fileContexts.String()).Valid() { 418*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("file_contexts", "cannot find file_contexts file: %q", fileContexts.String()) 419*333d2b36SAndroid Build Coastguard Worker } 420*333d2b36SAndroid Build Coastguard Worker 421*333d2b36SAndroid Build Coastguard Worker useFileContextsAsIs := proptools.Bool(a.properties.Use_file_contexts_as_is) 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Worker output := android.PathForModuleOut(ctx, "file_contexts") 424*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 425*333d2b36SAndroid Build Coastguard Worker 426*333d2b36SAndroid Build Coastguard Worker labelForRoot := "u:object_r:system_file:s0" 427*333d2b36SAndroid Build Coastguard Worker labelForManifest := "u:object_r:system_file:s0" 428*333d2b36SAndroid Build Coastguard Worker if a.SocSpecific() && !a.vndkApex { 429*333d2b36SAndroid Build Coastguard Worker // APEX on /vendor should label ./ and ./apex_manifest.pb as vendor file. 430*333d2b36SAndroid Build Coastguard Worker labelForRoot = "u:object_r:vendor_file:s0" 431*333d2b36SAndroid Build Coastguard Worker labelForManifest = "u:object_r:vendor_apex_metadata_file:s0" 432*333d2b36SAndroid Build Coastguard Worker } 433*333d2b36SAndroid Build Coastguard Worker // remove old file 434*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("rm").FlagWithOutput("-f ", output) 435*333d2b36SAndroid Build Coastguard Worker // copy file_contexts 436*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("cat").Input(fileContexts).Text(">>").Output(output) 437*333d2b36SAndroid Build Coastguard Worker // new line 438*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("echo").Text(">>").Output(output) 439*333d2b36SAndroid Build Coastguard Worker if !useFileContextsAsIs { 440*333d2b36SAndroid Build Coastguard Worker // force-label /apex_manifest.pb and / 441*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("echo").Text("/apex_manifest\\\\.pb").Text(labelForManifest).Text(">>").Output(output) 442*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("echo").Text("/").Text(labelForRoot).Text(">>").Output(output) 443*333d2b36SAndroid Build Coastguard Worker } 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Worker rule.Build("file_contexts."+a.Name(), "Generate file_contexts") 446*333d2b36SAndroid Build Coastguard Worker return output 447*333d2b36SAndroid Build Coastguard Worker} 448*333d2b36SAndroid Build Coastguard Worker 449*333d2b36SAndroid Build Coastguard Worker// buildInstalledFilesFile creates a build rule for the installed-files.txt file where the list of 450*333d2b36SAndroid Build Coastguard Worker// files included in this APEX is shown. The text file is dist'ed so that people can see what's 451*333d2b36SAndroid Build Coastguard Worker// included in the APEX without actually downloading and extracting it. 452*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildInstalledFilesFile(ctx android.ModuleContext, builtApex android.Path, imageDir android.Path) android.Path { 453*333d2b36SAndroid Build Coastguard Worker output := android.PathForModuleOut(ctx, "installed-files.txt") 454*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 455*333d2b36SAndroid Build Coastguard Worker rule.Command(). 456*333d2b36SAndroid Build Coastguard Worker Implicit(builtApex). 457*333d2b36SAndroid Build Coastguard Worker Text("(cd " + imageDir.String() + " ; "). 458*333d2b36SAndroid Build Coastguard Worker Text("find . \\( -type f -o -type l \\) -printf \"%s %p\\n\") "). 459*333d2b36SAndroid Build Coastguard Worker Text(" | sort -nr > "). 460*333d2b36SAndroid Build Coastguard Worker Output(output) 461*333d2b36SAndroid Build Coastguard Worker rule.Build("installed-files."+a.Name(), "Installed files") 462*333d2b36SAndroid Build Coastguard Worker return output 463*333d2b36SAndroid Build Coastguard Worker} 464*333d2b36SAndroid Build Coastguard Worker 465*333d2b36SAndroid Build Coastguard Worker// buildBundleConfig creates a build rule for the bundle config file that will control the bundle 466*333d2b36SAndroid Build Coastguard Worker// creation process. 467*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildBundleConfig(ctx android.ModuleContext) android.Path { 468*333d2b36SAndroid Build Coastguard Worker output := android.PathForModuleOut(ctx, "bundle_config.json") 469*333d2b36SAndroid Build Coastguard Worker 470*333d2b36SAndroid Build Coastguard Worker type ApkConfig struct { 471*333d2b36SAndroid Build Coastguard Worker Package_name string `json:"package_name"` 472*333d2b36SAndroid Build Coastguard Worker Apk_path string `json:"path"` 473*333d2b36SAndroid Build Coastguard Worker } 474*333d2b36SAndroid Build Coastguard Worker config := struct { 475*333d2b36SAndroid Build Coastguard Worker Compression struct { 476*333d2b36SAndroid Build Coastguard Worker Uncompressed_glob []string `json:"uncompressed_glob"` 477*333d2b36SAndroid Build Coastguard Worker } `json:"compression"` 478*333d2b36SAndroid Build Coastguard Worker Apex_config struct { 479*333d2b36SAndroid Build Coastguard Worker Apex_embedded_apk_config []ApkConfig `json:"apex_embedded_apk_config,omitempty"` 480*333d2b36SAndroid Build Coastguard Worker } `json:"apex_config,omitempty"` 481*333d2b36SAndroid Build Coastguard Worker }{} 482*333d2b36SAndroid Build Coastguard Worker 483*333d2b36SAndroid Build Coastguard Worker config.Compression.Uncompressed_glob = []string{ 484*333d2b36SAndroid Build Coastguard Worker "apex_payload.img", 485*333d2b36SAndroid Build Coastguard Worker "apex_manifest.*", 486*333d2b36SAndroid Build Coastguard Worker } 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Worker // Collect the manifest names and paths of android apps if their manifest names are 489*333d2b36SAndroid Build Coastguard Worker // overridden. 490*333d2b36SAndroid Build Coastguard Worker for _, fi := range a.filesInfo { 491*333d2b36SAndroid Build Coastguard Worker if fi.class != app && fi.class != appSet { 492*333d2b36SAndroid Build Coastguard Worker continue 493*333d2b36SAndroid Build Coastguard Worker } 494*333d2b36SAndroid Build Coastguard Worker packageName := fi.overriddenPackageName 495*333d2b36SAndroid Build Coastguard Worker if packageName != "" { 496*333d2b36SAndroid Build Coastguard Worker config.Apex_config.Apex_embedded_apk_config = append( 497*333d2b36SAndroid Build Coastguard Worker config.Apex_config.Apex_embedded_apk_config, 498*333d2b36SAndroid Build Coastguard Worker ApkConfig{ 499*333d2b36SAndroid Build Coastguard Worker Package_name: packageName, 500*333d2b36SAndroid Build Coastguard Worker Apk_path: fi.path(), 501*333d2b36SAndroid Build Coastguard Worker }) 502*333d2b36SAndroid Build Coastguard Worker } 503*333d2b36SAndroid Build Coastguard Worker } 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Worker j, err := json.Marshal(config) 506*333d2b36SAndroid Build Coastguard Worker if err != nil { 507*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("error while marshalling to %q: %#v", output, err)) 508*333d2b36SAndroid Build Coastguard Worker } 509*333d2b36SAndroid Build Coastguard Worker 510*333d2b36SAndroid Build Coastguard Worker android.WriteFileRule(ctx, output, string(j)) 511*333d2b36SAndroid Build Coastguard Worker 512*333d2b36SAndroid Build Coastguard Worker return output 513*333d2b36SAndroid Build Coastguard Worker} 514*333d2b36SAndroid Build Coastguard Worker 515*333d2b36SAndroid Build Coastguard Workerfunc markManifestTestOnly(ctx android.ModuleContext, androidManifestFile android.Path) android.Path { 516*333d2b36SAndroid Build Coastguard Worker return java.ManifestFixer(ctx, androidManifestFile, java.ManifestFixerParams{ 517*333d2b36SAndroid Build Coastguard Worker TestOnly: true, 518*333d2b36SAndroid Build Coastguard Worker }) 519*333d2b36SAndroid Build Coastguard Worker} 520*333d2b36SAndroid Build Coastguard Worker 521*333d2b36SAndroid Build Coastguard Workerfunc isVintfFragment(fi apexFile) bool { 522*333d2b36SAndroid Build Coastguard Worker isVintfFragment, _ := path.Match("etc/vintf/*", fi.path()) 523*333d2b36SAndroid Build Coastguard Worker return isVintfFragment 524*333d2b36SAndroid Build Coastguard Worker} 525*333d2b36SAndroid Build Coastguard Worker 526*333d2b36SAndroid Build Coastguard Workerfunc runAssembleVintf(ctx android.ModuleContext, vintfFragment android.Path) android.Path { 527*333d2b36SAndroid Build Coastguard Worker processed := android.PathForModuleOut(ctx, "vintf", vintfFragment.Base()) 528*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 529*333d2b36SAndroid Build Coastguard Worker Rule: assembleVintfRule, 530*333d2b36SAndroid Build Coastguard Worker Input: vintfFragment, 531*333d2b36SAndroid Build Coastguard Worker Output: processed, 532*333d2b36SAndroid Build Coastguard Worker Description: "run assemble_vintf for VINTF in APEX", 533*333d2b36SAndroid Build Coastguard Worker }) 534*333d2b36SAndroid Build Coastguard Worker return processed 535*333d2b36SAndroid Build Coastguard Worker} 536*333d2b36SAndroid Build Coastguard Worker 537*333d2b36SAndroid Build Coastguard Worker// buildApex creates build rules to build an APEX using apexer. 538*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildApex(ctx android.ModuleContext) { 539*333d2b36SAndroid Build Coastguard Worker suffix := imageApexSuffix 540*333d2b36SAndroid Build Coastguard Worker apexName := a.BaseModuleName() 541*333d2b36SAndroid Build Coastguard Worker 542*333d2b36SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////////// 543*333d2b36SAndroid Build Coastguard Worker // Step 1: copy built files to appropriate directories under the image directory 544*333d2b36SAndroid Build Coastguard Worker 545*333d2b36SAndroid Build Coastguard Worker imageDir := android.PathForModuleOut(ctx, "image"+suffix) 546*333d2b36SAndroid Build Coastguard Worker 547*333d2b36SAndroid Build Coastguard Worker installSymbolFiles := (!ctx.Config().KatiEnabled() || a.ExportedToMake()) && a.installable() 548*333d2b36SAndroid Build Coastguard Worker 549*333d2b36SAndroid Build Coastguard Worker // set of dependency module:location mappings 550*333d2b36SAndroid Build Coastguard Worker installMapSet := make(map[string]bool) 551*333d2b36SAndroid Build Coastguard Worker 552*333d2b36SAndroid Build Coastguard Worker // TODO(jiyong): use the RuleBuilder 553*333d2b36SAndroid Build Coastguard Worker var copyCommands []string 554*333d2b36SAndroid Build Coastguard Worker var implicitInputs []android.Path 555*333d2b36SAndroid Build Coastguard Worker apexDir := android.PathForModuleInPartitionInstall(ctx, "apex", apexName) 556*333d2b36SAndroid Build Coastguard Worker for _, fi := range a.filesInfo { 557*333d2b36SAndroid Build Coastguard Worker destPath := imageDir.Join(ctx, fi.path()).String() 558*333d2b36SAndroid Build Coastguard Worker // Prepare the destination path 559*333d2b36SAndroid Build Coastguard Worker destPathDir := filepath.Dir(destPath) 560*333d2b36SAndroid Build Coastguard Worker if fi.class == appSet { 561*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, "rm -rf "+destPathDir) 562*333d2b36SAndroid Build Coastguard Worker } 563*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, "mkdir -p "+destPathDir) 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Worker installMapPath := fi.builtFile 566*333d2b36SAndroid Build Coastguard Worker 567*333d2b36SAndroid Build Coastguard Worker // Copy the built file to the directory. But if the symlink optimization is turned 568*333d2b36SAndroid Build Coastguard Worker // on, place a symlink to the corresponding file in /system partition instead. 569*333d2b36SAndroid Build Coastguard Worker if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() { 570*333d2b36SAndroid Build Coastguard Worker pathOnDevice := filepath.Join("/", fi.partition, fi.path()) 571*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath) 572*333d2b36SAndroid Build Coastguard Worker } else { 573*333d2b36SAndroid Build Coastguard Worker // Copy the file into APEX 574*333d2b36SAndroid Build Coastguard Worker if !a.testApex && isVintfFragment(fi) { 575*333d2b36SAndroid Build Coastguard Worker // copy the output of assemble_vintf instead of the original 576*333d2b36SAndroid Build Coastguard Worker vintfFragment := runAssembleVintf(ctx, fi.builtFile) 577*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, "cp -f "+vintfFragment.String()+" "+destPath) 578*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, vintfFragment) 579*333d2b36SAndroid Build Coastguard Worker } else { 580*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, "cp -f "+fi.builtFile.String()+" "+destPath) 581*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, fi.builtFile) 582*333d2b36SAndroid Build Coastguard Worker } 583*333d2b36SAndroid Build Coastguard Worker 584*333d2b36SAndroid Build Coastguard Worker var installedPath android.InstallPath 585*333d2b36SAndroid Build Coastguard Worker if fi.class == appSet { 586*333d2b36SAndroid Build Coastguard Worker // In case of AppSet, we need to copy additional APKs as well. They 587*333d2b36SAndroid Build Coastguard Worker // are zipped. So we need to unzip them. 588*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, 589*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("unzip -qDD -d %s %s", destPathDir, 590*333d2b36SAndroid Build Coastguard Worker fi.module.(*java.AndroidAppSet).PackedAdditionalOutputs().String())) 591*333d2b36SAndroid Build Coastguard Worker if installSymbolFiles { 592*333d2b36SAndroid Build Coastguard Worker installedPath = ctx.InstallFileWithExtraFilesZip(apexDir.Join(ctx, fi.installDir), 593*333d2b36SAndroid Build Coastguard Worker fi.stem(), fi.builtFile, fi.module.(*java.AndroidAppSet).PackedAdditionalOutputs()) 594*333d2b36SAndroid Build Coastguard Worker } 595*333d2b36SAndroid Build Coastguard Worker } else { 596*333d2b36SAndroid Build Coastguard Worker if installSymbolFiles { 597*333d2b36SAndroid Build Coastguard Worker // store installedPath. symlinks might be created if required. 598*333d2b36SAndroid Build Coastguard Worker installedPath = apexDir.Join(ctx, fi.installDir, fi.stem()) 599*333d2b36SAndroid Build Coastguard Worker } 600*333d2b36SAndroid Build Coastguard Worker } 601*333d2b36SAndroid Build Coastguard Worker 602*333d2b36SAndroid Build Coastguard Worker // Create additional symlinks pointing the file inside the APEX (if any). Note that 603*333d2b36SAndroid Build Coastguard Worker // this is independent from the symlink optimization. 604*333d2b36SAndroid Build Coastguard Worker for _, symlinkPath := range fi.symlinkPaths() { 605*333d2b36SAndroid Build Coastguard Worker symlinkDest := imageDir.Join(ctx, symlinkPath).String() 606*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, "ln -sfn "+filepath.Base(destPath)+" "+symlinkDest) 607*333d2b36SAndroid Build Coastguard Worker if installSymbolFiles { 608*333d2b36SAndroid Build Coastguard Worker ctx.InstallSymlink(apexDir.Join(ctx, filepath.Dir(symlinkPath)), filepath.Base(symlinkPath), installedPath) 609*333d2b36SAndroid Build Coastguard Worker } 610*333d2b36SAndroid Build Coastguard Worker } 611*333d2b36SAndroid Build Coastguard Worker 612*333d2b36SAndroid Build Coastguard Worker installMapPath = installedPath 613*333d2b36SAndroid Build Coastguard Worker } 614*333d2b36SAndroid Build Coastguard Worker 615*333d2b36SAndroid Build Coastguard Worker // Copy the test files (if any) 616*333d2b36SAndroid Build Coastguard Worker for _, d := range fi.dataPaths { 617*333d2b36SAndroid Build Coastguard Worker // TODO(eakammer): This is now the third repetition of ~this logic for test paths, refactoring should be possible 618*333d2b36SAndroid Build Coastguard Worker relPath := d.ToRelativeInstallPath() 619*333d2b36SAndroid Build Coastguard Worker dataDest := imageDir.Join(ctx, fi.apexRelativePath(relPath)).String() 620*333d2b36SAndroid Build Coastguard Worker 621*333d2b36SAndroid Build Coastguard Worker copyCommands = append(copyCommands, "cp -f "+d.SrcPath.String()+" "+dataDest) 622*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, d.SrcPath) 623*333d2b36SAndroid Build Coastguard Worker } 624*333d2b36SAndroid Build Coastguard Worker 625*333d2b36SAndroid Build Coastguard Worker installMapSet[installMapPath.String()+":"+fi.installDir+"/"+fi.builtFile.Base()] = true 626*333d2b36SAndroid Build Coastguard Worker } 627*333d2b36SAndroid Build Coastguard Worker 628*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, a.manifestPbOut) 629*333d2b36SAndroid Build Coastguard Worker 630*333d2b36SAndroid Build Coastguard Worker if len(installMapSet) > 0 { 631*333d2b36SAndroid Build Coastguard Worker var installs []string 632*333d2b36SAndroid Build Coastguard Worker installs = append(installs, android.SortedKeys(installMapSet)...) 633*333d2b36SAndroid Build Coastguard Worker ctx.SetLicenseInstallMap(installs) 634*333d2b36SAndroid Build Coastguard Worker } 635*333d2b36SAndroid Build Coastguard Worker 636*333d2b36SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////////// 637*333d2b36SAndroid Build Coastguard Worker // Step 1.a: Write the list of files in this APEX to a txt file and compare it against 638*333d2b36SAndroid Build Coastguard Worker // the allowed list given via the allowed_files property. Build fails when the two lists 639*333d2b36SAndroid Build Coastguard Worker // differ. 640*333d2b36SAndroid Build Coastguard Worker // 641*333d2b36SAndroid Build Coastguard Worker // TODO(jiyong): consider removing this. Nobody other than com.android.apex.cts.shim.* seems 642*333d2b36SAndroid Build Coastguard Worker // to be using this at this moment. Furthermore, this looks very similar to what 643*333d2b36SAndroid Build Coastguard Worker // buildInstalledFilesFile does. At least, move this to somewhere else so that this doesn't 644*333d2b36SAndroid Build Coastguard Worker // hurt readability. 645*333d2b36SAndroid Build Coastguard Worker if a.overridableProperties.Allowed_files != nil { 646*333d2b36SAndroid Build Coastguard Worker // Build content.txt 647*333d2b36SAndroid Build Coastguard Worker var contentLines []string 648*333d2b36SAndroid Build Coastguard Worker imageContentFile := android.PathForModuleOut(ctx, "content.txt") 649*333d2b36SAndroid Build Coastguard Worker contentLines = append(contentLines, "./apex_manifest.pb") 650*333d2b36SAndroid Build Coastguard Worker minSdkVersion := a.minSdkVersion(ctx) 651*333d2b36SAndroid Build Coastguard Worker if minSdkVersion.EqualTo(android.SdkVersion_Android10) { 652*333d2b36SAndroid Build Coastguard Worker contentLines = append(contentLines, "./apex_manifest.json") 653*333d2b36SAndroid Build Coastguard Worker } 654*333d2b36SAndroid Build Coastguard Worker for _, fi := range a.filesInfo { 655*333d2b36SAndroid Build Coastguard Worker contentLines = append(contentLines, "./"+fi.path()) 656*333d2b36SAndroid Build Coastguard Worker } 657*333d2b36SAndroid Build Coastguard Worker sort.Strings(contentLines) 658*333d2b36SAndroid Build Coastguard Worker android.WriteFileRule(ctx, imageContentFile, strings.Join(contentLines, "\n")) 659*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, imageContentFile) 660*333d2b36SAndroid Build Coastguard Worker 661*333d2b36SAndroid Build Coastguard Worker // Compare content.txt against allowed_files. 662*333d2b36SAndroid Build Coastguard Worker allowedFilesFile := android.PathForModuleSrc(ctx, proptools.String(a.overridableProperties.Allowed_files)) 663*333d2b36SAndroid Build Coastguard Worker phonyOutput := android.PathForModuleOut(ctx, a.Name()+"-diff-phony-output") 664*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 665*333d2b36SAndroid Build Coastguard Worker Rule: diffApexContentRule, 666*333d2b36SAndroid Build Coastguard Worker Implicits: implicitInputs, 667*333d2b36SAndroid Build Coastguard Worker Output: phonyOutput, 668*333d2b36SAndroid Build Coastguard Worker Description: "diff apex image content", 669*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 670*333d2b36SAndroid Build Coastguard Worker "allowed_files_file": allowedFilesFile.String(), 671*333d2b36SAndroid Build Coastguard Worker "image_content_file": imageContentFile.String(), 672*333d2b36SAndroid Build Coastguard Worker "apex_module_name": a.Name(), 673*333d2b36SAndroid Build Coastguard Worker }, 674*333d2b36SAndroid Build Coastguard Worker }) 675*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, phonyOutput) 676*333d2b36SAndroid Build Coastguard Worker } 677*333d2b36SAndroid Build Coastguard Worker 678*333d2b36SAndroid Build Coastguard Worker unsignedOutputFile := android.PathForModuleOut(ctx, a.Name()+suffix+".unsigned") 679*333d2b36SAndroid Build Coastguard Worker outHostBinDir := ctx.Config().HostToolPath(ctx, "").String() 680*333d2b36SAndroid Build Coastguard Worker prebuiltSdkToolsBinDir := filepath.Join("prebuilts", "sdk", "tools", runtime.GOOS, "bin") 681*333d2b36SAndroid Build Coastguard Worker 682*333d2b36SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////// 683*333d2b36SAndroid Build Coastguard Worker // Step 2: create canned_fs_config which encodes filemode,uid,gid of each files 684*333d2b36SAndroid Build Coastguard Worker // in this APEX. The file will be used by apexer in later steps. 685*333d2b36SAndroid Build Coastguard Worker cannedFsConfig := a.buildCannedFsConfig(ctx) 686*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, cannedFsConfig) 687*333d2b36SAndroid Build Coastguard Worker 688*333d2b36SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////// 689*333d2b36SAndroid Build Coastguard Worker // Step 3: Prepare option flags for apexer and invoke it to create an unsigned APEX. 690*333d2b36SAndroid Build Coastguard Worker // TODO(jiyong): use the RuleBuilder 691*333d2b36SAndroid Build Coastguard Worker optFlags := []string{} 692*333d2b36SAndroid Build Coastguard Worker 693*333d2b36SAndroid Build Coastguard Worker fileContexts := a.buildFileContexts(ctx) 694*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, fileContexts) 695*333d2b36SAndroid Build Coastguard Worker 696*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, a.privateKeyFile, a.publicKeyFile) 697*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--pubkey "+a.publicKeyFile.String()) 698*333d2b36SAndroid Build Coastguard Worker 699*333d2b36SAndroid Build Coastguard Worker manifestPackageName := a.getOverrideManifestPackageName(ctx) 700*333d2b36SAndroid Build Coastguard Worker if manifestPackageName != "" { 701*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--override_apk_package_name "+manifestPackageName) 702*333d2b36SAndroid Build Coastguard Worker } 703*333d2b36SAndroid Build Coastguard Worker 704*333d2b36SAndroid Build Coastguard Worker androidManifest := a.properties.AndroidManifest.GetOrDefault(ctx, "") 705*333d2b36SAndroid Build Coastguard Worker if androidManifest != "" { 706*333d2b36SAndroid Build Coastguard Worker androidManifestFile := android.PathForModuleSrc(ctx, androidManifest) 707*333d2b36SAndroid Build Coastguard Worker 708*333d2b36SAndroid Build Coastguard Worker if a.testApex { 709*333d2b36SAndroid Build Coastguard Worker androidManifestFile = markManifestTestOnly(ctx, androidManifestFile) 710*333d2b36SAndroid Build Coastguard Worker } 711*333d2b36SAndroid Build Coastguard Worker 712*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, androidManifestFile) 713*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--android_manifest "+androidManifestFile.String()) 714*333d2b36SAndroid Build Coastguard Worker } else if a.testApex { 715*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--test_only") 716*333d2b36SAndroid Build Coastguard Worker } 717*333d2b36SAndroid Build Coastguard Worker 718*333d2b36SAndroid Build Coastguard Worker // Determine target/min sdk version from the context 719*333d2b36SAndroid Build Coastguard Worker // TODO(jiyong): make this as a function 720*333d2b36SAndroid Build Coastguard Worker moduleMinSdkVersion := a.minSdkVersion(ctx) 721*333d2b36SAndroid Build Coastguard Worker minSdkVersion := moduleMinSdkVersion.String() 722*333d2b36SAndroid Build Coastguard Worker 723*333d2b36SAndroid Build Coastguard Worker // bundletool doesn't understand what "current" is. We need to transform it to 724*333d2b36SAndroid Build Coastguard Worker // codename 725*333d2b36SAndroid Build Coastguard Worker if moduleMinSdkVersion.IsCurrent() || moduleMinSdkVersion.IsNone() { 726*333d2b36SAndroid Build Coastguard Worker minSdkVersion = ctx.Config().DefaultAppTargetSdk(ctx).String() 727*333d2b36SAndroid Build Coastguard Worker 728*333d2b36SAndroid Build Coastguard Worker if useApiFingerprint, fingerprintMinSdkVersion, fingerprintDeps := 729*333d2b36SAndroid Build Coastguard Worker java.UseApiFingerprint(ctx); useApiFingerprint { 730*333d2b36SAndroid Build Coastguard Worker minSdkVersion = fingerprintMinSdkVersion 731*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, fingerprintDeps) 732*333d2b36SAndroid Build Coastguard Worker } 733*333d2b36SAndroid Build Coastguard Worker } 734*333d2b36SAndroid Build Coastguard Worker // apex module doesn't have a concept of target_sdk_version, hence for the time 735*333d2b36SAndroid Build Coastguard Worker // being targetSdkVersion == default targetSdkVersion of the branch. 736*333d2b36SAndroid Build Coastguard Worker targetSdkVersion := strconv.Itoa(ctx.Config().DefaultAppTargetSdk(ctx).FinalOrFutureInt()) 737*333d2b36SAndroid Build Coastguard Worker 738*333d2b36SAndroid Build Coastguard Worker if useApiFingerprint, fingerprintTargetSdkVersion, fingerprintDeps := 739*333d2b36SAndroid Build Coastguard Worker java.UseApiFingerprint(ctx); useApiFingerprint { 740*333d2b36SAndroid Build Coastguard Worker targetSdkVersion = fingerprintTargetSdkVersion 741*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, fingerprintDeps) 742*333d2b36SAndroid Build Coastguard Worker } 743*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--target_sdk_version "+targetSdkVersion) 744*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--min_sdk_version "+minSdkVersion) 745*333d2b36SAndroid Build Coastguard Worker 746*333d2b36SAndroid Build Coastguard Worker if a.overridableProperties.Logging_parent != "" { 747*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--logging_parent ", a.overridableProperties.Logging_parent) 748*333d2b36SAndroid Build Coastguard Worker } 749*333d2b36SAndroid Build Coastguard Worker 750*333d2b36SAndroid Build Coastguard Worker // Create a NOTICE file, and embed it as an asset file in the APEX. 751*333d2b36SAndroid Build Coastguard Worker htmlGzNotice := android.PathForModuleOut(ctx, "NOTICE.html.gz") 752*333d2b36SAndroid Build Coastguard Worker android.BuildNoticeHtmlOutputFromLicenseMetadata( 753*333d2b36SAndroid Build Coastguard Worker ctx, htmlGzNotice, "", "", 754*333d2b36SAndroid Build Coastguard Worker []string{ 755*333d2b36SAndroid Build Coastguard Worker android.PathForModuleInstall(ctx).String() + "/", 756*333d2b36SAndroid Build Coastguard Worker android.PathForModuleInPartitionInstall(ctx, "apex").String() + "/", 757*333d2b36SAndroid Build Coastguard Worker }) 758*333d2b36SAndroid Build Coastguard Worker noticeAssetPath := android.PathForModuleOut(ctx, "NOTICE", "NOTICE.html.gz") 759*333d2b36SAndroid Build Coastguard Worker builder := android.NewRuleBuilder(pctx, ctx) 760*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("cp"). 761*333d2b36SAndroid Build Coastguard Worker Input(htmlGzNotice). 762*333d2b36SAndroid Build Coastguard Worker Output(noticeAssetPath) 763*333d2b36SAndroid Build Coastguard Worker builder.Build("notice_dir", "Building notice dir") 764*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, noticeAssetPath) 765*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--assets_dir "+filepath.Dir(noticeAssetPath.String())) 766*333d2b36SAndroid Build Coastguard Worker 767*333d2b36SAndroid Build Coastguard Worker if a.testOnlyShouldSkipPayloadSign() { 768*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--unsigned_payload") 769*333d2b36SAndroid Build Coastguard Worker } 770*333d2b36SAndroid Build Coastguard Worker 771*333d2b36SAndroid Build Coastguard Worker if moduleMinSdkVersion == android.SdkVersion_Android10 { 772*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, a.manifestJsonOut) 773*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--manifest_json "+a.manifestJsonOut.String()) 774*333d2b36SAndroid Build Coastguard Worker } 775*333d2b36SAndroid Build Coastguard Worker 776*333d2b36SAndroid Build Coastguard Worker optFlags = append(optFlags, "--payload_fs_type "+a.payloadFsType.string()) 777*333d2b36SAndroid Build Coastguard Worker 778*333d2b36SAndroid Build Coastguard Worker if a.dynamic_common_lib_apex() { 779*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 780*333d2b36SAndroid Build Coastguard Worker Rule: DCLAApexRule, 781*333d2b36SAndroid Build Coastguard Worker Implicits: implicitInputs, 782*333d2b36SAndroid Build Coastguard Worker Output: unsignedOutputFile, 783*333d2b36SAndroid Build Coastguard Worker Description: "apex", 784*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 785*333d2b36SAndroid Build Coastguard Worker "tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir, 786*333d2b36SAndroid Build Coastguard Worker "image_dir": imageDir.String(), 787*333d2b36SAndroid Build Coastguard Worker "copy_commands": strings.Join(copyCommands, " && "), 788*333d2b36SAndroid Build Coastguard Worker "manifest": a.manifestPbOut.String(), 789*333d2b36SAndroid Build Coastguard Worker "file_contexts": fileContexts.String(), 790*333d2b36SAndroid Build Coastguard Worker "canned_fs_config": cannedFsConfig.String(), 791*333d2b36SAndroid Build Coastguard Worker "key": a.privateKeyFile.String(), 792*333d2b36SAndroid Build Coastguard Worker "opt_flags": strings.Join(optFlags, " "), 793*333d2b36SAndroid Build Coastguard Worker }, 794*333d2b36SAndroid Build Coastguard Worker }) 795*333d2b36SAndroid Build Coastguard Worker } else { 796*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 797*333d2b36SAndroid Build Coastguard Worker Rule: apexRule, 798*333d2b36SAndroid Build Coastguard Worker Implicits: implicitInputs, 799*333d2b36SAndroid Build Coastguard Worker Output: unsignedOutputFile, 800*333d2b36SAndroid Build Coastguard Worker Description: "apex", 801*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 802*333d2b36SAndroid Build Coastguard Worker "tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir, 803*333d2b36SAndroid Build Coastguard Worker "image_dir": imageDir.String(), 804*333d2b36SAndroid Build Coastguard Worker "copy_commands": strings.Join(copyCommands, " && "), 805*333d2b36SAndroid Build Coastguard Worker "manifest": a.manifestPbOut.String(), 806*333d2b36SAndroid Build Coastguard Worker "file_contexts": fileContexts.String(), 807*333d2b36SAndroid Build Coastguard Worker "canned_fs_config": cannedFsConfig.String(), 808*333d2b36SAndroid Build Coastguard Worker "key": a.privateKeyFile.String(), 809*333d2b36SAndroid Build Coastguard Worker "opt_flags": strings.Join(optFlags, " "), 810*333d2b36SAndroid Build Coastguard Worker }, 811*333d2b36SAndroid Build Coastguard Worker }) 812*333d2b36SAndroid Build Coastguard Worker } 813*333d2b36SAndroid Build Coastguard Worker 814*333d2b36SAndroid Build Coastguard Worker // TODO(jiyong): make the two rules below as separate functions 815*333d2b36SAndroid Build Coastguard Worker apexProtoFile := android.PathForModuleOut(ctx, a.Name()+".pb"+suffix) 816*333d2b36SAndroid Build Coastguard Worker bundleModuleFile := android.PathForModuleOut(ctx, a.Name()+suffix+"-base.zip") 817*333d2b36SAndroid Build Coastguard Worker a.bundleModuleFile = bundleModuleFile 818*333d2b36SAndroid Build Coastguard Worker 819*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 820*333d2b36SAndroid Build Coastguard Worker Rule: apexProtoConvertRule, 821*333d2b36SAndroid Build Coastguard Worker Input: unsignedOutputFile, 822*333d2b36SAndroid Build Coastguard Worker Output: apexProtoFile, 823*333d2b36SAndroid Build Coastguard Worker Description: "apex proto convert", 824*333d2b36SAndroid Build Coastguard Worker }) 825*333d2b36SAndroid Build Coastguard Worker 826*333d2b36SAndroid Build Coastguard Worker implicitInputs = append(implicitInputs, unsignedOutputFile) 827*333d2b36SAndroid Build Coastguard Worker 828*333d2b36SAndroid Build Coastguard Worker // Run coverage analysis 829*333d2b36SAndroid Build Coastguard Worker apisUsedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+"_using.txt") 830*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 831*333d2b36SAndroid Build Coastguard Worker Rule: generateAPIsUsedbyApexRule, 832*333d2b36SAndroid Build Coastguard Worker Implicits: implicitInputs, 833*333d2b36SAndroid Build Coastguard Worker Description: "coverage", 834*333d2b36SAndroid Build Coastguard Worker Output: apisUsedbyOutputFile, 835*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 836*333d2b36SAndroid Build Coastguard Worker "image_dir": imageDir.String(), 837*333d2b36SAndroid Build Coastguard Worker "readelf": "${config.ClangBin}/llvm-readelf", 838*333d2b36SAndroid Build Coastguard Worker }, 839*333d2b36SAndroid Build Coastguard Worker }) 840*333d2b36SAndroid Build Coastguard Worker a.nativeApisUsedByModuleFile = apisUsedbyOutputFile 841*333d2b36SAndroid Build Coastguard Worker 842*333d2b36SAndroid Build Coastguard Worker var nativeLibNames []string 843*333d2b36SAndroid Build Coastguard Worker for _, f := range a.filesInfo { 844*333d2b36SAndroid Build Coastguard Worker if f.class == nativeSharedLib { 845*333d2b36SAndroid Build Coastguard Worker nativeLibNames = append(nativeLibNames, f.stem()) 846*333d2b36SAndroid Build Coastguard Worker } 847*333d2b36SAndroid Build Coastguard Worker } 848*333d2b36SAndroid Build Coastguard Worker apisBackedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+"_backing.txt") 849*333d2b36SAndroid Build Coastguard Worker rb := android.NewRuleBuilder(pctx, ctx) 850*333d2b36SAndroid Build Coastguard Worker rb.Command(). 851*333d2b36SAndroid Build Coastguard Worker Tool(android.PathForSource(ctx, "build/soong/scripts/gen_ndk_backedby_apex.sh")). 852*333d2b36SAndroid Build Coastguard Worker Output(apisBackedbyOutputFile). 853*333d2b36SAndroid Build Coastguard Worker Flags(nativeLibNames) 854*333d2b36SAndroid Build Coastguard Worker rb.Build("ndk_backedby_list", "Generate API libraries backed by Apex") 855*333d2b36SAndroid Build Coastguard Worker a.nativeApisBackedByModuleFile = apisBackedbyOutputFile 856*333d2b36SAndroid Build Coastguard Worker 857*333d2b36SAndroid Build Coastguard Worker var javaLibOrApkPath []android.Path 858*333d2b36SAndroid Build Coastguard Worker for _, f := range a.filesInfo { 859*333d2b36SAndroid Build Coastguard Worker if f.class == javaSharedLib || f.class == app { 860*333d2b36SAndroid Build Coastguard Worker javaLibOrApkPath = append(javaLibOrApkPath, f.builtFile) 861*333d2b36SAndroid Build Coastguard Worker } 862*333d2b36SAndroid Build Coastguard Worker } 863*333d2b36SAndroid Build Coastguard Worker javaApiUsedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+"_using.xml") 864*333d2b36SAndroid Build Coastguard Worker javaUsedByRule := android.NewRuleBuilder(pctx, ctx) 865*333d2b36SAndroid Build Coastguard Worker javaUsedByRule.Command(). 866*333d2b36SAndroid Build Coastguard Worker Tool(android.PathForSource(ctx, "build/soong/scripts/gen_java_usedby_apex.sh")). 867*333d2b36SAndroid Build Coastguard Worker BuiltTool("dexdeps"). 868*333d2b36SAndroid Build Coastguard Worker Output(javaApiUsedbyOutputFile). 869*333d2b36SAndroid Build Coastguard Worker Inputs(javaLibOrApkPath) 870*333d2b36SAndroid Build Coastguard Worker javaUsedByRule.Build("java_usedby_list", "Generate Java APIs used by Apex") 871*333d2b36SAndroid Build Coastguard Worker a.javaApisUsedByModuleFile = javaApiUsedbyOutputFile 872*333d2b36SAndroid Build Coastguard Worker 873*333d2b36SAndroid Build Coastguard Worker bundleConfig := a.buildBundleConfig(ctx) 874*333d2b36SAndroid Build Coastguard Worker 875*333d2b36SAndroid Build Coastguard Worker var abis []string 876*333d2b36SAndroid Build Coastguard Worker for _, target := range ctx.MultiTargets() { 877*333d2b36SAndroid Build Coastguard Worker if len(target.Arch.Abi) > 0 { 878*333d2b36SAndroid Build Coastguard Worker abis = append(abis, target.Arch.Abi[0]) 879*333d2b36SAndroid Build Coastguard Worker } 880*333d2b36SAndroid Build Coastguard Worker } 881*333d2b36SAndroid Build Coastguard Worker 882*333d2b36SAndroid Build Coastguard Worker abis = android.FirstUniqueStrings(abis) 883*333d2b36SAndroid Build Coastguard Worker 884*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 885*333d2b36SAndroid Build Coastguard Worker Rule: apexBundleRule, 886*333d2b36SAndroid Build Coastguard Worker Input: apexProtoFile, 887*333d2b36SAndroid Build Coastguard Worker Implicit: bundleConfig, 888*333d2b36SAndroid Build Coastguard Worker Output: a.bundleModuleFile, 889*333d2b36SAndroid Build Coastguard Worker Description: "apex bundle module", 890*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 891*333d2b36SAndroid Build Coastguard Worker "abi": strings.Join(abis, "."), 892*333d2b36SAndroid Build Coastguard Worker "config": bundleConfig.String(), 893*333d2b36SAndroid Build Coastguard Worker }, 894*333d2b36SAndroid Build Coastguard Worker }) 895*333d2b36SAndroid Build Coastguard Worker 896*333d2b36SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////// 897*333d2b36SAndroid Build Coastguard Worker // Step 4: Sign the APEX using signapk 898*333d2b36SAndroid Build Coastguard Worker signedOutputFile := android.PathForModuleOut(ctx, a.Name()+suffix) 899*333d2b36SAndroid Build Coastguard Worker 900*333d2b36SAndroid Build Coastguard Worker pem, key := a.getCertificateAndPrivateKey(ctx) 901*333d2b36SAndroid Build Coastguard Worker rule := java.Signapk 902*333d2b36SAndroid Build Coastguard Worker args := map[string]string{ 903*333d2b36SAndroid Build Coastguard Worker "certificates": pem.String() + " " + key.String(), 904*333d2b36SAndroid Build Coastguard Worker "flags": "-a 4096 --align-file-size", //alignment 905*333d2b36SAndroid Build Coastguard Worker } 906*333d2b36SAndroid Build Coastguard Worker implicits := android.Paths{pem, key} 907*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_SIGNAPK") { 908*333d2b36SAndroid Build Coastguard Worker rule = java.SignapkRE 909*333d2b36SAndroid Build Coastguard Worker args["implicits"] = strings.Join(implicits.Strings(), ",") 910*333d2b36SAndroid Build Coastguard Worker args["outCommaList"] = signedOutputFile.String() 911*333d2b36SAndroid Build Coastguard Worker } 912*333d2b36SAndroid Build Coastguard Worker var validations android.Paths 913*333d2b36SAndroid Build Coastguard Worker validations = append(validations, runApexLinkerconfigValidation(ctx, unsignedOutputFile, imageDir)) 914*333d2b36SAndroid Build Coastguard Worker // TODO(b/279688635) deapexer supports [ext4] 915*333d2b36SAndroid Build Coastguard Worker if !a.skipValidation(apexSepolicyTests) && suffix == imageApexSuffix && ext4 == a.payloadFsType { 916*333d2b36SAndroid Build Coastguard Worker validations = append(validations, runApexSepolicyTests(ctx, unsignedOutputFile)) 917*333d2b36SAndroid Build Coastguard Worker } 918*333d2b36SAndroid Build Coastguard Worker if !a.testApex && len(a.properties.Unwanted_transitive_deps) > 0 { 919*333d2b36SAndroid Build Coastguard Worker validations = append(validations, 920*333d2b36SAndroid Build Coastguard Worker runApexElfCheckerUnwanted(ctx, unsignedOutputFile, a.properties.Unwanted_transitive_deps)) 921*333d2b36SAndroid Build Coastguard Worker } 922*333d2b36SAndroid Build Coastguard Worker if !a.skipValidation(hostApexVerifier) && android.InList(a.payloadFsType, []fsType{ext4, erofs}) { 923*333d2b36SAndroid Build Coastguard Worker validations = append(validations, runApexHostVerifier(ctx, a, unsignedOutputFile)) 924*333d2b36SAndroid Build Coastguard Worker } 925*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 926*333d2b36SAndroid Build Coastguard Worker Rule: rule, 927*333d2b36SAndroid Build Coastguard Worker Description: "signapk", 928*333d2b36SAndroid Build Coastguard Worker Output: signedOutputFile, 929*333d2b36SAndroid Build Coastguard Worker Input: unsignedOutputFile, 930*333d2b36SAndroid Build Coastguard Worker Implicits: implicits, 931*333d2b36SAndroid Build Coastguard Worker Args: args, 932*333d2b36SAndroid Build Coastguard Worker Validations: validations, 933*333d2b36SAndroid Build Coastguard Worker }) 934*333d2b36SAndroid Build Coastguard Worker if suffix == imageApexSuffix { 935*333d2b36SAndroid Build Coastguard Worker a.outputApexFile = signedOutputFile 936*333d2b36SAndroid Build Coastguard Worker } 937*333d2b36SAndroid Build Coastguard Worker a.outputFile = signedOutputFile 938*333d2b36SAndroid Build Coastguard Worker 939*333d2b36SAndroid Build Coastguard Worker if ctx.ModuleDir() != "system/apex/apexd/apexd_testdata" && a.testOnlyShouldForceCompression() { 940*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("test_only_force_compression", "not available") 941*333d2b36SAndroid Build Coastguard Worker return 942*333d2b36SAndroid Build Coastguard Worker } 943*333d2b36SAndroid Build Coastguard Worker 944*333d2b36SAndroid Build Coastguard Worker installSuffix := suffix 945*333d2b36SAndroid Build Coastguard Worker a.setCompression(ctx) 946*333d2b36SAndroid Build Coastguard Worker if a.isCompressed { 947*333d2b36SAndroid Build Coastguard Worker unsignedCompressedOutputFile := android.PathForModuleOut(ctx, a.Name()+imageCapexSuffix+".unsigned") 948*333d2b36SAndroid Build Coastguard Worker 949*333d2b36SAndroid Build Coastguard Worker compressRule := android.NewRuleBuilder(pctx, ctx) 950*333d2b36SAndroid Build Coastguard Worker compressRule.Command(). 951*333d2b36SAndroid Build Coastguard Worker Text("rm"). 952*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-f ", unsignedCompressedOutputFile) 953*333d2b36SAndroid Build Coastguard Worker compressRule.Command(). 954*333d2b36SAndroid Build Coastguard Worker BuiltTool("apex_compression_tool"). 955*333d2b36SAndroid Build Coastguard Worker Flag("compress"). 956*333d2b36SAndroid Build Coastguard Worker FlagWithArg("--apex_compression_tool ", outHostBinDir+":"+prebuiltSdkToolsBinDir). 957*333d2b36SAndroid Build Coastguard Worker FlagWithInput("--input ", signedOutputFile). 958*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("--output ", unsignedCompressedOutputFile) 959*333d2b36SAndroid Build Coastguard Worker compressRule.Build("compressRule", "Generate unsigned compressed APEX file") 960*333d2b36SAndroid Build Coastguard Worker 961*333d2b36SAndroid Build Coastguard Worker signedCompressedOutputFile := android.PathForModuleOut(ctx, a.Name()+imageCapexSuffix) 962*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_SIGNAPK") { 963*333d2b36SAndroid Build Coastguard Worker args["outCommaList"] = signedCompressedOutputFile.String() 964*333d2b36SAndroid Build Coastguard Worker } 965*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 966*333d2b36SAndroid Build Coastguard Worker Rule: rule, 967*333d2b36SAndroid Build Coastguard Worker Description: "sign compressedApex", 968*333d2b36SAndroid Build Coastguard Worker Output: signedCompressedOutputFile, 969*333d2b36SAndroid Build Coastguard Worker Input: unsignedCompressedOutputFile, 970*333d2b36SAndroid Build Coastguard Worker Implicits: implicits, 971*333d2b36SAndroid Build Coastguard Worker Args: args, 972*333d2b36SAndroid Build Coastguard Worker }) 973*333d2b36SAndroid Build Coastguard Worker a.outputFile = signedCompressedOutputFile 974*333d2b36SAndroid Build Coastguard Worker installSuffix = imageCapexSuffix 975*333d2b36SAndroid Build Coastguard Worker } 976*333d2b36SAndroid Build Coastguard Worker 977*333d2b36SAndroid Build Coastguard Worker if !a.installable() { 978*333d2b36SAndroid Build Coastguard Worker a.SkipInstall() 979*333d2b36SAndroid Build Coastguard Worker } 980*333d2b36SAndroid Build Coastguard Worker 981*333d2b36SAndroid Build Coastguard Worker // Install to $OUT/soong/{target,host}/.../apex. 982*333d2b36SAndroid Build Coastguard Worker a.installedFile = ctx.InstallFile(a.installDir, a.Name()+installSuffix, a.outputFile, 983*333d2b36SAndroid Build Coastguard Worker a.compatSymlinks...) 984*333d2b36SAndroid Build Coastguard Worker 985*333d2b36SAndroid Build Coastguard Worker // installed-files.txt is dist'ed 986*333d2b36SAndroid Build Coastguard Worker a.installedFilesFile = a.buildInstalledFilesFile(ctx, a.outputFile, imageDir) 987*333d2b36SAndroid Build Coastguard Worker 988*333d2b36SAndroid Build Coastguard Worker a.apexKeysPath = writeApexKeys(ctx, a) 989*333d2b36SAndroid Build Coastguard Worker} 990*333d2b36SAndroid Build Coastguard Worker 991*333d2b36SAndroid Build Coastguard Worker// getCertificateAndPrivateKey retrieves the cert and the private key that will be used to sign 992*333d2b36SAndroid Build Coastguard Worker// the zip container of this APEX. See the description of the 'certificate' property for how 993*333d2b36SAndroid Build Coastguard Worker// the cert and the private key are found. 994*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) getCertificateAndPrivateKey(ctx android.PathContext) (pem, key android.Path) { 995*333d2b36SAndroid Build Coastguard Worker if a.containerCertificateFile != nil { 996*333d2b36SAndroid Build Coastguard Worker return a.containerCertificateFile, a.containerPrivateKeyFile 997*333d2b36SAndroid Build Coastguard Worker } 998*333d2b36SAndroid Build Coastguard Worker 999*333d2b36SAndroid Build Coastguard Worker cert := String(a.overridableProperties.Certificate) 1000*333d2b36SAndroid Build Coastguard Worker if cert == "" { 1001*333d2b36SAndroid Build Coastguard Worker return ctx.Config().DefaultAppCertificate(ctx) 1002*333d2b36SAndroid Build Coastguard Worker } 1003*333d2b36SAndroid Build Coastguard Worker 1004*333d2b36SAndroid Build Coastguard Worker defaultDir := ctx.Config().DefaultAppCertificateDir(ctx) 1005*333d2b36SAndroid Build Coastguard Worker pem = defaultDir.Join(ctx, cert+".x509.pem") 1006*333d2b36SAndroid Build Coastguard Worker key = defaultDir.Join(ctx, cert+".pk8") 1007*333d2b36SAndroid Build Coastguard Worker return pem, key 1008*333d2b36SAndroid Build Coastguard Worker} 1009*333d2b36SAndroid Build Coastguard Worker 1010*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) getOverrideManifestPackageName(ctx android.ModuleContext) string { 1011*333d2b36SAndroid Build Coastguard Worker // For VNDK APEXes, check "com.android.vndk" in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES 1012*333d2b36SAndroid Build Coastguard Worker // to see if it should be overridden because their <apex name> is dynamically generated 1013*333d2b36SAndroid Build Coastguard Worker // according to its VNDK version. 1014*333d2b36SAndroid Build Coastguard Worker if a.vndkApex { 1015*333d2b36SAndroid Build Coastguard Worker overrideName, overridden := ctx.DeviceConfig().OverrideManifestPackageNameFor(vndkApexName) 1016*333d2b36SAndroid Build Coastguard Worker if overridden { 1017*333d2b36SAndroid Build Coastguard Worker return overrideName + ".v" + a.vndkVersion() 1018*333d2b36SAndroid Build Coastguard Worker } 1019*333d2b36SAndroid Build Coastguard Worker return "" 1020*333d2b36SAndroid Build Coastguard Worker } 1021*333d2b36SAndroid Build Coastguard Worker packageNameFromProp := a.overridableProperties.Package_name.GetOrDefault(ctx, "") 1022*333d2b36SAndroid Build Coastguard Worker if packageNameFromProp != "" { 1023*333d2b36SAndroid Build Coastguard Worker return packageNameFromProp 1024*333d2b36SAndroid Build Coastguard Worker } 1025*333d2b36SAndroid Build Coastguard Worker manifestPackageName, overridden := ctx.DeviceConfig().OverrideManifestPackageNameFor(ctx.ModuleName()) 1026*333d2b36SAndroid Build Coastguard Worker if overridden { 1027*333d2b36SAndroid Build Coastguard Worker return manifestPackageName 1028*333d2b36SAndroid Build Coastguard Worker } 1029*333d2b36SAndroid Build Coastguard Worker return "" 1030*333d2b36SAndroid Build Coastguard Worker} 1031*333d2b36SAndroid Build Coastguard Worker 1032*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { 1033*333d2b36SAndroid Build Coastguard Worker if a.properties.IsCoverageVariant { 1034*333d2b36SAndroid Build Coastguard Worker // Otherwise, we will have duplicated rules for coverage and 1035*333d2b36SAndroid Build Coastguard Worker // non-coverage variants of the same APEX 1036*333d2b36SAndroid Build Coastguard Worker return 1037*333d2b36SAndroid Build Coastguard Worker } 1038*333d2b36SAndroid Build Coastguard Worker 1039*333d2b36SAndroid Build Coastguard Worker depInfos := android.DepNameToDepInfoMap{} 1040*333d2b36SAndroid Build Coastguard Worker a.WalkPayloadDeps(ctx, func(ctx android.BaseModuleContext, from blueprint.Module, to android.ApexModule, externalDep bool) bool { 1041*333d2b36SAndroid Build Coastguard Worker if from.Name() == to.Name() { 1042*333d2b36SAndroid Build Coastguard Worker // This can happen for cc.reuseObjTag. We are not interested in tracking this. 1043*333d2b36SAndroid Build Coastguard Worker // As soon as the dependency graph crosses the APEX boundary, don't go further. 1044*333d2b36SAndroid Build Coastguard Worker return !externalDep 1045*333d2b36SAndroid Build Coastguard Worker } 1046*333d2b36SAndroid Build Coastguard Worker 1047*333d2b36SAndroid Build Coastguard Worker // Skip dependencies that are only available to APEXes; they are developed with updatability 1048*333d2b36SAndroid Build Coastguard Worker // in mind and don't need manual approval. 1049*333d2b36SAndroid Build Coastguard Worker if to.(android.ApexModule).NotAvailableForPlatform() { 1050*333d2b36SAndroid Build Coastguard Worker return !externalDep 1051*333d2b36SAndroid Build Coastguard Worker } 1052*333d2b36SAndroid Build Coastguard Worker 1053*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(to) 1054*333d2b36SAndroid Build Coastguard Worker // Check to see if dependency been marked to skip the dependency check 1055*333d2b36SAndroid Build Coastguard Worker if skipDepCheck, ok := depTag.(android.SkipApexAllowedDependenciesCheck); ok && skipDepCheck.SkipApexAllowedDependenciesCheck() { 1056*333d2b36SAndroid Build Coastguard Worker return !externalDep 1057*333d2b36SAndroid Build Coastguard Worker } 1058*333d2b36SAndroid Build Coastguard Worker 1059*333d2b36SAndroid Build Coastguard Worker if info, exists := depInfos[to.Name()]; exists { 1060*333d2b36SAndroid Build Coastguard Worker if !android.InList(from.Name(), info.From) { 1061*333d2b36SAndroid Build Coastguard Worker info.From = append(info.From, from.Name()) 1062*333d2b36SAndroid Build Coastguard Worker } 1063*333d2b36SAndroid Build Coastguard Worker info.IsExternal = info.IsExternal && externalDep 1064*333d2b36SAndroid Build Coastguard Worker depInfos[to.Name()] = info 1065*333d2b36SAndroid Build Coastguard Worker } else { 1066*333d2b36SAndroid Build Coastguard Worker toMinSdkVersion := "(no version)" 1067*333d2b36SAndroid Build Coastguard Worker if m, ok := to.(interface { 1068*333d2b36SAndroid Build Coastguard Worker MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel 1069*333d2b36SAndroid Build Coastguard Worker }); ok { 1070*333d2b36SAndroid Build Coastguard Worker if v := m.MinSdkVersion(ctx); !v.IsNone() { 1071*333d2b36SAndroid Build Coastguard Worker toMinSdkVersion = v.String() 1072*333d2b36SAndroid Build Coastguard Worker } 1073*333d2b36SAndroid Build Coastguard Worker } else if m, ok := to.(interface{ MinSdkVersion() string }); ok { 1074*333d2b36SAndroid Build Coastguard Worker // TODO(b/175678607) eliminate the use of MinSdkVersion returning 1075*333d2b36SAndroid Build Coastguard Worker // string 1076*333d2b36SAndroid Build Coastguard Worker if v := m.MinSdkVersion(); v != "" { 1077*333d2b36SAndroid Build Coastguard Worker toMinSdkVersion = v 1078*333d2b36SAndroid Build Coastguard Worker } 1079*333d2b36SAndroid Build Coastguard Worker } 1080*333d2b36SAndroid Build Coastguard Worker depInfos[to.Name()] = android.ApexModuleDepInfo{ 1081*333d2b36SAndroid Build Coastguard Worker To: to.Name(), 1082*333d2b36SAndroid Build Coastguard Worker From: []string{from.Name()}, 1083*333d2b36SAndroid Build Coastguard Worker IsExternal: externalDep, 1084*333d2b36SAndroid Build Coastguard Worker MinSdkVersion: toMinSdkVersion, 1085*333d2b36SAndroid Build Coastguard Worker } 1086*333d2b36SAndroid Build Coastguard Worker } 1087*333d2b36SAndroid Build Coastguard Worker 1088*333d2b36SAndroid Build Coastguard Worker // As soon as the dependency graph crosses the APEX boundary, don't go further. 1089*333d2b36SAndroid Build Coastguard Worker return !externalDep 1090*333d2b36SAndroid Build Coastguard Worker }) 1091*333d2b36SAndroid Build Coastguard Worker 1092*333d2b36SAndroid Build Coastguard Worker a.ApexBundleDepsInfo.BuildDepsInfoLists(ctx, a.MinSdkVersion(ctx).String(), depInfos) 1093*333d2b36SAndroid Build Coastguard Worker 1094*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1095*333d2b36SAndroid Build Coastguard Worker Rule: android.Phony, 1096*333d2b36SAndroid Build Coastguard Worker Output: android.PathForPhony(ctx, a.Name()+"-deps-info"), 1097*333d2b36SAndroid Build Coastguard Worker Inputs: []android.Path{ 1098*333d2b36SAndroid Build Coastguard Worker a.ApexBundleDepsInfo.FullListPath(), 1099*333d2b36SAndroid Build Coastguard Worker a.ApexBundleDepsInfo.FlatListPath(), 1100*333d2b36SAndroid Build Coastguard Worker }, 1101*333d2b36SAndroid Build Coastguard Worker }) 1102*333d2b36SAndroid Build Coastguard Worker} 1103*333d2b36SAndroid Build Coastguard Worker 1104*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildLintReports(ctx android.ModuleContext) { 1105*333d2b36SAndroid Build Coastguard Worker depSetsBuilder := java.NewLintDepSetBuilder() 1106*333d2b36SAndroid Build Coastguard Worker for _, fi := range a.filesInfo { 1107*333d2b36SAndroid Build Coastguard Worker if fi.lintInfo != nil { 1108*333d2b36SAndroid Build Coastguard Worker depSetsBuilder.Transitive(fi.lintInfo) 1109*333d2b36SAndroid Build Coastguard Worker } 1110*333d2b36SAndroid Build Coastguard Worker } 1111*333d2b36SAndroid Build Coastguard Worker 1112*333d2b36SAndroid Build Coastguard Worker depSets := depSetsBuilder.Build() 1113*333d2b36SAndroid Build Coastguard Worker var validations android.Paths 1114*333d2b36SAndroid Build Coastguard Worker 1115*333d2b36SAndroid Build Coastguard Worker if a.checkStrictUpdatabilityLinting(ctx) { 1116*333d2b36SAndroid Build Coastguard Worker baselines := depSets.Baseline.ToList() 1117*333d2b36SAndroid Build Coastguard Worker if len(baselines) > 0 { 1118*333d2b36SAndroid Build Coastguard Worker outputFile := java.VerifyStrictUpdatabilityChecks(ctx, baselines) 1119*333d2b36SAndroid Build Coastguard Worker validations = append(validations, outputFile) 1120*333d2b36SAndroid Build Coastguard Worker } 1121*333d2b36SAndroid Build Coastguard Worker } 1122*333d2b36SAndroid Build Coastguard Worker 1123*333d2b36SAndroid Build Coastguard Worker a.lintReports = java.BuildModuleLintReportZips(ctx, depSets, validations) 1124*333d2b36SAndroid Build Coastguard Worker} 1125*333d2b36SAndroid Build Coastguard Worker 1126*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) buildCannedFsConfig(ctx android.ModuleContext) android.Path { 1127*333d2b36SAndroid Build Coastguard Worker var readOnlyPaths = []string{"apex_manifest.json", "apex_manifest.pb"} 1128*333d2b36SAndroid Build Coastguard Worker var executablePaths []string // this also includes dirs 1129*333d2b36SAndroid Build Coastguard Worker var appSetDirs []string 1130*333d2b36SAndroid Build Coastguard Worker appSetFiles := make(map[string]android.Path) 1131*333d2b36SAndroid Build Coastguard Worker for _, f := range a.filesInfo { 1132*333d2b36SAndroid Build Coastguard Worker pathInApex := f.path() 1133*333d2b36SAndroid Build Coastguard Worker if f.installDir == "bin" || strings.HasPrefix(f.installDir, "bin/") { 1134*333d2b36SAndroid Build Coastguard Worker executablePaths = append(executablePaths, pathInApex) 1135*333d2b36SAndroid Build Coastguard Worker for _, d := range f.dataPaths { 1136*333d2b36SAndroid Build Coastguard Worker rel := d.ToRelativeInstallPath() 1137*333d2b36SAndroid Build Coastguard Worker readOnlyPaths = append(readOnlyPaths, filepath.Join(f.installDir, rel)) 1138*333d2b36SAndroid Build Coastguard Worker } 1139*333d2b36SAndroid Build Coastguard Worker for _, s := range f.symlinks { 1140*333d2b36SAndroid Build Coastguard Worker executablePaths = append(executablePaths, filepath.Join(f.installDir, s)) 1141*333d2b36SAndroid Build Coastguard Worker } 1142*333d2b36SAndroid Build Coastguard Worker } else if f.class == appSet { 1143*333d2b36SAndroid Build Coastguard Worker // base APK 1144*333d2b36SAndroid Build Coastguard Worker readOnlyPaths = append(readOnlyPaths, pathInApex) 1145*333d2b36SAndroid Build Coastguard Worker // Additional APKs 1146*333d2b36SAndroid Build Coastguard Worker appSetDirs = append(appSetDirs, f.installDir) 1147*333d2b36SAndroid Build Coastguard Worker appSetFiles[f.installDir] = f.module.(*java.AndroidAppSet).PackedAdditionalOutputs() 1148*333d2b36SAndroid Build Coastguard Worker } else { 1149*333d2b36SAndroid Build Coastguard Worker readOnlyPaths = append(readOnlyPaths, pathInApex) 1150*333d2b36SAndroid Build Coastguard Worker } 1151*333d2b36SAndroid Build Coastguard Worker dir := f.installDir 1152*333d2b36SAndroid Build Coastguard Worker for !android.InList(dir, executablePaths) && dir != "" { 1153*333d2b36SAndroid Build Coastguard Worker executablePaths = append(executablePaths, dir) 1154*333d2b36SAndroid Build Coastguard Worker dir, _ = filepath.Split(dir) // move up to the parent 1155*333d2b36SAndroid Build Coastguard Worker if len(dir) > 0 { 1156*333d2b36SAndroid Build Coastguard Worker // remove trailing slash 1157*333d2b36SAndroid Build Coastguard Worker dir = dir[:len(dir)-1] 1158*333d2b36SAndroid Build Coastguard Worker } 1159*333d2b36SAndroid Build Coastguard Worker } 1160*333d2b36SAndroid Build Coastguard Worker } 1161*333d2b36SAndroid Build Coastguard Worker sort.Strings(readOnlyPaths) 1162*333d2b36SAndroid Build Coastguard Worker sort.Strings(executablePaths) 1163*333d2b36SAndroid Build Coastguard Worker sort.Strings(appSetDirs) 1164*333d2b36SAndroid Build Coastguard Worker 1165*333d2b36SAndroid Build Coastguard Worker cannedFsConfig := android.PathForModuleOut(ctx, "canned_fs_config") 1166*333d2b36SAndroid Build Coastguard Worker builder := android.NewRuleBuilder(pctx, ctx) 1167*333d2b36SAndroid Build Coastguard Worker cmd := builder.Command() 1168*333d2b36SAndroid Build Coastguard Worker cmd.Text("(") 1169*333d2b36SAndroid Build Coastguard Worker cmd.Text("echo '/ 1000 1000 0755';") 1170*333d2b36SAndroid Build Coastguard Worker for _, p := range readOnlyPaths { 1171*333d2b36SAndroid Build Coastguard Worker cmd.Textf("echo '/%s 1000 1000 0644';", p) 1172*333d2b36SAndroid Build Coastguard Worker } 1173*333d2b36SAndroid Build Coastguard Worker for _, p := range executablePaths { 1174*333d2b36SAndroid Build Coastguard Worker cmd.Textf("echo '/%s 0 2000 0755';", p) 1175*333d2b36SAndroid Build Coastguard Worker } 1176*333d2b36SAndroid Build Coastguard Worker for _, dir := range appSetDirs { 1177*333d2b36SAndroid Build Coastguard Worker cmd.Textf("echo '/%s 0 2000 0755';", dir) 1178*333d2b36SAndroid Build Coastguard Worker file := appSetFiles[dir] 1179*333d2b36SAndroid Build Coastguard Worker cmd.Text("zipinfo -1").Input(file).Textf(`| sed "s:\(.*\):/%s/\1 1000 1000 0644:";`, dir) 1180*333d2b36SAndroid Build Coastguard Worker } 1181*333d2b36SAndroid Build Coastguard Worker // Custom fs_config is "appended" to the last so that entries from the file are preferred 1182*333d2b36SAndroid Build Coastguard Worker // over default ones set above. 1183*333d2b36SAndroid Build Coastguard Worker customFsConfig := a.properties.Canned_fs_config.GetOrDefault(ctx, "") 1184*333d2b36SAndroid Build Coastguard Worker if customFsConfig != "" { 1185*333d2b36SAndroid Build Coastguard Worker cmd.Text("cat").Input(android.PathForModuleSrc(ctx, customFsConfig)) 1186*333d2b36SAndroid Build Coastguard Worker } 1187*333d2b36SAndroid Build Coastguard Worker cmd.Text(")").FlagWithOutput("> ", cannedFsConfig) 1188*333d2b36SAndroid Build Coastguard Worker builder.Build("generateFsConfig", fmt.Sprintf("Generating canned fs config for %s", a.BaseModuleName())) 1189*333d2b36SAndroid Build Coastguard Worker 1190*333d2b36SAndroid Build Coastguard Worker return cannedFsConfig 1191*333d2b36SAndroid Build Coastguard Worker} 1192*333d2b36SAndroid Build Coastguard Worker 1193*333d2b36SAndroid Build Coastguard Workerfunc runApexLinkerconfigValidation(ctx android.ModuleContext, apexFile android.Path, imageDir android.Path) android.Path { 1194*333d2b36SAndroid Build Coastguard Worker timestamp := android.PathForModuleOut(ctx, "apex_linkerconfig_validation.timestamp") 1195*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1196*333d2b36SAndroid Build Coastguard Worker Rule: apexLinkerconfigValidationRule, 1197*333d2b36SAndroid Build Coastguard Worker Input: apexFile, 1198*333d2b36SAndroid Build Coastguard Worker Output: timestamp, 1199*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1200*333d2b36SAndroid Build Coastguard Worker "image_dir": imageDir.String(), 1201*333d2b36SAndroid Build Coastguard Worker }, 1202*333d2b36SAndroid Build Coastguard Worker }) 1203*333d2b36SAndroid Build Coastguard Worker return timestamp 1204*333d2b36SAndroid Build Coastguard Worker} 1205*333d2b36SAndroid Build Coastguard Worker 1206*333d2b36SAndroid Build Coastguard Worker// Runs apex_sepolicy_tests 1207*333d2b36SAndroid Build Coastguard Worker// 1208*333d2b36SAndroid Build Coastguard Worker// $ deapexer list -Z {apex_file} > {file_contexts} 1209*333d2b36SAndroid Build Coastguard Worker// $ apex_sepolicy_tests -f {file_contexts} 1210*333d2b36SAndroid Build Coastguard Workerfunc runApexSepolicyTests(ctx android.ModuleContext, apexFile android.Path) android.Path { 1211*333d2b36SAndroid Build Coastguard Worker timestamp := android.PathForModuleOut(ctx, "apex_sepolicy_tests.timestamp") 1212*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1213*333d2b36SAndroid Build Coastguard Worker Rule: apexSepolicyTestsRule, 1214*333d2b36SAndroid Build Coastguard Worker Input: apexFile, 1215*333d2b36SAndroid Build Coastguard Worker Output: timestamp, 1216*333d2b36SAndroid Build Coastguard Worker }) 1217*333d2b36SAndroid Build Coastguard Worker return timestamp 1218*333d2b36SAndroid Build Coastguard Worker} 1219*333d2b36SAndroid Build Coastguard Worker 1220*333d2b36SAndroid Build Coastguard Workerfunc runApexElfCheckerUnwanted(ctx android.ModuleContext, apexFile android.Path, unwanted []string) android.Path { 1221*333d2b36SAndroid Build Coastguard Worker timestamp := android.PathForModuleOut(ctx, "apex_elf_unwanted.timestamp") 1222*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1223*333d2b36SAndroid Build Coastguard Worker Rule: apexElfCheckerUnwantedRule, 1224*333d2b36SAndroid Build Coastguard Worker Input: apexFile, 1225*333d2b36SAndroid Build Coastguard Worker Output: timestamp, 1226*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1227*333d2b36SAndroid Build Coastguard Worker "unwanted": android.JoinWithSuffixAndSeparator(unwanted, ".so", ":"), 1228*333d2b36SAndroid Build Coastguard Worker "tool_path": ctx.Config().HostToolPath(ctx, "").String() + ":${config.ClangBin}", 1229*333d2b36SAndroid Build Coastguard Worker }, 1230*333d2b36SAndroid Build Coastguard Worker }) 1231*333d2b36SAndroid Build Coastguard Worker return timestamp 1232*333d2b36SAndroid Build Coastguard Worker} 1233*333d2b36SAndroid Build Coastguard Worker 1234*333d2b36SAndroid Build Coastguard Workerfunc runApexHostVerifier(ctx android.ModuleContext, a *apexBundle, apexFile android.Path) android.Path { 1235*333d2b36SAndroid Build Coastguard Worker timestamp := android.PathForModuleOut(ctx, "host_apex_verifier.timestamp") 1236*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1237*333d2b36SAndroid Build Coastguard Worker Rule: apexHostVerifierRule, 1238*333d2b36SAndroid Build Coastguard Worker Input: apexFile, 1239*333d2b36SAndroid Build Coastguard Worker Output: timestamp, 1240*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1241*333d2b36SAndroid Build Coastguard Worker "partition_tag": a.PartitionTag(ctx.DeviceConfig()), 1242*333d2b36SAndroid Build Coastguard Worker }, 1243*333d2b36SAndroid Build Coastguard Worker }) 1244*333d2b36SAndroid Build Coastguard Worker return timestamp 1245*333d2b36SAndroid Build Coastguard Worker} 1246