xref: /aosp_15_r20/build/bazel/rules/apex/bundle.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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