xref: /aosp_15_r20/build/bazel/rules/android/framework_resources.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 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 Worker# framework-res is a highly customized android_app module in Soong.
16*7594170eSAndroid Build Coastguard Worker# Direct translation to an android_binary rule (as is done for other
17*7594170eSAndroid Build Coastguard Worker# android_app modules) is made difficult due to Soong code name checking
18*7594170eSAndroid Build Coastguard Worker# for this specific module, e.g. to:
19*7594170eSAndroid Build Coastguard Worker# - Skip java compilation and dexing of R.java generated from resources
20*7594170eSAndroid Build Coastguard Worker# - Provide custom aapt linking flags that are exclusive to this module,
21*7594170eSAndroid Build Coastguard Worker#   some of which depend on product configuration.
22*7594170eSAndroid Build Coastguard Worker# - Provide custom output groups exclusively used by reverse dependencies
23*7594170eSAndroid Build Coastguard Worker#   of this module.
24*7594170eSAndroid Build Coastguard Worker# A separate rule, implemented below is preferred over implementing a similar
25*7594170eSAndroid Build Coastguard Worker# customization within android_binary.
26*7594170eSAndroid Build Coastguard Worker
27*7594170eSAndroid Build Coastguard Workerload(":debug_signing_key.bzl", "debug_signing_key")
28*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths")
29*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
30*7594170eSAndroid Build Coastguard Workerload("@rules_android//rules/android_binary_internal:rule.bzl", "sanitize_attrs")
31*7594170eSAndroid Build Coastguard Workerload("@rules_android//rules/android_binary_internal:attrs.bzl", _BASE_ATTRS = "ATTRS")
32*7594170eSAndroid Build Coastguard Workerload("@rules_android//rules:busybox.bzl", _busybox = "busybox")
33*7594170eSAndroid Build Coastguard Workerload("@rules_android//rules:common.bzl", "common")
34*7594170eSAndroid Build Coastguard Workerload("@rules_android//rules:utils.bzl", "get_android_toolchain")
35*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/android:manifest_fixer.bzl", "manifest_fixer")
36*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api")
37*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:config.bzl", "has_unbundled_build_apps")
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Workerdef _fix_manifest(ctx):
40*7594170eSAndroid Build Coastguard Worker    fixed_manifest = ctx.actions.declare_file(
41*7594170eSAndroid Build Coastguard Worker        paths.join(ctx.label.name, "AndroidManifest.xml"),
42*7594170eSAndroid Build Coastguard Worker    )
43*7594170eSAndroid Build Coastguard Worker    target_sdk_version = manifest_fixer.target_sdk_version_for_manifest_fixer(
44*7594170eSAndroid Build Coastguard Worker        target_sdk_version = "current",
45*7594170eSAndroid Build Coastguard Worker        platform_sdk_final = ctx.attr._platform_sdk_final[BuildSettingInfo].value,
46*7594170eSAndroid Build Coastguard Worker        has_unbundled_build_apps = has_unbundled_build_apps(ctx.attr._unbundled_build_apps),
47*7594170eSAndroid Build Coastguard Worker    )
48*7594170eSAndroid Build Coastguard Worker
49*7594170eSAndroid Build Coastguard Worker    manifest_fixer.fix(
50*7594170eSAndroid Build Coastguard Worker        ctx,
51*7594170eSAndroid Build Coastguard Worker        manifest_fixer = ctx.executable._manifest_fixer,
52*7594170eSAndroid Build Coastguard Worker        in_manifest = ctx.file.manifest,
53*7594170eSAndroid Build Coastguard Worker        out_manifest = fixed_manifest,
54*7594170eSAndroid Build Coastguard Worker        min_sdk_version = api.effective_version_string("current"),
55*7594170eSAndroid Build Coastguard Worker        target_sdk_version = target_sdk_version,
56*7594170eSAndroid Build Coastguard Worker    )
57*7594170eSAndroid Build Coastguard Worker    return fixed_manifest
58*7594170eSAndroid Build Coastguard Worker
59*7594170eSAndroid Build Coastguard Workerdef _compile_resources(ctx):
60*7594170eSAndroid Build Coastguard Worker    host_javabase = common.get_host_javabase(ctx)
61*7594170eSAndroid Build Coastguard Worker    aapt = get_android_toolchain(ctx).aapt2.files_to_run
62*7594170eSAndroid Build Coastguard Worker    busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run
63*7594170eSAndroid Build Coastguard Worker
64*7594170eSAndroid Build Coastguard Worker    # Unzip resource zips so they can be compiled by aapt and packaged with the
65*7594170eSAndroid Build Coastguard Worker    # proper directory structure at linking.
66*7594170eSAndroid Build Coastguard Worker    unzip = get_android_toolchain(ctx).unzip_tool
67*7594170eSAndroid Build Coastguard Worker
68*7594170eSAndroid Build Coastguard Worker    # TODO: b/301457407 - support declare_directory in mixed builds or don't use it here
69*7594170eSAndroid Build Coastguard Worker    resource_unzip_dir = ctx.actions.declare_directory(ctx.label.name + "_resource_zips")
70*7594170eSAndroid Build Coastguard Worker    zip_args = ctx.actions.args()
71*7594170eSAndroid Build Coastguard Worker    zip_args.add("-qq")
72*7594170eSAndroid Build Coastguard Worker    zip_args.add_all(ctx.files.resource_zips)
73*7594170eSAndroid Build Coastguard Worker    zip_args.add("-d", resource_unzip_dir.path)
74*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
75*7594170eSAndroid Build Coastguard Worker        inputs = ctx.files.resource_zips,
76*7594170eSAndroid Build Coastguard Worker        outputs = [resource_unzip_dir],
77*7594170eSAndroid Build Coastguard Worker        executable = unzip.files_to_run,
78*7594170eSAndroid Build Coastguard Worker        arguments = [zip_args],
79*7594170eSAndroid Build Coastguard Worker        toolchain = None,
80*7594170eSAndroid Build Coastguard Worker        mnemonic = "UnzipResourceZips",
81*7594170eSAndroid Build Coastguard Worker    )
82*7594170eSAndroid Build Coastguard Worker    compiled_resources = ctx.actions.declare_file(
83*7594170eSAndroid Build Coastguard Worker        paths.join(ctx.label.name + "_symbols", "symbols.zip"),
84*7594170eSAndroid Build Coastguard Worker    )
85*7594170eSAndroid Build Coastguard Worker    _busybox.compile(
86*7594170eSAndroid Build Coastguard Worker        ctx,
87*7594170eSAndroid Build Coastguard Worker        out_file = compiled_resources,
88*7594170eSAndroid Build Coastguard Worker        resource_files = ctx.files.resource_files + [resource_unzip_dir],
89*7594170eSAndroid Build Coastguard Worker        aapt = aapt,
90*7594170eSAndroid Build Coastguard Worker        busybox = busybox,
91*7594170eSAndroid Build Coastguard Worker        host_javabase = host_javabase,
92*7594170eSAndroid Build Coastguard Worker    )
93*7594170eSAndroid Build Coastguard Worker
94*7594170eSAndroid Build Coastguard Worker    # The resource processor busybox runs the same aapt2 compile command with
95*7594170eSAndroid Build Coastguard Worker    # and without --pseudo-localize, and places the output in the "default" and
96*7594170eSAndroid Build Coastguard Worker    # "generated" top-level folders of symbol.zip, respectively. This results in
97*7594170eSAndroid Build Coastguard Worker    # duplicated resources under "default" and "generated", which would normally
98*7594170eSAndroid Build Coastguard Worker    # be resolved by resource merging (when using the android rules). Resource
99*7594170eSAndroid Build Coastguard Worker    # merging, however, does not properly handle product tags, and should not be
100*7594170eSAndroid Build Coastguard Worker    # needed to build framework resources as they have no dependencies. As Soong
101*7594170eSAndroid Build Coastguard Worker    # always calls aapt2 with --pseudo-localize, this is resolved by deleting
102*7594170eSAndroid Build Coastguard Worker    # the "default" top-level directory from the symbols.zip output of the
103*7594170eSAndroid Build Coastguard Worker    # compile step.
104*7594170eSAndroid Build Coastguard Worker    merged_resources = ctx.actions.declare_file(
105*7594170eSAndroid Build Coastguard Worker        paths.join(ctx.label.name + "_symbols", "symbols_merged.zip"),
106*7594170eSAndroid Build Coastguard Worker    )
107*7594170eSAndroid Build Coastguard Worker    merge_args = ctx.actions.args()
108*7594170eSAndroid Build Coastguard Worker    merge_args.add("-i", compiled_resources)
109*7594170eSAndroid Build Coastguard Worker    merge_args.add("-o", merged_resources)
110*7594170eSAndroid Build Coastguard Worker    merge_args.add("-x", "default/**/*")
111*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
112*7594170eSAndroid Build Coastguard Worker        inputs = [compiled_resources],
113*7594170eSAndroid Build Coastguard Worker        outputs = [merged_resources],
114*7594170eSAndroid Build Coastguard Worker        executable = ctx.executable._zip2zip,
115*7594170eSAndroid Build Coastguard Worker        arguments = [merge_args],
116*7594170eSAndroid Build Coastguard Worker        toolchain = None,
117*7594170eSAndroid Build Coastguard Worker        mnemonic = "ExcludeDefaultResources",
118*7594170eSAndroid Build Coastguard Worker    )
119*7594170eSAndroid Build Coastguard Worker    return merged_resources
120*7594170eSAndroid Build Coastguard Worker
121*7594170eSAndroid Build Coastguard Workerdef _link_resources(ctx, fixed_manifest, compiled_resources):
122*7594170eSAndroid Build Coastguard Worker    aapt = get_android_toolchain(ctx).aapt2.files_to_run
123*7594170eSAndroid Build Coastguard Worker    apk = ctx.actions.declare_file(
124*7594170eSAndroid Build Coastguard Worker        paths.join(ctx.label.name + "_files", "library.apk"),
125*7594170eSAndroid Build Coastguard Worker    )
126*7594170eSAndroid Build Coastguard Worker    r_txt = ctx.actions.declare_file(
127*7594170eSAndroid Build Coastguard Worker        paths.join(ctx.label.name + "_symbols", "R.txt"),
128*7594170eSAndroid Build Coastguard Worker    )
129*7594170eSAndroid Build Coastguard Worker    proguard_cfg = ctx.actions.declare_file(
130*7594170eSAndroid Build Coastguard Worker        paths.join(ctx.label.name + "_proguard", "_%s_proguard.cfg" % ctx.label.name),
131*7594170eSAndroid Build Coastguard Worker    )
132*7594170eSAndroid Build Coastguard Worker
133*7594170eSAndroid Build Coastguard Worker    # TODO: b/301457407 - support declare_directory in mixed builds or don't use it here
134*7594170eSAndroid Build Coastguard Worker    java_srcs_dir = ctx.actions.declare_directory(ctx.label.name + "_resource_jar_sources")
135*7594170eSAndroid Build Coastguard Worker    link_args = ctx.actions.args()
136*7594170eSAndroid Build Coastguard Worker    link_args.add("link")
137*7594170eSAndroid Build Coastguard Worker
138*7594170eSAndroid Build Coastguard Worker    # outputs
139*7594170eSAndroid Build Coastguard Worker    link_args.add("-o", apk)
140*7594170eSAndroid Build Coastguard Worker    link_args.add("--java", java_srcs_dir.path)
141*7594170eSAndroid Build Coastguard Worker    link_args.add("--proguard", proguard_cfg)
142*7594170eSAndroid Build Coastguard Worker    link_args.add("--output-text-symbols", r_txt)
143*7594170eSAndroid Build Coastguard Worker
144*7594170eSAndroid Build Coastguard Worker    # args from aaptflags of the framework-res module definition
145*7594170eSAndroid Build Coastguard Worker    link_args.add("--private-symbols", "com.android.internal")
146*7594170eSAndroid Build Coastguard Worker    link_args.add("--no-auto-version")
147*7594170eSAndroid Build Coastguard Worker    link_args.add("--auto-add-overlay")
148*7594170eSAndroid Build Coastguard Worker    link_args.add("--enable-sparse-encoding")
149*7594170eSAndroid Build Coastguard Worker
150*7594170eSAndroid Build Coastguard Worker    # flags from Soong's aapt2Flags function in build/soong/java/aar.go
151*7594170eSAndroid Build Coastguard Worker    link_args.add("--no-static-lib-packages")
152*7594170eSAndroid Build Coastguard Worker    link_args.add("--min-sdk-version", api.effective_version_string("current"))
153*7594170eSAndroid Build Coastguard Worker    link_args.add("--target-sdk-version", api.effective_version_string("current"))
154*7594170eSAndroid Build Coastguard Worker    link_args.add("--version-code", ctx.attr._platform_sdk_version[BuildSettingInfo].value)
155*7594170eSAndroid Build Coastguard Worker
156*7594170eSAndroid Build Coastguard Worker    # Some builds set AppsDefaultVersionName() to include the build number ("O-123456").  aapt2 copies the
157*7594170eSAndroid Build Coastguard Worker    # version name of framework-res into app manifests as compileSdkVersionCodename, which confuses things
158*7594170eSAndroid Build Coastguard Worker    # if it contains the build number.  Use the PlatformVersionName instead.
159*7594170eSAndroid Build Coastguard Worker    # Unique to framework-res, see https://cs.android.com/android/platform/superproject/main/+/main:build/soong/java/aar.go;l=271-275;drc=ee51bd6588ceb122dbf5f6d12bc398a1ce7f37ed.
160*7594170eSAndroid Build Coastguard Worker    link_args.add("--version-name", ctx.attr._platform_version_name[BuildSettingInfo].value)
161*7594170eSAndroid Build Coastguard Worker
162*7594170eSAndroid Build Coastguard Worker    # extra link flags from Soong's aaptBuildActions in build/soong/java/app.go
163*7594170eSAndroid Build Coastguard Worker    link_args.add("--product", ctx.attr._aapt_characteristics[BuildSettingInfo].value)
164*7594170eSAndroid Build Coastguard Worker    for config in ctx.attr._aapt_config[BuildSettingInfo].value:
165*7594170eSAndroid Build Coastguard Worker        # TODO: b/301593550 - commas can't be escaped in a string-list passed in a platform mapping,
166*7594170eSAndroid Build Coastguard Worker        # so commas are switched for ":" in soong injection, and back-substituted into commas
167*7594170eSAndroid Build Coastguard Worker        # wherever the AAPTCharacteristics product config variable is used.
168*7594170eSAndroid Build Coastguard Worker        link_args.add("-c", config.replace(":", ","))
169*7594170eSAndroid Build Coastguard Worker    if ctx.attr._aapt_preferred_config[BuildSettingInfo].value:
170*7594170eSAndroid Build Coastguard Worker        link_args.add("--preferred-density", ctx.attr._aapt_preferred_config[BuildSettingInfo].value)
171*7594170eSAndroid Build Coastguard Worker
172*7594170eSAndroid Build Coastguard Worker    # inputs
173*7594170eSAndroid Build Coastguard Worker    link_args.add("--manifest", fixed_manifest)
174*7594170eSAndroid Build Coastguard Worker    link_args.add("-A", paths.join(paths.dirname(ctx.build_file_path), ctx.attr.assets_dir))
175*7594170eSAndroid Build Coastguard Worker    link_args.add(compiled_resources)
176*7594170eSAndroid Build Coastguard Worker
177*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
178*7594170eSAndroid Build Coastguard Worker        inputs = [compiled_resources, fixed_manifest] + ctx.files.assets,
179*7594170eSAndroid Build Coastguard Worker        outputs = [apk, java_srcs_dir, proguard_cfg, r_txt],
180*7594170eSAndroid Build Coastguard Worker        executable = aapt,
181*7594170eSAndroid Build Coastguard Worker        arguments = [link_args],
182*7594170eSAndroid Build Coastguard Worker        toolchain = None,
183*7594170eSAndroid Build Coastguard Worker        mnemonic = "AaptLinkFrameworkRes",
184*7594170eSAndroid Build Coastguard Worker        progress_message = "Linking Framework Resources with Aapt...",
185*7594170eSAndroid Build Coastguard Worker    )
186*7594170eSAndroid Build Coastguard Worker    return apk, r_txt, proguard_cfg, java_srcs_dir
187*7594170eSAndroid Build Coastguard Worker
188*7594170eSAndroid Build Coastguard Workerdef _package_resource_source_jar(ctx, java_srcs_dir):
189*7594170eSAndroid Build Coastguard Worker    r_java = ctx.actions.declare_file(
190*7594170eSAndroid Build Coastguard Worker        ctx.label.name + ".srcjar",
191*7594170eSAndroid Build Coastguard Worker    )
192*7594170eSAndroid Build Coastguard Worker    srcjar_args = ctx.actions.args()
193*7594170eSAndroid Build Coastguard Worker    srcjar_args.add("-write_if_changed")
194*7594170eSAndroid Build Coastguard Worker    srcjar_args.add("-jar")
195*7594170eSAndroid Build Coastguard Worker    srcjar_args.add("-o", r_java)
196*7594170eSAndroid Build Coastguard Worker    srcjar_args.add("-C", java_srcs_dir.path)
197*7594170eSAndroid Build Coastguard Worker    srcjar_args.add("-D", java_srcs_dir.path)
198*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
199*7594170eSAndroid Build Coastguard Worker        inputs = [java_srcs_dir],
200*7594170eSAndroid Build Coastguard Worker        outputs = [r_java],
201*7594170eSAndroid Build Coastguard Worker        executable = ctx.executable._soong_zip,
202*7594170eSAndroid Build Coastguard Worker        arguments = [srcjar_args],
203*7594170eSAndroid Build Coastguard Worker        toolchain = None,
204*7594170eSAndroid Build Coastguard Worker        mnemonic = "FrameworkResSrcJar",
205*7594170eSAndroid Build Coastguard Worker    )
206*7594170eSAndroid Build Coastguard Worker    return r_java
207*7594170eSAndroid Build Coastguard Worker
208*7594170eSAndroid Build Coastguard Workerdef _generate_binary_r(ctx, r_txt, fixed_manifest):
209*7594170eSAndroid Build Coastguard Worker    host_javabase = common.get_host_javabase(ctx)
210*7594170eSAndroid Build Coastguard Worker    busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run
211*7594170eSAndroid Build Coastguard Worker    out_class_jar = ctx.actions.declare_file(
212*7594170eSAndroid Build Coastguard Worker        ctx.label.name + "_resources.jar",
213*7594170eSAndroid Build Coastguard Worker    )
214*7594170eSAndroid Build Coastguard Worker
215*7594170eSAndroid Build Coastguard Worker    _busybox.generate_binary_r(
216*7594170eSAndroid Build Coastguard Worker        ctx,
217*7594170eSAndroid Build Coastguard Worker        out_class_jar = out_class_jar,
218*7594170eSAndroid Build Coastguard Worker        r_txt = r_txt,
219*7594170eSAndroid Build Coastguard Worker        manifest = fixed_manifest,
220*7594170eSAndroid Build Coastguard Worker        busybox = busybox,
221*7594170eSAndroid Build Coastguard Worker        host_javabase = host_javabase,
222*7594170eSAndroid Build Coastguard Worker    )
223*7594170eSAndroid Build Coastguard Worker    return out_class_jar
224*7594170eSAndroid Build Coastguard Worker
225*7594170eSAndroid Build Coastguard Workerdef _impl(ctx):
226*7594170eSAndroid Build Coastguard Worker    fixed_manifest = _fix_manifest(ctx)
227*7594170eSAndroid Build Coastguard Worker
228*7594170eSAndroid Build Coastguard Worker    compiled_resources = _compile_resources(ctx)
229*7594170eSAndroid Build Coastguard Worker
230*7594170eSAndroid Build Coastguard Worker    apk, r_txt, proguard_cfg, java_srcs_dir = _link_resources(ctx, fixed_manifest, compiled_resources)
231*7594170eSAndroid Build Coastguard Worker
232*7594170eSAndroid Build Coastguard Worker    r_java = _package_resource_source_jar(ctx, java_srcs_dir)
233*7594170eSAndroid Build Coastguard Worker
234*7594170eSAndroid Build Coastguard Worker    out_class_jar = _generate_binary_r(ctx, r_txt, fixed_manifest)
235*7594170eSAndroid Build Coastguard Worker
236*7594170eSAndroid Build Coastguard Worker    # Unused but required to satisfy the native android_binary rule consuming this rule's JavaInfo provider.
237*7594170eSAndroid Build Coastguard Worker    fake_proto_manifest = ctx.actions.declare_file("fake/proto_manifest.pb")
238*7594170eSAndroid Build Coastguard Worker    ctx.actions.run_shell(
239*7594170eSAndroid Build Coastguard Worker        inputs = [],
240*7594170eSAndroid Build Coastguard Worker        outputs = [fake_proto_manifest],
241*7594170eSAndroid Build Coastguard Worker        command = "touch {}".format(fake_proto_manifest.path),
242*7594170eSAndroid Build Coastguard Worker        tools = [],
243*7594170eSAndroid Build Coastguard Worker        mnemonic = "TouchFakeProtoManifest",
244*7594170eSAndroid Build Coastguard Worker    )
245*7594170eSAndroid Build Coastguard Worker
246*7594170eSAndroid Build Coastguard Worker    return [
247*7594170eSAndroid Build Coastguard Worker        AndroidApplicationResourceInfo(
248*7594170eSAndroid Build Coastguard Worker            resource_apk = apk,
249*7594170eSAndroid Build Coastguard Worker            resource_java_src_jar = r_java,
250*7594170eSAndroid Build Coastguard Worker            resource_java_class_jar = out_class_jar,
251*7594170eSAndroid Build Coastguard Worker            manifest = fixed_manifest,
252*7594170eSAndroid Build Coastguard Worker            resource_proguard_config = proguard_cfg,
253*7594170eSAndroid Build Coastguard Worker            main_dex_proguard_config = None,
254*7594170eSAndroid Build Coastguard Worker            r_txt = r_txt,
255*7594170eSAndroid Build Coastguard Worker            resources_zip = None,
256*7594170eSAndroid Build Coastguard Worker            databinding_info = None,
257*7594170eSAndroid Build Coastguard Worker            should_compile_java_srcs = False,
258*7594170eSAndroid Build Coastguard Worker        ),
259*7594170eSAndroid Build Coastguard Worker        JavaInfo(
260*7594170eSAndroid Build Coastguard Worker            output_jar = out_class_jar,
261*7594170eSAndroid Build Coastguard Worker            compile_jar = out_class_jar,
262*7594170eSAndroid Build Coastguard Worker            source_jar = r_java,
263*7594170eSAndroid Build Coastguard Worker            manifest_proto = fake_proto_manifest,
264*7594170eSAndroid Build Coastguard Worker        ),
265*7594170eSAndroid Build Coastguard Worker        DataBindingV2Info(
266*7594170eSAndroid Build Coastguard Worker            databinding_v2_providers_in_deps = [],
267*7594170eSAndroid Build Coastguard Worker            databinding_v2_providers_in_exports = [],
268*7594170eSAndroid Build Coastguard Worker        ),
269*7594170eSAndroid Build Coastguard Worker        DefaultInfo(files = depset([apk])),
270*7594170eSAndroid Build Coastguard Worker        OutputGroupInfo(
271*7594170eSAndroid Build Coastguard Worker            srcjar = depset([r_java]),
272*7594170eSAndroid Build Coastguard Worker            classjar = depset([out_class_jar]),
273*7594170eSAndroid Build Coastguard Worker            resource_apk = depset([apk]),
274*7594170eSAndroid Build Coastguard Worker        ),
275*7594170eSAndroid Build Coastguard Worker        AndroidDexInfo(
276*7594170eSAndroid Build Coastguard Worker            # Though there is no dexing happening in this rule, this class jar is
277*7594170eSAndroid Build Coastguard Worker            # forwarded to the native android_binary rule because it outputs a pre-dex
278*7594170eSAndroid Build Coastguard Worker            # deploy jar in a provider.
279*7594170eSAndroid Build Coastguard Worker            deploy_jar = out_class_jar,
280*7594170eSAndroid Build Coastguard Worker            final_classes_dex_zip = None,
281*7594170eSAndroid Build Coastguard Worker            java_resource_jar = None,
282*7594170eSAndroid Build Coastguard Worker        ),
283*7594170eSAndroid Build Coastguard Worker    ]
284*7594170eSAndroid Build Coastguard Worker
285*7594170eSAndroid Build Coastguard Worker_framework_resources_internal = rule(
286*7594170eSAndroid Build Coastguard Worker    attrs = {
287*7594170eSAndroid Build Coastguard Worker        "assets": _BASE_ATTRS["assets"],
288*7594170eSAndroid Build Coastguard Worker        "assets_dir": _BASE_ATTRS["assets_dir"],
289*7594170eSAndroid Build Coastguard Worker        "manifest": _BASE_ATTRS["manifest"],
290*7594170eSAndroid Build Coastguard Worker        "resource_files": _BASE_ATTRS["resource_files"],
291*7594170eSAndroid Build Coastguard Worker        "resource_zips": attr.label_list(
292*7594170eSAndroid Build Coastguard Worker            allow_files = True,
293*7594170eSAndroid Build Coastguard Worker            doc = "list of zip files containing Android resources.",
294*7594170eSAndroid Build Coastguard Worker        ),
295*7594170eSAndroid Build Coastguard Worker        "_host_javabase": _BASE_ATTRS["_host_javabase"],
296*7594170eSAndroid Build Coastguard Worker        "_soong_zip": attr.label(allow_single_file = True, cfg = "exec", executable = True, default = "//build/soong/zip/cmd:soong_zip"),
297*7594170eSAndroid Build Coastguard Worker        "_zip2zip": attr.label(allow_single_file = True, cfg = "exec", executable = True, default = "//build/soong/cmd/zip2zip:zip2zip"),
298*7594170eSAndroid Build Coastguard Worker        "_manifest_fixer": attr.label(cfg = "exec", executable = True, default = "//build/soong/scripts:manifest_fixer"),
299*7594170eSAndroid Build Coastguard Worker        "_platform_sdk_version": attr.label(
300*7594170eSAndroid Build Coastguard Worker            default = Label("//build/bazel/product_config:platform_sdk_version"),
301*7594170eSAndroid Build Coastguard Worker        ),
302*7594170eSAndroid Build Coastguard Worker        "_platform_version_name": attr.label(
303*7594170eSAndroid Build Coastguard Worker            default = Label("//build/bazel/product_config:platform_version_name"),
304*7594170eSAndroid Build Coastguard Worker        ),
305*7594170eSAndroid Build Coastguard Worker        "_aapt_characteristics": attr.label(
306*7594170eSAndroid Build Coastguard Worker            default = Label("//build/bazel/product_config:aapt_characteristics"),
307*7594170eSAndroid Build Coastguard Worker        ),
308*7594170eSAndroid Build Coastguard Worker        "_aapt_config": attr.label(
309*7594170eSAndroid Build Coastguard Worker            default = Label("//build/bazel/product_config:aapt_config"),
310*7594170eSAndroid Build Coastguard Worker        ),
311*7594170eSAndroid Build Coastguard Worker        "_aapt_preferred_config": attr.label(
312*7594170eSAndroid Build Coastguard Worker            default = Label("//build/bazel/product_config:aapt_preferred_config"),
313*7594170eSAndroid Build Coastguard Worker        ),
314*7594170eSAndroid Build Coastguard Worker        "_platform_sdk_final": attr.label(
315*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/product_config:platform_sdk_final",
316*7594170eSAndroid Build Coastguard Worker            doc = "PlatformSdkFinal product variable",
317*7594170eSAndroid Build Coastguard Worker        ),
318*7594170eSAndroid Build Coastguard Worker        "_unbundled_build_apps": attr.label(
319*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/product_config:unbundled_build_apps",
320*7594170eSAndroid Build Coastguard Worker            doc = "UnbundledBuildApps product variable",
321*7594170eSAndroid Build Coastguard Worker        ),
322*7594170eSAndroid Build Coastguard Worker    },
323*7594170eSAndroid Build Coastguard Worker    implementation = _impl,
324*7594170eSAndroid Build Coastguard Worker    provides = [AndroidApplicationResourceInfo, OutputGroupInfo],
325*7594170eSAndroid Build Coastguard Worker    toolchains = [
326*7594170eSAndroid Build Coastguard Worker        "@rules_android//toolchains/android:toolchain_type",
327*7594170eSAndroid Build Coastguard Worker    ],
328*7594170eSAndroid Build Coastguard Worker    fragments = ["android"],
329*7594170eSAndroid Build Coastguard Worker)
330*7594170eSAndroid Build Coastguard Worker
331*7594170eSAndroid Build Coastguard Workerdef framework_resources(
332*7594170eSAndroid Build Coastguard Worker        name,
333*7594170eSAndroid Build Coastguard Worker        certificate = None,
334*7594170eSAndroid Build Coastguard Worker        certificate_name = None,
335*7594170eSAndroid Build Coastguard Worker        tags = [],
336*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [],
337*7594170eSAndroid Build Coastguard Worker        visibility = None,
338*7594170eSAndroid Build Coastguard Worker        manifest = None,
339*7594170eSAndroid Build Coastguard Worker        **kwargs):
340*7594170eSAndroid Build Coastguard Worker    framework_resources_internal_name = ":" + name + common.PACKAGED_RESOURCES_SUFFIX
341*7594170eSAndroid Build Coastguard Worker    _framework_resources_internal(
342*7594170eSAndroid Build Coastguard Worker        name = framework_resources_internal_name[1:],
343*7594170eSAndroid Build Coastguard Worker        tags = tags + ["manual"],
344*7594170eSAndroid Build Coastguard Worker        target_compatible_with = target_compatible_with,
345*7594170eSAndroid Build Coastguard Worker        visibility = ["//visibility:private"],
346*7594170eSAndroid Build Coastguard Worker        manifest = manifest,
347*7594170eSAndroid Build Coastguard Worker        **kwargs
348*7594170eSAndroid Build Coastguard Worker    )
349*7594170eSAndroid Build Coastguard Worker
350*7594170eSAndroid Build Coastguard Worker    # Rely on native android_binary until apk packaging and signing is starlarkified
351*7594170eSAndroid Build Coastguard Worker    # TODO: b/301986521 - use starlark version of this logic once implemented.
352*7594170eSAndroid Build Coastguard Worker    native.android_binary(
353*7594170eSAndroid Build Coastguard Worker        name = name,
354*7594170eSAndroid Build Coastguard Worker        application_resources = framework_resources_internal_name,
355*7594170eSAndroid Build Coastguard Worker        debug_signing_keys = debug_signing_key(name, certificate, certificate_name),
356*7594170eSAndroid Build Coastguard Worker        target_compatible_with = target_compatible_with,
357*7594170eSAndroid Build Coastguard Worker        visibility = visibility,
358*7594170eSAndroid Build Coastguard Worker        tags = tags,
359*7594170eSAndroid Build Coastguard Worker        manifest = manifest,
360*7594170eSAndroid Build Coastguard Worker    )
361*7594170eSAndroid Build Coastguard Worker
362*7594170eSAndroid Build Coastguard Worker    native.filegroup(
363*7594170eSAndroid Build Coastguard Worker        name = name + ".aapt.srcjar",
364*7594170eSAndroid Build Coastguard Worker        srcs = [name],
365*7594170eSAndroid Build Coastguard Worker        output_group = "srcjar",
366*7594170eSAndroid Build Coastguard Worker        visibility = visibility,
367*7594170eSAndroid Build Coastguard Worker        tags = tags,
368*7594170eSAndroid Build Coastguard Worker    )
369*7594170eSAndroid Build Coastguard Worker
370*7594170eSAndroid Build Coastguard Worker    native.filegroup(
371*7594170eSAndroid Build Coastguard Worker        name = name + ".aapt.jar",
372*7594170eSAndroid Build Coastguard Worker        srcs = [name],
373*7594170eSAndroid Build Coastguard Worker        output_group = "classjar",
374*7594170eSAndroid Build Coastguard Worker        visibility = visibility,
375*7594170eSAndroid Build Coastguard Worker        tags = tags,
376*7594170eSAndroid Build Coastguard Worker    )
377*7594170eSAndroid Build Coastguard Worker
378*7594170eSAndroid Build Coastguard Worker    native.filegroup(
379*7594170eSAndroid Build Coastguard Worker        name = name + ".export-package.apk",
380*7594170eSAndroid Build Coastguard Worker        srcs = [name],
381*7594170eSAndroid Build Coastguard Worker        output_group = "resource_apk",
382*7594170eSAndroid Build Coastguard Worker        visibility = visibility,
383*7594170eSAndroid Build Coastguard Worker        tags = tags,
384*7594170eSAndroid Build Coastguard Worker    )
385