1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker 15*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths") 16*7594170eSAndroid Build Coastguard Worker 17*7594170eSAndroid Build Coastguard Worker# Arch to ABI map 18*7594170eSAndroid Build Coastguard Worker_arch_abi_map = { 19*7594170eSAndroid Build Coastguard Worker "arm": "armeabi-v7a", 20*7594170eSAndroid Build Coastguard Worker "arm64": "arm64-v8a", 21*7594170eSAndroid Build Coastguard Worker "x86": "x86", 22*7594170eSAndroid Build Coastguard Worker "x86_64": "x86_64", 23*7594170eSAndroid Build Coastguard Worker} 24*7594170eSAndroid Build Coastguard Worker 25*7594170eSAndroid Build Coastguard Workerdef _proto_convert(actions, name, aapt2, apex_file): 26*7594170eSAndroid Build Coastguard Worker """Run 'aapt2 convert' to convert resource files to protobuf format.""" 27*7594170eSAndroid Build Coastguard Worker 28*7594170eSAndroid Build Coastguard Worker root, ext = paths.split_extension(apex_file.basename) 29*7594170eSAndroid Build Coastguard Worker output_file = actions.declare_file(paths.join( 30*7594170eSAndroid Build Coastguard Worker name, 31*7594170eSAndroid Build Coastguard Worker root + ".pb" + ext, 32*7594170eSAndroid Build Coastguard Worker )) 33*7594170eSAndroid Build Coastguard Worker 34*7594170eSAndroid Build Coastguard Worker # Arguments 35*7594170eSAndroid Build Coastguard Worker args = actions.args() 36*7594170eSAndroid Build Coastguard Worker args.add("convert") 37*7594170eSAndroid Build Coastguard Worker args.add("--output-format", "proto") 38*7594170eSAndroid Build Coastguard Worker args.add(apex_file) 39*7594170eSAndroid Build Coastguard Worker args.add("-o", output_file) 40*7594170eSAndroid Build Coastguard Worker 41*7594170eSAndroid Build Coastguard Worker actions.run( 42*7594170eSAndroid Build Coastguard Worker inputs = [apex_file], 43*7594170eSAndroid Build Coastguard Worker outputs = [output_file], 44*7594170eSAndroid Build Coastguard Worker executable = aapt2, 45*7594170eSAndroid Build Coastguard Worker arguments = [args], 46*7594170eSAndroid Build Coastguard Worker mnemonic = "ApexProtoConvert", 47*7594170eSAndroid Build Coastguard Worker ) 48*7594170eSAndroid Build Coastguard Worker return output_file 49*7594170eSAndroid Build Coastguard Worker 50*7594170eSAndroid Build Coastguard Workerdef _base_file(actions, name, zip2zip, arch, secondary_arch, apex_proto_file): 51*7594170eSAndroid Build Coastguard Worker """Transforms the apex file to the expected directory structure with all files that will be included in the base module of aab file.""" 52*7594170eSAndroid Build Coastguard Worker 53*7594170eSAndroid Build Coastguard Worker output_file = actions.declare_file(name + "-base.zip") 54*7594170eSAndroid Build Coastguard Worker 55*7594170eSAndroid Build Coastguard Worker # Arguments 56*7594170eSAndroid Build Coastguard Worker args = actions.args() 57*7594170eSAndroid Build Coastguard Worker args.add("-i", apex_proto_file) 58*7594170eSAndroid Build Coastguard Worker args.add("-o", output_file) 59*7594170eSAndroid Build Coastguard Worker abi = _arch_abi_map[arch] 60*7594170eSAndroid Build Coastguard Worker if secondary_arch: 61*7594170eSAndroid Build Coastguard Worker abi += "." + _arch_abi_map[secondary_arch] 62*7594170eSAndroid Build Coastguard Worker args.add_all([ 63*7594170eSAndroid Build Coastguard Worker "apex_payload.img:apex/%s.img" % abi, 64*7594170eSAndroid Build Coastguard Worker "apex_build_info.pb:apex/%s.build_info.pb" % abi, 65*7594170eSAndroid Build Coastguard Worker "apex_manifest.json:root/apex_manifest.json", 66*7594170eSAndroid Build Coastguard Worker "apex_manifest.pb:root/apex_manifest.pb", 67*7594170eSAndroid Build Coastguard Worker "AndroidManifest.xml:manifest/AndroidManifest.xml", 68*7594170eSAndroid Build Coastguard Worker "assets/NOTICE.html.gz:assets/NOTICE.html.gz", 69*7594170eSAndroid Build Coastguard Worker ]) 70*7594170eSAndroid Build Coastguard Worker 71*7594170eSAndroid Build Coastguard Worker actions.run( 72*7594170eSAndroid Build Coastguard Worker inputs = [apex_proto_file], 73*7594170eSAndroid Build Coastguard Worker outputs = [output_file], 74*7594170eSAndroid Build Coastguard Worker executable = zip2zip, 75*7594170eSAndroid Build Coastguard Worker arguments = [args], 76*7594170eSAndroid Build Coastguard Worker mnemonic = "ApexBaseFile", 77*7594170eSAndroid Build Coastguard Worker ) 78*7594170eSAndroid Build Coastguard Worker return output_file 79*7594170eSAndroid Build Coastguard Worker 80*7594170eSAndroid Build Coastguard Workerdef build_bundle_config(actions, name): 81*7594170eSAndroid Build Coastguard Worker """Create bundle_config.json as configuration for running bundletool. 82*7594170eSAndroid Build Coastguard Worker 83*7594170eSAndroid Build Coastguard Worker Args: 84*7594170eSAndroid Build Coastguard Worker actions: ctx.actions from a rule, used to declare outputs and actions. 85*7594170eSAndroid Build Coastguard Worker name: name of target creating action 86*7594170eSAndroid Build Coastguard Worker Returns: 87*7594170eSAndroid Build Coastguard Worker The bundle_config.json file 88*7594170eSAndroid Build Coastguard Worker """ 89*7594170eSAndroid Build Coastguard Worker file_content = { 90*7594170eSAndroid Build Coastguard Worker # TODO(b/257459237): Config should collect manifest names and paths of android apps if their manifest name is overridden. 91*7594170eSAndroid Build Coastguard Worker "apex_config": {}, 92*7594170eSAndroid Build Coastguard Worker "compression": { 93*7594170eSAndroid Build Coastguard Worker "uncompressed_glob": [ 94*7594170eSAndroid Build Coastguard Worker "apex_payload.img", 95*7594170eSAndroid Build Coastguard Worker "apex_manifest.*", 96*7594170eSAndroid Build Coastguard Worker ], 97*7594170eSAndroid Build Coastguard Worker }, 98*7594170eSAndroid Build Coastguard Worker } 99*7594170eSAndroid Build Coastguard Worker bundle_config_file = actions.declare_file(paths.join(name, "bundle_config.json")) 100*7594170eSAndroid Build Coastguard Worker 101*7594170eSAndroid Build Coastguard Worker actions.write(bundle_config_file, json.encode(file_content)) 102*7594170eSAndroid Build Coastguard Worker 103*7594170eSAndroid Build Coastguard Worker return bundle_config_file 104*7594170eSAndroid Build Coastguard Worker 105*7594170eSAndroid Build Coastguard Workerdef _merge_apex_zip_with_config(actions, name, soong_zip, merge_zips, apex_zip, apex_file): 106*7594170eSAndroid Build Coastguard Worker # TODO(): Only used as compatibility with mixed builds 107*7594170eSAndroid Build Coastguard Worker bundle_config = build_bundle_config(actions, name) 108*7594170eSAndroid Build Coastguard Worker apex_config_zip = actions.declare_file(name + ".config") 109*7594170eSAndroid Build Coastguard Worker 110*7594170eSAndroid Build Coastguard Worker args = actions.args() 111*7594170eSAndroid Build Coastguard Worker args.add("-o", apex_config_zip) 112*7594170eSAndroid Build Coastguard Worker args.add("-C", bundle_config.dirname) 113*7594170eSAndroid Build Coastguard Worker args.add("-f", bundle_config) 114*7594170eSAndroid Build Coastguard Worker actions.run( 115*7594170eSAndroid Build Coastguard Worker inputs = [bundle_config], 116*7594170eSAndroid Build Coastguard Worker outputs = [apex_config_zip], 117*7594170eSAndroid Build Coastguard Worker executable = soong_zip, 118*7594170eSAndroid Build Coastguard Worker arguments = [args], 119*7594170eSAndroid Build Coastguard Worker mnemonic = "ApexBaseConfigZip", 120*7594170eSAndroid Build Coastguard Worker ) 121*7594170eSAndroid Build Coastguard Worker 122*7594170eSAndroid Build Coastguard Worker merged_zip = actions.declare_file(apex_file.basename + "-base.zip") 123*7594170eSAndroid Build Coastguard Worker merge_args = actions.args() 124*7594170eSAndroid Build Coastguard Worker merge_args.add(merged_zip) 125*7594170eSAndroid Build Coastguard Worker merge_args.add(apex_zip) 126*7594170eSAndroid Build Coastguard Worker merge_args.add(apex_config_zip) 127*7594170eSAndroid Build Coastguard Worker actions.run( 128*7594170eSAndroid Build Coastguard Worker inputs = [apex_config_zip, apex_zip], 129*7594170eSAndroid Build Coastguard Worker outputs = [merged_zip], 130*7594170eSAndroid Build Coastguard Worker executable = merge_zips, 131*7594170eSAndroid Build Coastguard Worker arguments = [merge_args], 132*7594170eSAndroid Build Coastguard Worker mnemonic = "ApexMergeBaseFileAndConfig", 133*7594170eSAndroid Build Coastguard Worker ) 134*7594170eSAndroid Build Coastguard Worker return merged_zip 135*7594170eSAndroid Build Coastguard Worker 136*7594170eSAndroid Build Coastguard Workerdef apex_zip_files(actions, name, tools, apex_file, arch, secondary_arch): 137*7594170eSAndroid Build Coastguard Worker """Create apex zip files used to create an APEX bundle. 138*7594170eSAndroid Build Coastguard Worker 139*7594170eSAndroid Build Coastguard Worker Args: 140*7594170eSAndroid Build Coastguard Worker actions: Actions, ctx.actions from a rule, used to declare outputs and actions. 141*7594170eSAndroid Build Coastguard Worker name: string, name of the target creating the action 142*7594170eSAndroid Build Coastguard Worker tools: struct containing fields with executables: aapt2, zip2zip, soong_zip, merge_zips 143*7594170eSAndroid Build Coastguard Worker apex_file: File, APEX file 144*7594170eSAndroid Build Coastguard Worker arch: string, the arch of the target configuration of the target requesting the action 145*7594170eSAndroid Build Coastguard Worker Returns: 146*7594170eSAndroid Build Coastguard Worker A struct with these fields: 147*7594170eSAndroid Build Coastguard Worker apex_only: the regular "base" apex zip 148*7594170eSAndroid Build Coastguard Worker apex_with_config: a zipfile that's identical to apex_only, but with the addition of bundle_config.json 149*7594170eSAndroid Build Coastguard Worker """ 150*7594170eSAndroid Build Coastguard Worker apex_proto = _proto_convert(actions, name, tools.aapt2, apex_file) 151*7594170eSAndroid Build Coastguard Worker apex_zip = _base_file(actions, name, tools.zip2zip, arch, secondary_arch, apex_proto) 152*7594170eSAndroid Build Coastguard Worker merged_zip = _merge_apex_zip_with_config(actions, name, tools.soong_zip, tools.merge_zips, apex_zip, apex_file) 153*7594170eSAndroid Build Coastguard Worker 154*7594170eSAndroid Build Coastguard Worker return struct( 155*7594170eSAndroid Build Coastguard Worker apex_only = apex_zip, 156*7594170eSAndroid Build Coastguard Worker apex_with_config = merged_zip, 157*7594170eSAndroid Build Coastguard Worker ) 158