xref: /aosp_15_r20/external/bazelbuild-rules_android/rules/resources.bzl (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
1*9e965d6fSRomain Jobredeaux# Copyright 2018 The Bazel Authors. All rights reserved.
2*9e965d6fSRomain Jobredeaux#
3*9e965d6fSRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License");
4*9e965d6fSRomain Jobredeaux# you may not use this file except in compliance with the License.
5*9e965d6fSRomain Jobredeaux# You may obtain a copy of the License at
6*9e965d6fSRomain Jobredeaux#
7*9e965d6fSRomain Jobredeaux#    http://www.apache.org/licenses/LICENSE-2.0
8*9e965d6fSRomain Jobredeaux#
9*9e965d6fSRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software
10*9e965d6fSRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS,
11*9e965d6fSRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e965d6fSRomain Jobredeaux# See the License for the specific language governing permissions and
13*9e965d6fSRomain Jobredeaux# limitations under the License.
14*9e965d6fSRomain Jobredeaux
15*9e965d6fSRomain Jobredeaux"""Bazel Android Resources."""
16*9e965d6fSRomain Jobredeaux
17*9e965d6fSRomain Jobredeauxload("//rules:acls.bzl", "acls")
18*9e965d6fSRomain Jobredeauxload(":attrs.bzl", _attrs = "attrs")
19*9e965d6fSRomain Jobredeauxload(":busybox.bzl", _busybox = "busybox")
20*9e965d6fSRomain Jobredeauxload(":common.bzl", _common = "common")
21*9e965d6fSRomain Jobredeauxload(":java.bzl", _java = "java")
22*9e965d6fSRomain Jobredeauxload(":path.bzl", _path = "path")
23*9e965d6fSRomain Jobredeauxload(
24*9e965d6fSRomain Jobredeaux    ":providers.bzl",
25*9e965d6fSRomain Jobredeaux    "ResourcesNodeInfo",
26*9e965d6fSRomain Jobredeaux    "StarlarkAndroidResourcesInfo",
27*9e965d6fSRomain Jobredeaux)
28*9e965d6fSRomain Jobredeauxload(
29*9e965d6fSRomain Jobredeaux    ":utils.bzl",
30*9e965d6fSRomain Jobredeaux    "utils",
31*9e965d6fSRomain Jobredeaux    _compilation_mode = "compilation_mode",
32*9e965d6fSRomain Jobredeaux    _log = "log",
33*9e965d6fSRomain Jobredeaux)
34*9e965d6fSRomain Jobredeaux
35*9e965d6fSRomain Jobredeaux_RESOURCE_FOLDER_TYPES = [
36*9e965d6fSRomain Jobredeaux    "anim",
37*9e965d6fSRomain Jobredeaux    "animator",
38*9e965d6fSRomain Jobredeaux    "color",
39*9e965d6fSRomain Jobredeaux    "drawable",
40*9e965d6fSRomain Jobredeaux    "font",
41*9e965d6fSRomain Jobredeaux    "interpolator",
42*9e965d6fSRomain Jobredeaux    "layout",
43*9e965d6fSRomain Jobredeaux    "menu",
44*9e965d6fSRomain Jobredeaux    "mipmap",
45*9e965d6fSRomain Jobredeaux    "navigation",
46*9e965d6fSRomain Jobredeaux    "values",
47*9e965d6fSRomain Jobredeaux    "xml",
48*9e965d6fSRomain Jobredeaux    "raw",
49*9e965d6fSRomain Jobredeaux    "transition",
50*9e965d6fSRomain Jobredeaux]
51*9e965d6fSRomain Jobredeaux
52*9e965d6fSRomain Jobredeaux_RESOURCE_QUALIFIER_SEP = "-"
53*9e965d6fSRomain Jobredeaux
54*9e965d6fSRomain Jobredeaux_MANIFEST_MISSING_ERROR = (
55*9e965d6fSRomain Jobredeaux    "In target %s, manifest attribute is required when resource_files, " +
56*9e965d6fSRomain Jobredeaux    "assets, or exports_manifest are specified."
57*9e965d6fSRomain Jobredeaux)
58*9e965d6fSRomain Jobredeaux
59*9e965d6fSRomain Jobredeaux_ASSET_DEFINITION_ERROR = (
60*9e965d6fSRomain Jobredeaux    "In target %s, the assets and assets_dir attributes should be either " +
61*9e965d6fSRomain Jobredeaux    "both empty or non-empty."
62*9e965d6fSRomain Jobredeaux)
63*9e965d6fSRomain Jobredeaux
64*9e965d6fSRomain Jobredeaux_INCORRECT_RESOURCE_LAYOUT_ERROR = (
65*9e965d6fSRomain Jobredeaux    "'%s' is not in the expected resource directory structure of " +
66*9e965d6fSRomain Jobredeaux    "<resource directory>/{%s}/<file>" % (",").join(_RESOURCE_FOLDER_TYPES)
67*9e965d6fSRomain Jobredeaux)
68*9e965d6fSRomain Jobredeaux
69*9e965d6fSRomain Jobredeaux# Keys for manifest_values
70*9e965d6fSRomain Jobredeaux_VERSION_NAME = "versionName"
71*9e965d6fSRomain Jobredeaux_VERSION_CODE = "versionCode"
72*9e965d6fSRomain Jobredeaux_MIN_SDK_VERSION = "minSdkVersion"
73*9e965d6fSRomain Jobredeaux
74*9e965d6fSRomain Jobredeaux# Resources context attributes.
75*9e965d6fSRomain Jobredeaux_ASSETS_PROVIDER = "assets_provider"
76*9e965d6fSRomain Jobredeaux_DATA_BINDING_LAYOUT_INFO = "data_binding_layout_info"
77*9e965d6fSRomain Jobredeaux_DEFINES_RESOURCES = "defines_resources"
78*9e965d6fSRomain Jobredeaux_DIRECT_ANDROID_RESOURCES = "direct_android_resources"
79*9e965d6fSRomain Jobredeaux_MAIN_DEX_PROGUARD_CONFIG = "main_dex_proguard_config"
80*9e965d6fSRomain Jobredeaux_MERGED_MANIFEST = "merged_manifest"
81*9e965d6fSRomain Jobredeaux_PROVIDERS = "providers"
82*9e965d6fSRomain Jobredeaux_R_JAVA = "r_java"
83*9e965d6fSRomain Jobredeaux_RESOURCES_APK = "resources_apk"
84*9e965d6fSRomain Jobredeaux_VALIDATION_RESULTS = "validation_results"
85*9e965d6fSRomain Jobredeaux_VALIDATION_OUTPUTS = "validation_outputs"
86*9e965d6fSRomain Jobredeaux_RESOURCES_PROVIDER = "resources_provider"
87*9e965d6fSRomain Jobredeaux_STARLARK_PROCESSED_MANIFEST = "starlark_processed_manifest"
88*9e965d6fSRomain Jobredeaux_STARLARK_R_TXT = "starlark_r_txt"
89*9e965d6fSRomain Jobredeaux_STARLARK_PROCESSED_RESOURCES = "starlark_processed_resources"
90*9e965d6fSRomain Jobredeaux
91*9e965d6fSRomain Jobredeaux_ResourcesProcessContextInfo = provider(
92*9e965d6fSRomain Jobredeaux    "Resources context object",
93*9e965d6fSRomain Jobredeaux    fields = {
94*9e965d6fSRomain Jobredeaux        _DEFINES_RESOURCES: "If local resources were defined.",
95*9e965d6fSRomain Jobredeaux        _DIRECT_ANDROID_RESOURCES: "Direct android resources.",
96*9e965d6fSRomain Jobredeaux        _MERGED_MANIFEST: "Merged manifest.",
97*9e965d6fSRomain Jobredeaux        _PROVIDERS: "The list of all providers to propagate.",
98*9e965d6fSRomain Jobredeaux        _R_JAVA: "JavaInfo for R.jar.",
99*9e965d6fSRomain Jobredeaux        _DATA_BINDING_LAYOUT_INFO: "Databinding layout info file.",
100*9e965d6fSRomain Jobredeaux        _RESOURCES_APK: "ResourcesApk.",
101*9e965d6fSRomain Jobredeaux        _VALIDATION_RESULTS: "List of validation results.",
102*9e965d6fSRomain Jobredeaux        _VALIDATION_OUTPUTS: "List of outputs given to OutputGroupInfo _validation group",
103*9e965d6fSRomain Jobredeaux
104*9e965d6fSRomain Jobredeaux        # TODO(djwhang): The android_library aar generation requires direct
105*9e965d6fSRomain Jobredeaux        # access to providers. Remove once aar is its own rule.
106*9e965d6fSRomain Jobredeaux        _ASSETS_PROVIDER: "AndroidAssetsInfo provider.",
107*9e965d6fSRomain Jobredeaux        _RESOURCES_PROVIDER: "AndroidResourcesInfo provider.",
108*9e965d6fSRomain Jobredeaux        _STARLARK_PROCESSED_MANIFEST: "The processed manifest from the starlark resource processing pipeline.",
109*9e965d6fSRomain Jobredeaux        _STARLARK_R_TXT: "The R.txt from the starlark resource processing pipeline.",
110*9e965d6fSRomain Jobredeaux        _STARLARK_PROCESSED_RESOURCES: "The processed resources from the starlark processing pipeline.",
111*9e965d6fSRomain Jobredeaux    },
112*9e965d6fSRomain Jobredeaux)
113*9e965d6fSRomain Jobredeaux
114*9e965d6fSRomain Jobredeaux# Packaged resources context attributes.
115*9e965d6fSRomain Jobredeaux_PACKAGED_FINAL_MANIFEST = "processed_manifest"
116*9e965d6fSRomain Jobredeaux_PACKAGED_RESOURCE_APK = "resources_apk"
117*9e965d6fSRomain Jobredeaux_PACKAGED_CLASS_JAR = "class_jar"
118*9e965d6fSRomain Jobredeaux_PACKAGED_VALIDATION_RESULT = "validation_result"
119*9e965d6fSRomain Jobredeaux_PACKAGED_R_TXT = "r_txt"
120*9e965d6fSRomain Jobredeaux_RESOURCE_MINSDK_PROGUARD_CONFIG = "resource_minsdk_proguard_config"
121*9e965d6fSRomain Jobredeaux_RESOURCE_PROGUARD_CONFIG = "resource_proguard_config"
122*9e965d6fSRomain Jobredeaux_ANDROID_APPLICATION_RESOURCE = "android_application_resource"
123*9e965d6fSRomain Jobredeaux
124*9e965d6fSRomain Jobredeaux_ResourcesPackageContextInfo = provider(
125*9e965d6fSRomain Jobredeaux    "Packaged resources context object",
126*9e965d6fSRomain Jobredeaux    fields = {
127*9e965d6fSRomain Jobredeaux        _PACKAGED_FINAL_MANIFEST: "Final processed manifest.",
128*9e965d6fSRomain Jobredeaux        _PACKAGED_RESOURCE_APK: "ResourceApk.",
129*9e965d6fSRomain Jobredeaux        _PACKAGED_CLASS_JAR: "R class jar.",
130*9e965d6fSRomain Jobredeaux        _PACKAGED_VALIDATION_RESULT: "Validation result.",
131*9e965d6fSRomain Jobredeaux        _PACKAGED_R_TXT: "R text file",
132*9e965d6fSRomain Jobredeaux        _R_JAVA: "JavaInfo for R.jar",
133*9e965d6fSRomain Jobredeaux        _DATA_BINDING_LAYOUT_INFO: "Databinding layout info file.",
134*9e965d6fSRomain Jobredeaux        _RESOURCE_MINSDK_PROGUARD_CONFIG: "Resource minSdkVersion proguard config",
135*9e965d6fSRomain Jobredeaux        _RESOURCE_PROGUARD_CONFIG: "Resource proguard config",
136*9e965d6fSRomain Jobredeaux        _MAIN_DEX_PROGUARD_CONFIG: "Main dex proguard config",
137*9e965d6fSRomain Jobredeaux        _PROVIDERS: "The list of all providers to propagate.",
138*9e965d6fSRomain Jobredeaux        _ANDROID_APPLICATION_RESOURCE: "The AndroidApplicationResourceInfo provider.",
139*9e965d6fSRomain Jobredeaux    },
140*9e965d6fSRomain Jobredeaux)
141*9e965d6fSRomain Jobredeaux
142*9e965d6fSRomain Jobredeaux# Manifest context attributes
143*9e965d6fSRomain Jobredeaux_PROCESSED_MANIFEST = "processed_manifest"
144*9e965d6fSRomain Jobredeaux_PROCESSED_MANIFEST_VALUES = "processed_manifest_values"
145*9e965d6fSRomain Jobredeaux
146*9e965d6fSRomain Jobredeaux_ManifestContextInfo = provider(
147*9e965d6fSRomain Jobredeaux    "Manifest context object",
148*9e965d6fSRomain Jobredeaux    fields = {
149*9e965d6fSRomain Jobredeaux        _PROCESSED_MANIFEST: "The manifest after the min SDK has been changed as necessary.",
150*9e965d6fSRomain Jobredeaux        _PROCESSED_MANIFEST_VALUES: "Optional, dict of manifest values that have been processed.",
151*9e965d6fSRomain Jobredeaux    },
152*9e965d6fSRomain Jobredeaux)
153*9e965d6fSRomain Jobredeaux
154*9e965d6fSRomain Jobredeaux_ManifestValidationContextInfo = provider(
155*9e965d6fSRomain Jobredeaux    "Manifest validation context object",
156*9e965d6fSRomain Jobredeaux    fields = {
157*9e965d6fSRomain Jobredeaux        _VALIDATION_OUTPUTS: "List of outputs given to OutputGroupInfo _validation group.",
158*9e965d6fSRomain Jobredeaux    },
159*9e965d6fSRomain Jobredeaux)
160*9e965d6fSRomain Jobredeaux
161*9e965d6fSRomain Jobredeaux_SHRUNK_RESOURCE_APK = "resources_apk"
162*9e965d6fSRomain Jobredeaux_SHRUNK_RESOURCE_ZIP = "resources_zip"
163*9e965d6fSRomain Jobredeaux_RESOURCE_SHRINKER_LOG = "shrinker_log"
164*9e965d6fSRomain Jobredeaux_RESOURCE_OPTIMIZATION_CONFIG = "optimization_config"
165*9e965d6fSRomain Jobredeaux
166*9e965d6fSRomain Jobredeaux_ResourcesShrinkContextInfo = provider(
167*9e965d6fSRomain Jobredeaux    "Shrunk resources context object",
168*9e965d6fSRomain Jobredeaux    fields = {
169*9e965d6fSRomain Jobredeaux        _SHRUNK_RESOURCE_APK: "Shrunk resource apk.",
170*9e965d6fSRomain Jobredeaux        _SHRUNK_RESOURCE_ZIP: "Shrunk resource zip.",
171*9e965d6fSRomain Jobredeaux        _RESOURCE_SHRINKER_LOG: "Shrinker log.",
172*9e965d6fSRomain Jobredeaux        _RESOURCE_OPTIMIZATION_CONFIG: "Resource optimization config.",
173*9e965d6fSRomain Jobredeaux    },
174*9e965d6fSRomain Jobredeaux)
175*9e965d6fSRomain Jobredeaux
176*9e965d6fSRomain Jobredeaux_RESOURCE_PATH_SHORTENING_MAP = "path_shortening_map"
177*9e965d6fSRomain Jobredeaux_OPTIMIZED_RESOURCE_APK = "resources_apk"
178*9e965d6fSRomain Jobredeaux
179*9e965d6fSRomain Jobredeaux_ResourcesOptimizeContextInfo = provider(
180*9e965d6fSRomain Jobredeaux    "Optimized resources context object",
181*9e965d6fSRomain Jobredeaux    fields = {
182*9e965d6fSRomain Jobredeaux        _OPTIMIZED_RESOURCE_APK: "Optimized resource apk",
183*9e965d6fSRomain Jobredeaux        _RESOURCE_PATH_SHORTENING_MAP: "Path shortening map.",
184*9e965d6fSRomain Jobredeaux    },
185*9e965d6fSRomain Jobredeaux)
186*9e965d6fSRomain Jobredeaux
187*9e965d6fSRomain Jobredeaux# Feature which would enable AAPT2's resource name obfuscation optimization for android_binary
188*9e965d6fSRomain Jobredeaux# rules with resource shrinking and ProGuard enabled.
189*9e965d6fSRomain Jobredeaux_FEATURE_RESOURCE_NAME_OBFUSCATION = "resource_name_obfuscation"
190*9e965d6fSRomain Jobredeaux
191*9e965d6fSRomain Jobredeauxdef _generate_dummy_manifest(
192*9e965d6fSRomain Jobredeaux        ctx,
193*9e965d6fSRomain Jobredeaux        out_manifest = None,
194*9e965d6fSRomain Jobredeaux        java_package = None,
195*9e965d6fSRomain Jobredeaux        min_sdk_version = 0):
196*9e965d6fSRomain Jobredeaux    content = """<?xml version="1.0" encoding="utf-8"?>
197*9e965d6fSRomain Jobredeaux<manifest xmlns:android="http://schemas.android.com/apk/res/android"
198*9e965d6fSRomain Jobredeaux    package="%s">""" % (java_package or "com.default")
199*9e965d6fSRomain Jobredeaux
200*9e965d6fSRomain Jobredeaux    min_sdk_version = max(min_sdk_version, acls.get_min_sdk_floor(str(ctx.label)))
201*9e965d6fSRomain Jobredeaux    content = content + """
202*9e965d6fSRomain Jobredeaux    <uses-sdk android:minSdkVersion="%s" />""" % min_sdk_version
203*9e965d6fSRomain Jobredeaux
204*9e965d6fSRomain Jobredeaux    content = content + """
205*9e965d6fSRomain Jobredeaux    <application>
206*9e965d6fSRomain Jobredeaux    </application>
207*9e965d6fSRomain Jobredeaux</manifest>"""
208*9e965d6fSRomain Jobredeaux
209*9e965d6fSRomain Jobredeaux    ctx.actions.write(
210*9e965d6fSRomain Jobredeaux        output = out_manifest,
211*9e965d6fSRomain Jobredeaux        content = content,
212*9e965d6fSRomain Jobredeaux    )
213*9e965d6fSRomain Jobredeaux
214*9e965d6fSRomain Jobredeauxdef _add_g3itr(
215*9e965d6fSRomain Jobredeaux        ctx,
216*9e965d6fSRomain Jobredeaux        manifest = None,
217*9e965d6fSRomain Jobredeaux        out_manifest = None,
218*9e965d6fSRomain Jobredeaux        xsltproc = None,
219*9e965d6fSRomain Jobredeaux        instrument_xslt = None):
220*9e965d6fSRomain Jobredeaux    """Adds Google3InstrumentationTestRunner instrumentation element to the manifest.
221*9e965d6fSRomain Jobredeaux
222*9e965d6fSRomain Jobredeaux    Element is only added if the manifest contains an instrumentation element with
223*9e965d6fSRomain Jobredeaux    name "android.test.InstrumentationTestRunner". The added element's name attr is
224*9e965d6fSRomain Jobredeaux    "com.google.android.apps.common.testing.testrunner.Google3InstrumentationTestRunner".
225*9e965d6fSRomain Jobredeaux
226*9e965d6fSRomain Jobredeaux    Args:
227*9e965d6fSRomain Jobredeaux      ctx: The context.
228*9e965d6fSRomain Jobredeaux      manifest: File. The AndroidManifest.xml file.
229*9e965d6fSRomain Jobredeaux      out_manifest: File. The transformed AndroidManifest.xml.
230*9e965d6fSRomain Jobredeaux      xsltproc: FilesToRunProvider. The xsltproc executable or
231*9e965d6fSRomain Jobredeaux        FilesToRunProvider.
232*9e965d6fSRomain Jobredeaux      instrument_xslt: File. The add_g3itr.xslt file describing the xslt
233*9e965d6fSRomain Jobredeaux        transformation to apply.
234*9e965d6fSRomain Jobredeaux    """
235*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
236*9e965d6fSRomain Jobredeaux    args.add("--nonet")
237*9e965d6fSRomain Jobredeaux    args.add("--novalid")
238*9e965d6fSRomain Jobredeaux    args.add("-o", out_manifest)
239*9e965d6fSRomain Jobredeaux    args.add(instrument_xslt)
240*9e965d6fSRomain Jobredeaux    args.add(manifest)
241*9e965d6fSRomain Jobredeaux
242*9e965d6fSRomain Jobredeaux    ctx.actions.run(
243*9e965d6fSRomain Jobredeaux        executable = xsltproc,
244*9e965d6fSRomain Jobredeaux        arguments = [args],
245*9e965d6fSRomain Jobredeaux        inputs = [manifest, instrument_xslt],
246*9e965d6fSRomain Jobredeaux        outputs = [out_manifest],
247*9e965d6fSRomain Jobredeaux        mnemonic = "AddG3ITRStarlark",
248*9e965d6fSRomain Jobredeaux        progress_message = "Adding G3ITR to test manifest for %s" % ctx.label,
249*9e965d6fSRomain Jobredeaux        toolchain = None,
250*9e965d6fSRomain Jobredeaux    )
251*9e965d6fSRomain Jobredeaux
252*9e965d6fSRomain Jobredeauxdef _get_legacy_mergee_manifests(resources_infos):
253*9e965d6fSRomain Jobredeaux    all_dependencies = depset(
254*9e965d6fSRomain Jobredeaux        transitive = [
255*9e965d6fSRomain Jobredeaux            ri.direct_android_resources
256*9e965d6fSRomain Jobredeaux            for ri in resources_infos
257*9e965d6fSRomain Jobredeaux        ] + [
258*9e965d6fSRomain Jobredeaux            ri.transitive_android_resources
259*9e965d6fSRomain Jobredeaux            for ri in resources_infos
260*9e965d6fSRomain Jobredeaux        ],
261*9e965d6fSRomain Jobredeaux    )
262*9e965d6fSRomain Jobredeaux
263*9e965d6fSRomain Jobredeaux    mergee_manifests = []
264*9e965d6fSRomain Jobredeaux    for dep in all_dependencies.to_list():
265*9e965d6fSRomain Jobredeaux        if dep.to_provider.manifest.exports_manifest:
266*9e965d6fSRomain Jobredeaux            mergee_manifests.append(dep.to_provider.manifest.manifest)
267*9e965d6fSRomain Jobredeaux
268*9e965d6fSRomain Jobredeaux    return depset(mergee_manifests)
269*9e965d6fSRomain Jobredeaux
270*9e965d6fSRomain Jobredeauxdef _legacy_mergee_manifest(manifest):
271*9e965d6fSRomain Jobredeaux    sort_key = manifest.short_path + "#"
272*9e965d6fSRomain Jobredeaux    return sort_key + "--mergee=" + manifest.path
273*9e965d6fSRomain Jobredeaux
274*9e965d6fSRomain Jobredeauxdef _legacy_merge_manifests(
275*9e965d6fSRomain Jobredeaux        ctx,
276*9e965d6fSRomain Jobredeaux        out_merged_manifest = None,
277*9e965d6fSRomain Jobredeaux        manifest = None,
278*9e965d6fSRomain Jobredeaux        mergee_manifests = None,
279*9e965d6fSRomain Jobredeaux        legacy_merger = None):
280*9e965d6fSRomain Jobredeaux    """Merges manifests with the legacy manifest merger."
281*9e965d6fSRomain Jobredeaux
282*9e965d6fSRomain Jobredeaux    This should not be called with empty mergee_manifests.
283*9e965d6fSRomain Jobredeaux
284*9e965d6fSRomain Jobredeaux    Args:
285*9e965d6fSRomain Jobredeaux      ctx: The context.
286*9e965d6fSRomain Jobredeaux      out_merged_manifest: File. The merged AndroidManifest.xml.
287*9e965d6fSRomain Jobredeaux      manifest: File. The AndroidManifest.xml.
288*9e965d6fSRomain Jobredeaux      mergee_manifests: A sequence of Files. All transitive manifests to be merged.
289*9e965d6fSRomain Jobredeaux      legacy_merger: A FilesToRunProvider. The legacy manifest merger executable.
290*9e965d6fSRomain Jobredeaux    """
291*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
292*9e965d6fSRomain Jobredeaux    args.use_param_file("%s", use_always = True)
293*9e965d6fSRomain Jobredeaux    args.set_param_file_format("multiline")
294*9e965d6fSRomain Jobredeaux    args.add("--merger=%s" % manifest.path)
295*9e965d6fSRomain Jobredeaux    args.add("--exclude_permission=all")
296*9e965d6fSRomain Jobredeaux    args.add("--output=%s" % out_merged_manifest.path)
297*9e965d6fSRomain Jobredeaux
298*9e965d6fSRomain Jobredeaux    manifest_params = ctx.actions.declare_file(ctx.label.name + "/legacy_merger.params")
299*9e965d6fSRomain Jobredeaux    manifest_args = ctx.actions.args()
300*9e965d6fSRomain Jobredeaux    manifest_args.use_param_file("%s", use_always = True)
301*9e965d6fSRomain Jobredeaux    manifest_args.set_param_file_format("multiline")
302*9e965d6fSRomain Jobredeaux    manifest_args.add_joined(mergee_manifests, map_each = _legacy_mergee_manifest, join_with = "\n")
303*9e965d6fSRomain Jobredeaux    ctx.actions.run_shell(
304*9e965d6fSRomain Jobredeaux        command = """
305*9e965d6fSRomain Jobredeaux# Sorts the mergee manifests by path and combines with other busybox args.
306*9e965d6fSRomain Jobredeauxset -e
307*9e965d6fSRomain JobredeauxSORTED=`sort $1 | sed 's/^.*#//'`
308*9e965d6fSRomain Jobredeauxcat $2 > $3
309*9e965d6fSRomain Jobredeauxecho "$SORTED" >> $3
310*9e965d6fSRomain Jobredeaux""",
311*9e965d6fSRomain Jobredeaux        arguments = [manifest_args, args, manifest_params.path],
312*9e965d6fSRomain Jobredeaux        outputs = [manifest_params],
313*9e965d6fSRomain Jobredeaux        toolchain = None,
314*9e965d6fSRomain Jobredeaux    )
315*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
316*9e965d6fSRomain Jobredeaux    args.add(manifest_params, format = "--flagfile=%s")
317*9e965d6fSRomain Jobredeaux
318*9e965d6fSRomain Jobredeaux    ctx.actions.run(
319*9e965d6fSRomain Jobredeaux        executable = legacy_merger,
320*9e965d6fSRomain Jobredeaux        arguments = [args],
321*9e965d6fSRomain Jobredeaux        inputs = depset([manifest, manifest_params], transitive = [mergee_manifests]),
322*9e965d6fSRomain Jobredeaux        outputs = [out_merged_manifest],
323*9e965d6fSRomain Jobredeaux        mnemonic = "StarlarkLegacyAndroidManifestMerger",
324*9e965d6fSRomain Jobredeaux        progress_message = "Merging Android Manifests",
325*9e965d6fSRomain Jobredeaux        toolchain = None,
326*9e965d6fSRomain Jobredeaux    )
327*9e965d6fSRomain Jobredeaux
328*9e965d6fSRomain Jobredeauxdef _make_databinding_outputs(
329*9e965d6fSRomain Jobredeaux        ctx,
330*9e965d6fSRomain Jobredeaux        resource_files):
331*9e965d6fSRomain Jobredeaux    """Helper method to create arguments for the process_databinding busybox tool.
332*9e965d6fSRomain Jobredeaux
333*9e965d6fSRomain Jobredeaux    Declares databinding-processed resource files that are generated by the
334*9e965d6fSRomain Jobredeaux    PROCESS_DATABINDING busybox tool, which must be declared underneath an output
335*9e965d6fSRomain Jobredeaux    resources directory and namespaced by their paths. The busybox takes the
336*9e965d6fSRomain Jobredeaux    output directory exec path and generates the underlying resource files.
337*9e965d6fSRomain Jobredeaux
338*9e965d6fSRomain Jobredeaux    Args:
339*9e965d6fSRomain Jobredeaux      ctx: The context.
340*9e965d6fSRomain Jobredeaux      resource_files: List of Files. The android resource files to be processed by
341*9e965d6fSRomain Jobredeaux        _process_databinding.
342*9e965d6fSRomain Jobredeaux
343*9e965d6fSRomain Jobredeaux    Returns:
344*9e965d6fSRomain Jobredeaux      A tuple containing the list of declared databinding processed resource files and the
345*9e965d6fSRomain Jobredeaux        output resource directory path expected by the busybox. The path is a full path.
346*9e965d6fSRomain Jobredeaux    """
347*9e965d6fSRomain Jobredeaux
348*9e965d6fSRomain Jobredeaux    # TODO(b/160907203): Clean up databinding_rel_path. We capitalize "Databinding" here to avoid
349*9e965d6fSRomain Jobredeaux    # conflicting with native artifact file names. This is changed back to "databinding" during
350*9e965d6fSRomain Jobredeaux    # process_starlark so that compiled resources exactly match those of the native resource
351*9e965d6fSRomain Jobredeaux    # processing pipeline. Even a single character mismatch in the file names causes selected
352*9e965d6fSRomain Jobredeaux    # resources to differ in the final APK.
353*9e965d6fSRomain Jobredeaux    databinding_rel_path = _path.join(["Databinding-processed-resources", ctx.label.name])
354*9e965d6fSRomain Jobredeaux    databinding_processed_resources = [
355*9e965d6fSRomain Jobredeaux        ctx.actions.declare_file(_path.join([databinding_rel_path, f.path]))
356*9e965d6fSRomain Jobredeaux        for f in resource_files
357*9e965d6fSRomain Jobredeaux    ]
358*9e965d6fSRomain Jobredeaux    databinding_resources_dirname = _path.join([
359*9e965d6fSRomain Jobredeaux        ctx.bin_dir.path,
360*9e965d6fSRomain Jobredeaux        ctx.label.package,
361*9e965d6fSRomain Jobredeaux        databinding_rel_path,
362*9e965d6fSRomain Jobredeaux    ])
363*9e965d6fSRomain Jobredeaux    return databinding_processed_resources, databinding_resources_dirname
364*9e965d6fSRomain Jobredeaux
365*9e965d6fSRomain Jobredeauxdef _fix_databinding_compiled_resources(
366*9e965d6fSRomain Jobredeaux        ctx,
367*9e965d6fSRomain Jobredeaux        out_compiled_resources = None,
368*9e965d6fSRomain Jobredeaux        compiled_resources = None,
369*9e965d6fSRomain Jobredeaux        zip_tool = None):
370*9e965d6fSRomain Jobredeaux    """Fix compiled resources to match those produced by the native pipeline.
371*9e965d6fSRomain Jobredeaux
372*9e965d6fSRomain Jobredeaux    Changes "Databinding" to "databinding" in each compiled resource .flat file name and header.
373*9e965d6fSRomain Jobredeaux
374*9e965d6fSRomain Jobredeaux    Args:
375*9e965d6fSRomain Jobredeaux      ctx: The context.
376*9e965d6fSRomain Jobredeaux      out_compiled_resources: File. The modified compiled_resources output.
377*9e965d6fSRomain Jobredeaux      compiled_resources: File. The compiled_resources zip.
378*9e965d6fSRomain Jobredeaux      zip_tool: FilesToRunProvider. The zip tool executable or FilesToRunProvider
379*9e965d6fSRomain Jobredeaux    """
380*9e965d6fSRomain Jobredeaux    ctx.actions.run_shell(
381*9e965d6fSRomain Jobredeaux        outputs = [out_compiled_resources],
382*9e965d6fSRomain Jobredeaux        inputs = [compiled_resources],
383*9e965d6fSRomain Jobredeaux        tools = [zip_tool],
384*9e965d6fSRomain Jobredeaux        arguments = [compiled_resources.path, out_compiled_resources.path, zip_tool.executable.path],
385*9e965d6fSRomain Jobredeaux        toolchain = None,
386*9e965d6fSRomain Jobredeaux        command = """#!/bin/bash
387*9e965d6fSRomain Jobredeauxset -e
388*9e965d6fSRomain Jobredeaux
389*9e965d6fSRomain JobredeauxIN_DIR=$(mktemp -d)
390*9e965d6fSRomain JobredeauxOUT_DIR=$(mktemp -d)
391*9e965d6fSRomain JobredeauxCUR_PWD=$(pwd)
392*9e965d6fSRomain Jobredeaux
393*9e965d6fSRomain Jobredeauxif zipinfo -t "$1"; then
394*9e965d6fSRomain Jobredeaux    ORDERED_LIST=`(unzip -l "$1" | sed -e '1,3d' | head -n -2 | tr -s " " | cut -d " " -f5)`
395*9e965d6fSRomain Jobredeaux
396*9e965d6fSRomain Jobredeaux    unzip -q "$1" -d "$IN_DIR"
397*9e965d6fSRomain Jobredeaux
398*9e965d6fSRomain Jobredeaux    # Iterate through the ordered list, change "Databinding" to "databinding" in the file header
399*9e965d6fSRomain Jobredeaux    # and file name and zip the files with the right comment
400*9e965d6fSRomain Jobredeaux    for FILE in $ORDERED_LIST; do
401*9e965d6fSRomain Jobredeaux        cd "$IN_DIR"
402*9e965d6fSRomain Jobredeaux        if [ -f "$FILE" ]; then
403*9e965d6fSRomain Jobredeaux            sed -i 's/Databinding\\-processed\\-resources/databinding\\-processed\\-resources/g' "$FILE"
404*9e965d6fSRomain Jobredeaux            NEW_NAME=`echo "$FILE" | sed 's/Databinding\\-processed\\-resources/databinding\\-processed\\-resources/g' | sed 's#'"$IN_DIR"'/##g'`
405*9e965d6fSRomain Jobredeaux            mkdir -p `dirname "$OUT_DIR/$NEW_NAME"` && touch "$OUT_DIR/$NEW_NAME"
406*9e965d6fSRomain Jobredeaux            cp -p "$FILE" "$OUT_DIR/$NEW_NAME"
407*9e965d6fSRomain Jobredeaux
408*9e965d6fSRomain Jobredeaux            PATH_SEGMENTS=(`echo ${FILE} | tr '/' ' '`)
409*9e965d6fSRomain Jobredeaux            BASE_PATH_SEGMENT="${PATH_SEGMENTS[0]}"
410*9e965d6fSRomain Jobredeaux                COMMENT=
411*9e965d6fSRomain Jobredeaux            if [ "${BASE_PATH_SEGMENT}" == "generated" ]; then
412*9e965d6fSRomain Jobredeaux                COMMENT="generated"
413*9e965d6fSRomain Jobredeaux            elif [ "${BASE_PATH_SEGMENT}" == "default" ]; then
414*9e965d6fSRomain Jobredeaux                COMMENT="default"
415*9e965d6fSRomain Jobredeaux            fi
416*9e965d6fSRomain Jobredeaux
417*9e965d6fSRomain Jobredeaux            cd "$OUT_DIR"
418*9e965d6fSRomain Jobredeaux            "$CUR_PWD/$3" -jt -X -0 -q -r -c "$CUR_PWD/$2" $NEW_NAME <<EOM
419*9e965d6fSRomain Jobredeaux${COMMENT}
420*9e965d6fSRomain JobredeauxEOM
421*9e965d6fSRomain Jobredeaux        fi
422*9e965d6fSRomain Jobredeaux    done
423*9e965d6fSRomain Jobredeaux
424*9e965d6fSRomain Jobredeaux    cd "$CUR_PWD"
425*9e965d6fSRomain Jobredeaux    touch -r "$1" "$2"
426*9e965d6fSRomain Jobredeauxelse
427*9e965d6fSRomain Jobredeaux    cp -p "$1" "$2"
428*9e965d6fSRomain Jobredeauxfi
429*9e965d6fSRomain Jobredeaux        """,
430*9e965d6fSRomain Jobredeaux    )
431*9e965d6fSRomain Jobredeaux
432*9e965d6fSRomain Jobredeauxdef _is_resource_shrinking_enabled(
433*9e965d6fSRomain Jobredeaux        shrink_resources,
434*9e965d6fSRomain Jobredeaux        use_android_resource_shrinking):
435*9e965d6fSRomain Jobredeaux    if shrink_resources == _attrs.tristate.auto:
436*9e965d6fSRomain Jobredeaux        return use_android_resource_shrinking
437*9e965d6fSRomain Jobredeaux    return shrink_resources == _attrs.tristate.yes
438*9e965d6fSRomain Jobredeaux
439*9e965d6fSRomain Jobredeauxdef _should_shrink_resource_cycles(
440*9e965d6fSRomain Jobredeaux        use_android_resource_cycle_shrinking,
441*9e965d6fSRomain Jobredeaux        resource_shrinking_enabled,
442*9e965d6fSRomain Jobredeaux        has_local_proguard_specs):
443*9e965d6fSRomain Jobredeaux    return (use_android_resource_cycle_shrinking and
444*9e965d6fSRomain Jobredeaux            resource_shrinking_enabled and
445*9e965d6fSRomain Jobredeaux            has_local_proguard_specs)
446*9e965d6fSRomain Jobredeaux
447*9e965d6fSRomain Jobredeauxdef _filter_multi_cpu_configuration_targets(
448*9e965d6fSRomain Jobredeaux        targets):
449*9e965d6fSRomain Jobredeaux    """Filter out duplicate split-configured targets.
450*9e965d6fSRomain Jobredeaux
451*9e965d6fSRomain Jobredeaux    This method simulates logic in the native rule where if a label_list attribute has
452*9e965d6fSRomain Jobredeaux    split-configuration but is requested in target mode, only targets from the first architecture
453*9e965d6fSRomain Jobredeaux    are returned. Without this filtering there are duplicate targets if multiple CPU configurations
454*9e965d6fSRomain Jobredeaux    are specified on the command line. This is the case with deps in the packaging step of
455*9e965d6fSRomain Jobredeaux    android_binary.
456*9e965d6fSRomain Jobredeaux
457*9e965d6fSRomain Jobredeaux    Args:
458*9e965d6fSRomain Jobredeaux      targets: A list of Target objects.
459*9e965d6fSRomain Jobredeaux
460*9e965d6fSRomain Jobredeaux    Returns:
461*9e965d6fSRomain Jobredeaux      A list of Target objects with duplicates removed.
462*9e965d6fSRomain Jobredeaux    """
463*9e965d6fSRomain Jobredeaux    seen_labels = {}
464*9e965d6fSRomain Jobredeaux    filtered_targets = []
465*9e965d6fSRomain Jobredeaux    for t in targets:
466*9e965d6fSRomain Jobredeaux        if t.label in seen_labels:
467*9e965d6fSRomain Jobredeaux            continue
468*9e965d6fSRomain Jobredeaux        seen_labels[t.label] = True
469*9e965d6fSRomain Jobredeaux        filtered_targets.append(t)
470*9e965d6fSRomain Jobredeaux    return filtered_targets
471*9e965d6fSRomain Jobredeaux
472*9e965d6fSRomain Jobredeauxdef _package(
473*9e965d6fSRomain Jobredeaux        ctx,
474*9e965d6fSRomain Jobredeaux        assets = [],
475*9e965d6fSRomain Jobredeaux        assets_dir = None,
476*9e965d6fSRomain Jobredeaux        deps = [],
477*9e965d6fSRomain Jobredeaux        resource_apks = [],
478*9e965d6fSRomain Jobredeaux        manifest = None,
479*9e965d6fSRomain Jobredeaux        manifest_values = None,
480*9e965d6fSRomain Jobredeaux        instruments = None,
481*9e965d6fSRomain Jobredeaux        resource_configs = None,
482*9e965d6fSRomain Jobredeaux        densities = [],
483*9e965d6fSRomain Jobredeaux        resource_files = [],
484*9e965d6fSRomain Jobredeaux        nocompress_extensions = [],
485*9e965d6fSRomain Jobredeaux        java_package = None,
486*9e965d6fSRomain Jobredeaux        package_id = None,
487*9e965d6fSRomain Jobredeaux        compilation_mode = _compilation_mode.FASTBUILD,
488*9e965d6fSRomain Jobredeaux        shrink_resources = None,
489*9e965d6fSRomain Jobredeaux        use_android_resource_shrinking = None,
490*9e965d6fSRomain Jobredeaux        use_android_resource_cycle_shrinking = None,
491*9e965d6fSRomain Jobredeaux        use_legacy_manifest_merger = False,
492*9e965d6fSRomain Jobredeaux        should_throw_on_conflict = True,
493*9e965d6fSRomain Jobredeaux        enable_data_binding = False,
494*9e965d6fSRomain Jobredeaux        enable_manifest_merging = True,
495*9e965d6fSRomain Jobredeaux        should_compile_java_srcs = True,
496*9e965d6fSRomain Jobredeaux        minsdk_proguard_config = None,
497*9e965d6fSRomain Jobredeaux        aapt = None,
498*9e965d6fSRomain Jobredeaux        has_local_proguard_specs = False,
499*9e965d6fSRomain Jobredeaux        android_jar = None,
500*9e965d6fSRomain Jobredeaux        legacy_merger = None,
501*9e965d6fSRomain Jobredeaux        xsltproc = None,
502*9e965d6fSRomain Jobredeaux        instrument_xslt = None,
503*9e965d6fSRomain Jobredeaux        busybox = None,
504*9e965d6fSRomain Jobredeaux        host_javabase = None,
505*9e965d6fSRomain Jobredeaux        add_application_resource_info_to_providers = True):
506*9e965d6fSRomain Jobredeaux    """Package resources for top-level rules.
507*9e965d6fSRomain Jobredeaux
508*9e965d6fSRomain Jobredeaux    Args:
509*9e965d6fSRomain Jobredeaux      ctx: The context.
510*9e965d6fSRomain Jobredeaux      assets: sequence of Files. A list of assets to be packaged. All files be
511*9e965d6fSRomain Jobredeaux        under the assets_dir directory in the corresponding package.
512*9e965d6fSRomain Jobredeaux      assets_dir: String. A string giving the path to the files in assets. The
513*9e965d6fSRomain Jobredeaux        pair assets and assets_dir describe packaged assets and either both
514*9e965d6fSRomain Jobredeaux        parameters should be provided or none of them.
515*9e965d6fSRomain Jobredeaux      deps: sequence of Targets. The list of other libraries targets to link
516*9e965d6fSRomain Jobredeaux        against.
517*9e965d6fSRomain Jobredeaux      resource_apks: sequence of resource only apk files
518*9e965d6fSRomain Jobredeaux      manifest: File. The input top-level AndroidManifest.xml.
519*9e965d6fSRomain Jobredeaux      manifest_values: String dictionary. Manifest values to substitute.
520*9e965d6fSRomain Jobredeaux      instruments: Optional target. The value of the "instruments" attr if set.
521*9e965d6fSRomain Jobredeaux      resource_configs: sequence of Strings. A list of resource_configuration_filters
522*9e965d6fSRomain Jobredeaux        to apply.
523*9e965d6fSRomain Jobredeaux      densities: sequence of Strings. A list of densities to filter for when building
524*9e965d6fSRomain Jobredeaux        the apk.
525*9e965d6fSRomain Jobredeaux      resource_files: sequence of Files. A list of Android resource files
526*9e965d6fSRomain Jobredeaux        to be processed.
527*9e965d6fSRomain Jobredeaux      nocompress_extensions: sequence of Strings. File extension to leave uncompressed
528*9e965d6fSRomain Jobredeaux        in the apk.
529*9e965d6fSRomain Jobredeaux      java_package: String. Java package for which java sources will be
530*9e965d6fSRomain Jobredeaux        generated. By default the package is inferred from the directory where
531*9e965d6fSRomain Jobredeaux        the BUILD file containing the rule is.
532*9e965d6fSRomain Jobredeaux      package_id: An optional integer in [2,255]. This is the prefix byte for
533*9e965d6fSRomain Jobredeaux        all generated resource IDs, defaults to 0x7F (127). 1 is reserved by the
534*9e965d6fSRomain Jobredeaux        framework, and some builds are known to crash when given IDs > 127.
535*9e965d6fSRomain Jobredeaux        Shared libraries are also assigned monotonically increasing IDs in
536*9e965d6fSRomain Jobredeaux        [2,126], so care should be taken that there is room at the lower end.
537*9e965d6fSRomain Jobredeaux      compilation_mode: String. A string that represents compilation mode. The
538*9e965d6fSRomain Jobredeaux        list of expected values are as follows: dbg, fastbuild, opt.
539*9e965d6fSRomain Jobredeaux      shrink_resources: Tristate. Whether resource shrinking is enabled by the rule.
540*9e965d6fSRomain Jobredeaux      use_android_resource_shrinking: Bool. Flag that controls the default value for
541*9e965d6fSRomain Jobredeaux        shrink_resources if the tristate value is auto (-1).
542*9e965d6fSRomain Jobredeaux      use_android_resource_cycle_shrinking: Bool. Flag that enables more shrinking of
543*9e965d6fSRomain Jobredeaux        code and resources by instructing AAPT2 to emit conditional Proguard keep rules.
544*9e965d6fSRomain Jobredeaux      use_legacy_manifest_merger: A boolean. Whether to use the legacy manifest merger
545*9e965d6fSRomain Jobredeaux      instead of the android manifest merger.
546*9e965d6fSRomain Jobredeaux      should_throw_on_conflict: A boolean. Determines whether an error should be thrown
547*9e965d6fSRomain Jobredeaux        when a resource conflict occurs.
548*9e965d6fSRomain Jobredeaux      enable_data_binding: boolean. If true, processesing the data binding
549*9e965d6fSRomain Jobredeaux        expressions in layout resources included through the resource_files
550*9e965d6fSRomain Jobredeaux        parameter is enabled. Without this setting, data binding expressions
551*9e965d6fSRomain Jobredeaux        produce build failures.
552*9e965d6fSRomain Jobredeaux      enable_manifest_merging: boolean. If true, manifest merging will be performed.
553*9e965d6fSRomain Jobredeaux      should_compile_java_srcs: boolean. If native android_binary should perform java compilation.
554*9e965d6fSRomain Jobredeaux      minsdk_proguard_config: Optional file. Proguard config for the minSdkVersion to include in the
555*9e965d6fSRomain Jobredeaux        returned resource context.
556*9e965d6fSRomain Jobredeaux      aapt: FilesToRunProvider. The aapt executable or FilesToRunProvider.
557*9e965d6fSRomain Jobredeaux      has_local_proguard_specs: If the target has proguard specs.
558*9e965d6fSRomain Jobredeaux      android_jar: File. The Android jar.
559*9e965d6fSRomain Jobredeaux      legacy_merger: FilesToRunProvider. The legacy manifest merger executable.
560*9e965d6fSRomain Jobredeaux      xsltproc: FilesToRunProvider. The xsltproc executable or
561*9e965d6fSRomain Jobredeaux        FilesToRunProvider.
562*9e965d6fSRomain Jobredeaux      instrument_xslt: File. The add_g3itr.xslt file describing the xslt
563*9e965d6fSRomain Jobredeaux        transformation to apply.
564*9e965d6fSRomain Jobredeaux      busybox: FilesToRunProvider. The ResourceBusyBox executable or
565*9e965d6fSRomain Jobredeaux        FilesToRunprovider
566*9e965d6fSRomain Jobredeaux      host_javabase: A Target. The host javabase.
567*9e965d6fSRomain Jobredeaux      add_application_resource_info_to_providers: boolean. Whether to add the
568*9e965d6fSRomain Jobredeaux          AndroidApplicationResourceInfo provider to the list of providers for this processor.
569*9e965d6fSRomain Jobredeaux
570*9e965d6fSRomain Jobredeaux    Returns:
571*9e965d6fSRomain Jobredeaux      A ResourcesPackageContextInfo containing packaged resource artifacts and
572*9e965d6fSRomain Jobredeaux        providers.
573*9e965d6fSRomain Jobredeaux    """
574*9e965d6fSRomain Jobredeaux    _validate_resources(resource_files)
575*9e965d6fSRomain Jobredeaux
576*9e965d6fSRomain Jobredeaux    packaged_resources_ctx = {
577*9e965d6fSRomain Jobredeaux        _PROVIDERS: [],
578*9e965d6fSRomain Jobredeaux    }
579*9e965d6fSRomain Jobredeaux
580*9e965d6fSRomain Jobredeaux    g3itr_manifest = manifest
581*9e965d6fSRomain Jobredeaux
582*9e965d6fSRomain Jobredeaux    if xsltproc or instrument_xslt:
583*9e965d6fSRomain Jobredeaux        g3itr_manifest = ctx.actions.declare_file(
584*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "add_g3itr/AndroidManifest.xml",
585*9e965d6fSRomain Jobredeaux        )
586*9e965d6fSRomain Jobredeaux        _add_g3itr(
587*9e965d6fSRomain Jobredeaux            ctx,
588*9e965d6fSRomain Jobredeaux            out_manifest = g3itr_manifest,
589*9e965d6fSRomain Jobredeaux            manifest = manifest,
590*9e965d6fSRomain Jobredeaux            xsltproc = xsltproc,
591*9e965d6fSRomain Jobredeaux            instrument_xslt = instrument_xslt,
592*9e965d6fSRomain Jobredeaux        )
593*9e965d6fSRomain Jobredeaux
594*9e965d6fSRomain Jobredeaux    direct_resources_nodes = []
595*9e965d6fSRomain Jobredeaux    transitive_resources_nodes = []
596*9e965d6fSRomain Jobredeaux    transitive_assets = []
597*9e965d6fSRomain Jobredeaux    transitive_assets_symbols = []
598*9e965d6fSRomain Jobredeaux    transitive_compiled_assets = []
599*9e965d6fSRomain Jobredeaux    transitive_resource_files = []
600*9e965d6fSRomain Jobredeaux    transitive_compiled_resources = []
601*9e965d6fSRomain Jobredeaux    transitive_manifests = []
602*9e965d6fSRomain Jobredeaux    transitive_r_txts = []
603*9e965d6fSRomain Jobredeaux    packages_to_r_txts_depset = dict()
604*9e965d6fSRomain Jobredeaux    transitive_resource_apks = []
605*9e965d6fSRomain Jobredeaux
606*9e965d6fSRomain Jobredeaux    for dep in utils.collect_providers(StarlarkAndroidResourcesInfo, deps):
607*9e965d6fSRomain Jobredeaux        direct_resources_nodes.append(dep.direct_resources_nodes)
608*9e965d6fSRomain Jobredeaux        transitive_resources_nodes.append(dep.transitive_resources_nodes)
609*9e965d6fSRomain Jobredeaux        transitive_assets.append(dep.transitive_assets)
610*9e965d6fSRomain Jobredeaux        transitive_assets_symbols.append(dep.transitive_assets_symbols)
611*9e965d6fSRomain Jobredeaux        transitive_compiled_assets.append(dep.transitive_compiled_assets)
612*9e965d6fSRomain Jobredeaux        transitive_resource_files.append(dep.transitive_resource_files)
613*9e965d6fSRomain Jobredeaux        transitive_compiled_resources.append(dep.transitive_compiled_resources)
614*9e965d6fSRomain Jobredeaux        transitive_manifests.append(dep.transitive_manifests)
615*9e965d6fSRomain Jobredeaux        transitive_r_txts.append(dep.transitive_r_txts)
616*9e965d6fSRomain Jobredeaux        for pkg, r_txts in dep.packages_to_r_txts.items():
617*9e965d6fSRomain Jobredeaux            packages_to_r_txts_depset.setdefault(pkg, []).append(r_txts)
618*9e965d6fSRomain Jobredeaux        transitive_resource_apks.append(dep.transitive_resource_apks)
619*9e965d6fSRomain Jobredeaux    mergee_manifests = depset([
620*9e965d6fSRomain Jobredeaux        node_info.manifest
621*9e965d6fSRomain Jobredeaux        for node_info in depset(transitive = transitive_resources_nodes + direct_resources_nodes).to_list()
622*9e965d6fSRomain Jobredeaux        if node_info.exports_manifest
623*9e965d6fSRomain Jobredeaux    ])
624*9e965d6fSRomain Jobredeaux
625*9e965d6fSRomain Jobredeaux    if not acls.in_shared_library_resource_linking_allowlist(str(ctx.label)):
626*9e965d6fSRomain Jobredeaux        # to_list() safe to use as we expect this to be an empty depset in the non-error case
627*9e965d6fSRomain Jobredeaux        all_res_apks = depset(
628*9e965d6fSRomain Jobredeaux            resource_apks,
629*9e965d6fSRomain Jobredeaux            transitive = transitive_resource_apks,
630*9e965d6fSRomain Jobredeaux            order = "preorder",
631*9e965d6fSRomain Jobredeaux        ).to_list()
632*9e965d6fSRomain Jobredeaux        if all_res_apks:
633*9e965d6fSRomain Jobredeaux            fail(
634*9e965d6fSRomain Jobredeaux                "%s has resource apks in the transitive closure without being allowlisted.\n%s" % (
635*9e965d6fSRomain Jobredeaux                    ctx.label,
636*9e965d6fSRomain Jobredeaux                    all_res_apks,
637*9e965d6fSRomain Jobredeaux                ),
638*9e965d6fSRomain Jobredeaux            )
639*9e965d6fSRomain Jobredeaux
640*9e965d6fSRomain Jobredeaux    # TODO(b/156763506): Add analysis tests to verify logic around when manifest merging is configured.
641*9e965d6fSRomain Jobredeaux    # TODO(b/154153771): Run the android merger if mergee_manifests or manifest values are present.
642*9e965d6fSRomain Jobredeaux    merged_manifest = g3itr_manifest
643*9e965d6fSRomain Jobredeaux    if enable_manifest_merging and (manifest_values or mergee_manifests):
644*9e965d6fSRomain Jobredeaux        if use_legacy_manifest_merger:
645*9e965d6fSRomain Jobredeaux            # Legacy manifest merger only runs if mergee manifests are present
646*9e965d6fSRomain Jobredeaux            if mergee_manifests:
647*9e965d6fSRomain Jobredeaux                merged_manifest = ctx.actions.declare_file(
648*9e965d6fSRomain Jobredeaux                    "_migrated/_merged/" + ctx.label.name + "/AndroidManifest.xml",
649*9e965d6fSRomain Jobredeaux                )
650*9e965d6fSRomain Jobredeaux                _legacy_merge_manifests(
651*9e965d6fSRomain Jobredeaux                    ctx,
652*9e965d6fSRomain Jobredeaux                    out_merged_manifest = merged_manifest,
653*9e965d6fSRomain Jobredeaux                    manifest = g3itr_manifest,
654*9e965d6fSRomain Jobredeaux                    mergee_manifests = mergee_manifests,
655*9e965d6fSRomain Jobredeaux                    legacy_merger = legacy_merger,
656*9e965d6fSRomain Jobredeaux                )
657*9e965d6fSRomain Jobredeaux        else:
658*9e965d6fSRomain Jobredeaux            merged_manifest = ctx.actions.declare_file(
659*9e965d6fSRomain Jobredeaux                "_migrated/_merged/" + ctx.label.name + "/AndroidManifest.xml",
660*9e965d6fSRomain Jobredeaux            )
661*9e965d6fSRomain Jobredeaux            _busybox.merge_manifests(
662*9e965d6fSRomain Jobredeaux                ctx,
663*9e965d6fSRomain Jobredeaux                out_file = merged_manifest,
664*9e965d6fSRomain Jobredeaux                out_log_file = ctx.actions.declare_file(
665*9e965d6fSRomain Jobredeaux                    "_migrated/_merged/" + ctx.label.name + "/manifest_merger_log.txt",
666*9e965d6fSRomain Jobredeaux                ),
667*9e965d6fSRomain Jobredeaux                manifest = g3itr_manifest,
668*9e965d6fSRomain Jobredeaux                mergee_manifests = mergee_manifests,
669*9e965d6fSRomain Jobredeaux                manifest_values = manifest_values,
670*9e965d6fSRomain Jobredeaux                merge_type = "APPLICATION",
671*9e965d6fSRomain Jobredeaux                java_package = java_package,
672*9e965d6fSRomain Jobredeaux                busybox = busybox,
673*9e965d6fSRomain Jobredeaux                host_javabase = host_javabase,
674*9e965d6fSRomain Jobredeaux            )
675*9e965d6fSRomain Jobredeaux
676*9e965d6fSRomain Jobredeaux    processed_resources = resource_files
677*9e965d6fSRomain Jobredeaux    data_binding_layout_info = None
678*9e965d6fSRomain Jobredeaux    if enable_data_binding:
679*9e965d6fSRomain Jobredeaux        data_binding_layout_info = ctx.actions.declare_file("_migrated/" + ctx.label.name + "/layout-info.zip")
680*9e965d6fSRomain Jobredeaux        processed_resources, resources_dirname = _make_databinding_outputs(
681*9e965d6fSRomain Jobredeaux            ctx,
682*9e965d6fSRomain Jobredeaux            resource_files,
683*9e965d6fSRomain Jobredeaux        )
684*9e965d6fSRomain Jobredeaux        _busybox.process_databinding(
685*9e965d6fSRomain Jobredeaux            ctx,
686*9e965d6fSRomain Jobredeaux            out_databinding_info = data_binding_layout_info,
687*9e965d6fSRomain Jobredeaux            out_databinding_processed_resources = processed_resources,
688*9e965d6fSRomain Jobredeaux            databinding_resources_dirname = resources_dirname,
689*9e965d6fSRomain Jobredeaux            resource_files = resource_files,
690*9e965d6fSRomain Jobredeaux            java_package = java_package,
691*9e965d6fSRomain Jobredeaux            busybox = busybox,
692*9e965d6fSRomain Jobredeaux            host_javabase = host_javabase,
693*9e965d6fSRomain Jobredeaux        )
694*9e965d6fSRomain Jobredeaux
695*9e965d6fSRomain Jobredeaux    resource_shrinking_enabled = _is_resource_shrinking_enabled(
696*9e965d6fSRomain Jobredeaux        shrink_resources,
697*9e965d6fSRomain Jobredeaux        use_android_resource_shrinking,
698*9e965d6fSRomain Jobredeaux    )
699*9e965d6fSRomain Jobredeaux    shrink_resource_cycles = _should_shrink_resource_cycles(
700*9e965d6fSRomain Jobredeaux        use_android_resource_cycle_shrinking,
701*9e965d6fSRomain Jobredeaux        resource_shrinking_enabled,
702*9e965d6fSRomain Jobredeaux        has_local_proguard_specs,
703*9e965d6fSRomain Jobredeaux    )
704*9e965d6fSRomain Jobredeaux
705*9e965d6fSRomain Jobredeaux    resource_apk = ctx.actions.declare_file(ctx.label.name + "_migrated/.ap_")
706*9e965d6fSRomain Jobredeaux    r_java = ctx.actions.declare_file("_migrated/" + ctx.label.name + ".srcjar")
707*9e965d6fSRomain Jobredeaux    r_txt = ctx.actions.declare_file(ctx.label.name + "_migrated/_symbols/R.txt")
708*9e965d6fSRomain Jobredeaux    processed_manifest = ctx.actions.declare_file(ctx.label.name + "_migrated/_processed_manifest/AndroidManifest.xml")
709*9e965d6fSRomain Jobredeaux    proguard_cfg = ctx.actions.declare_file(
710*9e965d6fSRomain Jobredeaux        "_migrated/proguard/%s/_%s_proguard.cfg" % (ctx.label.name, ctx.label.name),
711*9e965d6fSRomain Jobredeaux    )
712*9e965d6fSRomain Jobredeaux    main_dex_proguard_cfg = ctx.actions.declare_file(
713*9e965d6fSRomain Jobredeaux        "_migrated/proguard/%s/main_dex_%s_proguard.cfg" %
714*9e965d6fSRomain Jobredeaux        (ctx.label.name, ctx.label.name),
715*9e965d6fSRomain Jobredeaux    )
716*9e965d6fSRomain Jobredeaux    resource_files_zip = ctx.actions.declare_file(
717*9e965d6fSRomain Jobredeaux        "_migrated/" + ctx.label.name + "_files/resource_files.zip",
718*9e965d6fSRomain Jobredeaux    )
719*9e965d6fSRomain Jobredeaux    _busybox.package(
720*9e965d6fSRomain Jobredeaux        ctx,
721*9e965d6fSRomain Jobredeaux        out_file = resource_apk,
722*9e965d6fSRomain Jobredeaux        out_r_src_jar = r_java,
723*9e965d6fSRomain Jobredeaux        out_r_txt = r_txt,
724*9e965d6fSRomain Jobredeaux        out_symbols = ctx.actions.declare_file("_migrated/" + ctx.label.name + "_symbols/merged.bin"),
725*9e965d6fSRomain Jobredeaux        out_manifest = processed_manifest,
726*9e965d6fSRomain Jobredeaux        out_proguard_cfg = proguard_cfg,
727*9e965d6fSRomain Jobredeaux        out_main_dex_proguard_cfg = main_dex_proguard_cfg,
728*9e965d6fSRomain Jobredeaux        out_resource_files_zip = resource_files_zip,
729*9e965d6fSRomain Jobredeaux        application_id = manifest_values.get("applicationId", None),
730*9e965d6fSRomain Jobredeaux        package_id = package_id,
731*9e965d6fSRomain Jobredeaux        manifest = merged_manifest,
732*9e965d6fSRomain Jobredeaux        assets = assets,
733*9e965d6fSRomain Jobredeaux        assets_dir = assets_dir,
734*9e965d6fSRomain Jobredeaux        resource_files = processed_resources,
735*9e965d6fSRomain Jobredeaux        resource_apks = depset(resource_apks, transitive = transitive_resource_apks, order = "preorder"),
736*9e965d6fSRomain Jobredeaux        direct_resources_nodes =
737*9e965d6fSRomain Jobredeaux            depset(transitive = direct_resources_nodes, order = "preorder"),
738*9e965d6fSRomain Jobredeaux        transitive_resources_nodes =
739*9e965d6fSRomain Jobredeaux            depset(transitive = transitive_resources_nodes, order = "preorder"),
740*9e965d6fSRomain Jobredeaux        transitive_assets = transitive_assets,
741*9e965d6fSRomain Jobredeaux        transitive_compiled_assets = transitive_compiled_assets,
742*9e965d6fSRomain Jobredeaux        transitive_resource_files = transitive_resource_files,
743*9e965d6fSRomain Jobredeaux        transitive_compiled_resources = transitive_compiled_resources,
744*9e965d6fSRomain Jobredeaux        transitive_manifests = transitive_manifests,
745*9e965d6fSRomain Jobredeaux        transitive_r_txts = transitive_r_txts,
746*9e965d6fSRomain Jobredeaux        resource_configs = resource_configs,
747*9e965d6fSRomain Jobredeaux        densities = densities,
748*9e965d6fSRomain Jobredeaux        nocompress_extensions = nocompress_extensions,
749*9e965d6fSRomain Jobredeaux        java_package = java_package,
750*9e965d6fSRomain Jobredeaux        shrink_resource_cycles = shrink_resource_cycles,
751*9e965d6fSRomain Jobredeaux        version_name = manifest_values[_VERSION_NAME] if _VERSION_NAME in manifest_values else None,
752*9e965d6fSRomain Jobredeaux        version_code = manifest_values[_VERSION_CODE] if _VERSION_CODE in manifest_values else None,
753*9e965d6fSRomain Jobredeaux        android_jar = android_jar,
754*9e965d6fSRomain Jobredeaux        aapt = aapt,
755*9e965d6fSRomain Jobredeaux        busybox = busybox,
756*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
757*9e965d6fSRomain Jobredeaux        debug = compilation_mode != _compilation_mode.OPT,
758*9e965d6fSRomain Jobredeaux        should_throw_on_conflict = should_throw_on_conflict,
759*9e965d6fSRomain Jobredeaux    )
760*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_PACKAGED_FINAL_MANIFEST] = processed_manifest
761*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_PACKAGED_RESOURCE_APK] = resource_apk
762*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_PACKAGED_VALIDATION_RESULT] = resource_files_zip
763*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_RESOURCE_PROGUARD_CONFIG] = proguard_cfg
764*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_RESOURCE_MINSDK_PROGUARD_CONFIG] = minsdk_proguard_config
765*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_MAIN_DEX_PROGUARD_CONFIG] = main_dex_proguard_cfg
766*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_PACKAGED_R_TXT] = r_txt
767*9e965d6fSRomain Jobredeaux
768*9e965d6fSRomain Jobredeaux    # Fix class jar name because some tests depend on {label_name}_resources.jar being the suffix of
769*9e965d6fSRomain Jobredeaux    # the path, with _common.PACKAGED_RESOURCES_SUFFIX removed from the label name.
770*9e965d6fSRomain Jobredeaux    class_jar_name = ctx.label.name + "_migrated/_resources.jar"
771*9e965d6fSRomain Jobredeaux    if ctx.label.name.endswith(_common.PACKAGED_RESOURCES_SUFFIX):
772*9e965d6fSRomain Jobredeaux        label_name = ctx.label.name.removesuffix(_common.PACKAGED_RESOURCES_SUFFIX)
773*9e965d6fSRomain Jobredeaux        class_jar_name = ctx.label.name + "_migrated/" + label_name + "_resources.jar"
774*9e965d6fSRomain Jobredeaux
775*9e965d6fSRomain Jobredeaux    class_jar = ctx.actions.declare_file(class_jar_name)
776*9e965d6fSRomain Jobredeaux    _busybox.generate_binary_r(
777*9e965d6fSRomain Jobredeaux        ctx,
778*9e965d6fSRomain Jobredeaux        out_class_jar = class_jar,
779*9e965d6fSRomain Jobredeaux        r_txt = r_txt,
780*9e965d6fSRomain Jobredeaux        manifest = processed_manifest,
781*9e965d6fSRomain Jobredeaux        package_for_r = java_package,
782*9e965d6fSRomain Jobredeaux        final_fields = not shrink_resource_cycles and not instruments,
783*9e965d6fSRomain Jobredeaux        resources_nodes = depset(transitive = direct_resources_nodes + transitive_resources_nodes),
784*9e965d6fSRomain Jobredeaux        transitive_r_txts = transitive_r_txts,
785*9e965d6fSRomain Jobredeaux        transitive_manifests = transitive_manifests,
786*9e965d6fSRomain Jobredeaux        busybox = busybox,
787*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
788*9e965d6fSRomain Jobredeaux    )
789*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_PACKAGED_CLASS_JAR] = class_jar
790*9e965d6fSRomain Jobredeaux
791*9e965d6fSRomain Jobredeaux    java_info = JavaInfo(
792*9e965d6fSRomain Jobredeaux        output_jar = class_jar,
793*9e965d6fSRomain Jobredeaux        compile_jar = class_jar,
794*9e965d6fSRomain Jobredeaux        source_jar = r_java,
795*9e965d6fSRomain Jobredeaux    )
796*9e965d6fSRomain Jobredeaux
797*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_R_JAVA] = java_info
798*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_DATA_BINDING_LAYOUT_INFO] = data_binding_layout_info
799*9e965d6fSRomain Jobredeaux
800*9e965d6fSRomain Jobredeaux    packages_to_r_txts_depset.setdefault(java_package, []).append(depset([r_txt]))
801*9e965d6fSRomain Jobredeaux
802*9e965d6fSRomain Jobredeaux    packages_to_r_txts = dict()
803*9e965d6fSRomain Jobredeaux    for pkg, depsets in packages_to_r_txts_depset.items():
804*9e965d6fSRomain Jobredeaux        packages_to_r_txts[pkg] = depset(transitive = depsets)
805*9e965d6fSRomain Jobredeaux
806*9e965d6fSRomain Jobredeaux    # Adding empty depsets to unused fields of StarlarkAndroidResourcesInfo.
807*9e965d6fSRomain Jobredeaux    # Some root targets may depends on other root targets and try to access those fields.
808*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_PROVIDERS].append(StarlarkAndroidResourcesInfo(
809*9e965d6fSRomain Jobredeaux        direct_resources_nodes = depset(),
810*9e965d6fSRomain Jobredeaux        transitive_resources_nodes = depset(),
811*9e965d6fSRomain Jobredeaux        transitive_assets = depset(),
812*9e965d6fSRomain Jobredeaux        transitive_assets_symbols = depset(),
813*9e965d6fSRomain Jobredeaux        transitive_compiled_assets = depset(),
814*9e965d6fSRomain Jobredeaux        transitive_resource_files = depset(),
815*9e965d6fSRomain Jobredeaux        direct_compiled_resources = depset(),
816*9e965d6fSRomain Jobredeaux        transitive_compiled_resources = depset(),
817*9e965d6fSRomain Jobredeaux        transitive_manifests = depset(),
818*9e965d6fSRomain Jobredeaux        transitive_r_txts = depset(),
819*9e965d6fSRomain Jobredeaux        packages_to_r_txts = packages_to_r_txts,
820*9e965d6fSRomain Jobredeaux        transitive_resource_apks = depset(),
821*9e965d6fSRomain Jobredeaux    ))
822*9e965d6fSRomain Jobredeaux
823*9e965d6fSRomain Jobredeaux    android_application_resource_info = AndroidApplicationResourceInfo(
824*9e965d6fSRomain Jobredeaux        resource_apk = resource_apk,
825*9e965d6fSRomain Jobredeaux        resource_java_src_jar = r_java,
826*9e965d6fSRomain Jobredeaux        resource_java_class_jar = class_jar,
827*9e965d6fSRomain Jobredeaux        manifest = processed_manifest,
828*9e965d6fSRomain Jobredeaux        resource_proguard_config = proguard_cfg,
829*9e965d6fSRomain Jobredeaux        main_dex_proguard_config = main_dex_proguard_cfg,
830*9e965d6fSRomain Jobredeaux        r_txt = r_txt,
831*9e965d6fSRomain Jobredeaux        resources_zip = resource_files_zip,
832*9e965d6fSRomain Jobredeaux        databinding_info = data_binding_layout_info,
833*9e965d6fSRomain Jobredeaux        should_compile_java_srcs = should_compile_java_srcs,
834*9e965d6fSRomain Jobredeaux    )
835*9e965d6fSRomain Jobredeaux    packaged_resources_ctx[_ANDROID_APPLICATION_RESOURCE] = android_application_resource_info
836*9e965d6fSRomain Jobredeaux    if add_application_resource_info_to_providers:
837*9e965d6fSRomain Jobredeaux        packaged_resources_ctx[_PROVIDERS].append(android_application_resource_info)
838*9e965d6fSRomain Jobredeaux
839*9e965d6fSRomain Jobredeaux    return _ResourcesPackageContextInfo(**packaged_resources_ctx)
840*9e965d6fSRomain Jobredeaux
841*9e965d6fSRomain Jobredeauxdef _liteparse(ctx, out_r_pb, resource_files, android_kit):
842*9e965d6fSRomain Jobredeaux    """Creates an R.pb which contains the resource ids gotten from a light parse.
843*9e965d6fSRomain Jobredeaux
844*9e965d6fSRomain Jobredeaux    Args:
845*9e965d6fSRomain Jobredeaux      ctx: The context.
846*9e965d6fSRomain Jobredeaux      out_r_pb: File. The R.pb output file.
847*9e965d6fSRomain Jobredeaux      resource_files: List of Files. The list of resource files.
848*9e965d6fSRomain Jobredeaux      android_kit: FilesToRunProvider. The Android Kit executable or
849*9e965d6fSRomain Jobredeaux        FilesToRunProvider.
850*9e965d6fSRomain Jobredeaux    """
851*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
852*9e965d6fSRomain Jobredeaux    args.use_param_file(param_file_arg = "--flagfile=%s", use_always = True)
853*9e965d6fSRomain Jobredeaux    args.set_param_file_format("multiline")
854*9e965d6fSRomain Jobredeaux    args.add_joined("--res_files", resource_files, join_with = ",")
855*9e965d6fSRomain Jobredeaux    args.add("--out", out_r_pb)
856*9e965d6fSRomain Jobredeaux
857*9e965d6fSRomain Jobredeaux    ctx.actions.run(
858*9e965d6fSRomain Jobredeaux        executable = android_kit,
859*9e965d6fSRomain Jobredeaux        arguments = ["liteparse", args],
860*9e965d6fSRomain Jobredeaux        inputs = resource_files,
861*9e965d6fSRomain Jobredeaux        outputs = [out_r_pb],
862*9e965d6fSRomain Jobredeaux        mnemonic = "ResLiteParse",
863*9e965d6fSRomain Jobredeaux        progress_message = "Lite parse Android Resources %s" % ctx.label,
864*9e965d6fSRomain Jobredeaux        toolchain = None,
865*9e965d6fSRomain Jobredeaux    )
866*9e965d6fSRomain Jobredeaux
867*9e965d6fSRomain Jobredeauxdef _fastr(ctx, r_pbs, package, manifest, android_kit):
868*9e965d6fSRomain Jobredeaux    """Create R.srcjar from the given R.pb files in the transitive closure.
869*9e965d6fSRomain Jobredeaux
870*9e965d6fSRomain Jobredeaux    Args:
871*9e965d6fSRomain Jobredeaux      ctx: The context.
872*9e965d6fSRomain Jobredeaux      r_pbs: Transitive  set of resource pbs.
873*9e965d6fSRomain Jobredeaux      package: The package name of the compile-time R.java.
874*9e965d6fSRomain Jobredeaux      manifest: File. The AndroidManifest.xml file.
875*9e965d6fSRomain Jobredeaux      android_kit: FilesToRunProvider. The Android Kit executable or
876*9e965d6fSRomain Jobredeaux        FilesToRunProvider.
877*9e965d6fSRomain Jobredeaux
878*9e965d6fSRomain Jobredeaux    Returns:
879*9e965d6fSRomain Jobredeaux      The output R source jar artifact.
880*9e965d6fSRomain Jobredeaux    """
881*9e965d6fSRomain Jobredeaux    inputs = r_pbs
882*9e965d6fSRomain Jobredeaux    r_srcjar = ctx.actions.declare_file(ctx.label.name + "/resources/R-fastr.srcjar")
883*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
884*9e965d6fSRomain Jobredeaux    args.use_param_file(param_file_arg = "--flagfile=%s", use_always = True)
885*9e965d6fSRomain Jobredeaux    args.set_param_file_format("multiline")
886*9e965d6fSRomain Jobredeaux    args.add("-rJavaOutput", r_srcjar)
887*9e965d6fSRomain Jobredeaux    if package:
888*9e965d6fSRomain Jobredeaux        args.add("-packageForR", package)
889*9e965d6fSRomain Jobredeaux    else:
890*9e965d6fSRomain Jobredeaux        args.add("-manifest", manifest)
891*9e965d6fSRomain Jobredeaux        inputs = depset([manifest], transitive = [inputs])
892*9e965d6fSRomain Jobredeaux    args.add_joined("-resourcePbs", r_pbs, join_with = ",")
893*9e965d6fSRomain Jobredeaux
894*9e965d6fSRomain Jobredeaux    ctx.actions.run(
895*9e965d6fSRomain Jobredeaux        executable = android_kit,
896*9e965d6fSRomain Jobredeaux        arguments = ["rstub", args],
897*9e965d6fSRomain Jobredeaux        inputs = inputs,
898*9e965d6fSRomain Jobredeaux        outputs = [r_srcjar],
899*9e965d6fSRomain Jobredeaux        mnemonic = "CompileTimeR",
900*9e965d6fSRomain Jobredeaux        progress_message = "Generating compile-time R %s" % r_srcjar.short_path,
901*9e965d6fSRomain Jobredeaux    )
902*9e965d6fSRomain Jobredeaux    return r_srcjar
903*9e965d6fSRomain Jobredeaux
904*9e965d6fSRomain Jobredeauxdef _compile(
905*9e965d6fSRomain Jobredeaux        ctx,
906*9e965d6fSRomain Jobredeaux        out_compiled_resources = None,
907*9e965d6fSRomain Jobredeaux        out_r_pb = None,
908*9e965d6fSRomain Jobredeaux        resource_files = [],
909*9e965d6fSRomain Jobredeaux        aapt = None,
910*9e965d6fSRomain Jobredeaux        android_kit = None,
911*9e965d6fSRomain Jobredeaux        busybox = None,
912*9e965d6fSRomain Jobredeaux        host_javabase = None):
913*9e965d6fSRomain Jobredeaux    """Compile Android Resources processing pipeline.
914*9e965d6fSRomain Jobredeaux
915*9e965d6fSRomain Jobredeaux    Args:
916*9e965d6fSRomain Jobredeaux      ctx: The context.
917*9e965d6fSRomain Jobredeaux      out_compiled_resources: File. The compiled resources output file.
918*9e965d6fSRomain Jobredeaux      out_r_pb: File. The R.pb output file.
919*9e965d6fSRomain Jobredeaux      resource_files: A list of Files. The resource files can be directories.
920*9e965d6fSRomain Jobredeaux      aapt: FilesToRunProvider. The aapt executable or FilesToRunProvider.
921*9e965d6fSRomain Jobredeaux      android_kit: FilesToRunProvider. The android_kit executable or
922*9e965d6fSRomain Jobredeaux        FilesToRunProvider.
923*9e965d6fSRomain Jobredeaux      busybox: FilesToRunProvider. The ResourceBusyBox executable or
924*9e965d6fSRomain Jobredeaux        FilesToRunprovider
925*9e965d6fSRomain Jobredeaux      host_javabase: A Target. The host javabase.
926*9e965d6fSRomain Jobredeaux    """
927*9e965d6fSRomain Jobredeaux    _liteparse(ctx, out_r_pb, resource_files, android_kit)
928*9e965d6fSRomain Jobredeaux    _busybox.compile(
929*9e965d6fSRomain Jobredeaux        ctx,
930*9e965d6fSRomain Jobredeaux        out_file = out_compiled_resources,
931*9e965d6fSRomain Jobredeaux        resource_files = resource_files,
932*9e965d6fSRomain Jobredeaux        aapt = aapt,
933*9e965d6fSRomain Jobredeaux        busybox = busybox,
934*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
935*9e965d6fSRomain Jobredeaux    )
936*9e965d6fSRomain Jobredeaux
937*9e965d6fSRomain Jobredeauxdef _make_aar(
938*9e965d6fSRomain Jobredeaux        ctx,
939*9e965d6fSRomain Jobredeaux        assets = [],
940*9e965d6fSRomain Jobredeaux        assets_dir = None,
941*9e965d6fSRomain Jobredeaux        resource_files = [],
942*9e965d6fSRomain Jobredeaux        class_jar = None,
943*9e965d6fSRomain Jobredeaux        r_txt = None,
944*9e965d6fSRomain Jobredeaux        manifest = None,
945*9e965d6fSRomain Jobredeaux        proguard_specs = [],
946*9e965d6fSRomain Jobredeaux        busybox = None,
947*9e965d6fSRomain Jobredeaux        host_javabase = None):
948*9e965d6fSRomain Jobredeaux    """Generate an android archive file.
949*9e965d6fSRomain Jobredeaux
950*9e965d6fSRomain Jobredeaux    Args:
951*9e965d6fSRomain Jobredeaux      ctx: The context.
952*9e965d6fSRomain Jobredeaux      assets: sequence of Files. A list of Android assets files to be processed.
953*9e965d6fSRomain Jobredeaux      assets_dir: String. The name of the assets directory.
954*9e965d6fSRomain Jobredeaux      resource_files: A list of Files. The resource files.
955*9e965d6fSRomain Jobredeaux      class_jar: File. The class jar file.
956*9e965d6fSRomain Jobredeaux      r_txt: File. The resource IDs outputted by linking resources in text.
957*9e965d6fSRomain Jobredeaux      manifest: File. The primary AndroidManifest.xml.
958*9e965d6fSRomain Jobredeaux      proguard_specs: List of File. The proguard spec files.
959*9e965d6fSRomain Jobredeaux      busybox: FilesToRunProvider. The ResourceBusyBox executable or
960*9e965d6fSRomain Jobredeaux        FilesToRunprovider
961*9e965d6fSRomain Jobredeaux      host_javabase: A Target. The host javabase.
962*9e965d6fSRomain Jobredeaux
963*9e965d6fSRomain Jobredeaux    Returns:
964*9e965d6fSRomain Jobredeaux      The output aar artifact.
965*9e965d6fSRomain Jobredeaux    """
966*9e965d6fSRomain Jobredeaux    aar = ctx.actions.declare_file(ctx.label.name + ".aar")
967*9e965d6fSRomain Jobredeaux    _busybox.make_aar(
968*9e965d6fSRomain Jobredeaux        ctx,
969*9e965d6fSRomain Jobredeaux        out_aar = aar,
970*9e965d6fSRomain Jobredeaux        assets = assets,
971*9e965d6fSRomain Jobredeaux        assets_dir = assets_dir,
972*9e965d6fSRomain Jobredeaux        resource_files = resource_files,
973*9e965d6fSRomain Jobredeaux        class_jar = class_jar,
974*9e965d6fSRomain Jobredeaux        r_txt = r_txt,
975*9e965d6fSRomain Jobredeaux        manifest = manifest,
976*9e965d6fSRomain Jobredeaux        proguard_specs = proguard_specs,
977*9e965d6fSRomain Jobredeaux        busybox = busybox,
978*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
979*9e965d6fSRomain Jobredeaux    )
980*9e965d6fSRomain Jobredeaux    return aar
981*9e965d6fSRomain Jobredeaux
982*9e965d6fSRomain Jobredeauxdef _validate(ctx, manifest, defined_assets, defined_assets_dir):
983*9e965d6fSRomain Jobredeaux    if ((defined_assets and not defined_assets_dir) or
984*9e965d6fSRomain Jobredeaux        (not defined_assets and defined_assets_dir)):
985*9e965d6fSRomain Jobredeaux        _log.error(_ASSET_DEFINITION_ERROR % ctx.label)
986*9e965d6fSRomain Jobredeaux
987*9e965d6fSRomain Jobredeaux    if not manifest:
988*9e965d6fSRomain Jobredeaux        _log.error(_MANIFEST_MISSING_ERROR % ctx.label)
989*9e965d6fSRomain Jobredeaux
990*9e965d6fSRomain Jobredeauxdef _make_direct_assets_transitive(assets_info):
991*9e965d6fSRomain Jobredeaux    return AndroidAssetsInfo(
992*9e965d6fSRomain Jobredeaux        assets_info.label,
993*9e965d6fSRomain Jobredeaux        assets_info.validation_result,
994*9e965d6fSRomain Jobredeaux        depset([]),  # direct_parsed_assets
995*9e965d6fSRomain Jobredeaux        depset(
996*9e965d6fSRomain Jobredeaux            transitive = [
997*9e965d6fSRomain Jobredeaux                assets_info.direct_parsed_assets,
998*9e965d6fSRomain Jobredeaux                assets_info.transitive_parsed_assets,
999*9e965d6fSRomain Jobredeaux            ],
1000*9e965d6fSRomain Jobredeaux            order = "preorder",
1001*9e965d6fSRomain Jobredeaux        ),
1002*9e965d6fSRomain Jobredeaux        assets_info.assets,
1003*9e965d6fSRomain Jobredeaux        assets_info.symbols,
1004*9e965d6fSRomain Jobredeaux        assets_info.compiled_symbols,
1005*9e965d6fSRomain Jobredeaux    )
1006*9e965d6fSRomain Jobredeaux
1007*9e965d6fSRomain Jobredeauxdef _make_direct_resources_transitive(resources_info):
1008*9e965d6fSRomain Jobredeaux    return AndroidResourcesInfo(
1009*9e965d6fSRomain Jobredeaux        resources_info.label,
1010*9e965d6fSRomain Jobredeaux        resources_info.manifest,
1011*9e965d6fSRomain Jobredeaux        resources_info.compiletime_r_txt,
1012*9e965d6fSRomain Jobredeaux        # NB: the ordering of "direct" and "transitive" is inconsistent with that used for
1013*9e965d6fSRomain Jobredeaux        # AndroidAssetsInfo.
1014*9e965d6fSRomain Jobredeaux        depset(
1015*9e965d6fSRomain Jobredeaux            transitive = [
1016*9e965d6fSRomain Jobredeaux                # Ordering is inconsistent here too:
1017*9e965d6fSRomain Jobredeaux                # https://github.com/bazelbuild/bazel/blob/82c7f48b4628ebbec18123afdbed701bbaa605e2/src/tools/android/java/com/google/devtools/build/android/Aapt2ResourcePackagingAction.java#L158
1018*9e965d6fSRomain Jobredeaux                resources_info.transitive_android_resources,
1019*9e965d6fSRomain Jobredeaux                resources_info.direct_android_resources,
1020*9e965d6fSRomain Jobredeaux            ],
1021*9e965d6fSRomain Jobredeaux            order = "preorder",
1022*9e965d6fSRomain Jobredeaux        ),
1023*9e965d6fSRomain Jobredeaux        depset([]),  # direct_android_resources
1024*9e965d6fSRomain Jobredeaux        resources_info.transitive_resources,
1025*9e965d6fSRomain Jobredeaux        resources_info.transitive_manifests,
1026*9e965d6fSRomain Jobredeaux        resources_info.transitive_aapt2_r_txt,
1027*9e965d6fSRomain Jobredeaux        resources_info.transitive_symbols_bin,
1028*9e965d6fSRomain Jobredeaux        resources_info.transitive_compiled_symbols,
1029*9e965d6fSRomain Jobredeaux        resources_info.transitive_static_lib,
1030*9e965d6fSRomain Jobredeaux        resources_info.transitive_r_txt,
1031*9e965d6fSRomain Jobredeaux        validation_artifacts = resources_info.validation_artifacts,
1032*9e965d6fSRomain Jobredeaux    )
1033*9e965d6fSRomain Jobredeaux
1034*9e965d6fSRomain Jobredeauxdef _export_assets(assets_info, exports):
1035*9e965d6fSRomain Jobredeaux    all_providers = [assets_info] + utils.collect_providers(AndroidAssetsInfo, exports)
1036*9e965d6fSRomain Jobredeaux    return AndroidAssetsInfo(
1037*9e965d6fSRomain Jobredeaux        assets_info.label,
1038*9e965d6fSRomain Jobredeaux        assets_info.validation_result,
1039*9e965d6fSRomain Jobredeaux        direct_parsed_assets = utils.join_depsets(all_providers, "direct_parsed_assets", order = "preorder"),
1040*9e965d6fSRomain Jobredeaux        transitive_parsed_assets = utils.join_depsets(all_providers, "transitive_parsed_assets", order = "preorder"),
1041*9e965d6fSRomain Jobredeaux        transitive_assets = utils.join_depsets(all_providers, "assets", order = "preorder"),
1042*9e965d6fSRomain Jobredeaux        transitive_symbols = utils.join_depsets(all_providers, "symbols", order = "preorder"),
1043*9e965d6fSRomain Jobredeaux        transitive_compiled_symbols = utils.join_depsets(all_providers, "compiled_symbols", order = "preorder"),
1044*9e965d6fSRomain Jobredeaux    )
1045*9e965d6fSRomain Jobredeaux
1046*9e965d6fSRomain Jobredeauxdef _export_resources(resources_info, exports):
1047*9e965d6fSRomain Jobredeaux    all_providers = [resources_info] + utils.collect_providers(AndroidResourcesInfo, exports)
1048*9e965d6fSRomain Jobredeaux    return AndroidResourcesInfo(
1049*9e965d6fSRomain Jobredeaux        resources_info.label,
1050*9e965d6fSRomain Jobredeaux        resources_info.manifest,
1051*9e965d6fSRomain Jobredeaux        resources_info.compiletime_r_txt,
1052*9e965d6fSRomain Jobredeaux        **{attr: utils.join_depsets(all_providers, attr, order = "preorder") for attr in [
1053*9e965d6fSRomain Jobredeaux            "transitive_android_resources",
1054*9e965d6fSRomain Jobredeaux            "direct_android_resources",
1055*9e965d6fSRomain Jobredeaux            "transitive_resources",
1056*9e965d6fSRomain Jobredeaux            "transitive_manifests",
1057*9e965d6fSRomain Jobredeaux            "transitive_aapt2_r_txt",
1058*9e965d6fSRomain Jobredeaux            "transitive_symbols_bin",
1059*9e965d6fSRomain Jobredeaux            "transitive_compiled_symbols",
1060*9e965d6fSRomain Jobredeaux            "transitive_static_lib",
1061*9e965d6fSRomain Jobredeaux            "transitive_r_txt",
1062*9e965d6fSRomain Jobredeaux            "validation_artifacts",
1063*9e965d6fSRomain Jobredeaux        ]}
1064*9e965d6fSRomain Jobredeaux    )
1065*9e965d6fSRomain Jobredeaux
1066*9e965d6fSRomain Jobredeauxdef _validate_resources(resource_files = None):
1067*9e965d6fSRomain Jobredeaux    for resource_file in resource_files:
1068*9e965d6fSRomain Jobredeaux        path_segments = resource_file.path.split("/")
1069*9e965d6fSRomain Jobredeaux        if len(path_segments) < 3:
1070*9e965d6fSRomain Jobredeaux            fail(_INCORRECT_RESOURCE_LAYOUT_ERROR % resource_file)
1071*9e965d6fSRomain Jobredeaux
1072*9e965d6fSRomain Jobredeaux        # Check the resource directory type if the resource file is not a Fileset.
1073*9e965d6fSRomain Jobredeaux        if not resource_file.is_directory:
1074*9e965d6fSRomain Jobredeaux            # The resource directory is presumed to be the second directory from the end.
1075*9e965d6fSRomain Jobredeaux            # Resource directories can have multiple qualifiers, each one separated with a dash.
1076*9e965d6fSRomain Jobredeaux            res_type = path_segments[-2].partition(_RESOURCE_QUALIFIER_SEP)[0]
1077*9e965d6fSRomain Jobredeaux            if res_type not in _RESOURCE_FOLDER_TYPES:
1078*9e965d6fSRomain Jobredeaux                fail(_INCORRECT_RESOURCE_LAYOUT_ERROR % resource_file)
1079*9e965d6fSRomain Jobredeaux
1080*9e965d6fSRomain Jobredeauxdef _process_manifest_values(ctx, manifest_values, min_sdk_floor):
1081*9e965d6fSRomain Jobredeaux    expanded_manifest_values = utils.expand_make_vars(ctx, manifest_values)
1082*9e965d6fSRomain Jobredeaux    if _MIN_SDK_VERSION in expanded_manifest_values and min_sdk_floor > 0:
1083*9e965d6fSRomain Jobredeaux        expanded_manifest_values[_MIN_SDK_VERSION] = str(
1084*9e965d6fSRomain Jobredeaux            max(int(expanded_manifest_values[_MIN_SDK_VERSION]), min_sdk_floor),
1085*9e965d6fSRomain Jobredeaux        )
1086*9e965d6fSRomain Jobredeaux    return expanded_manifest_values
1087*9e965d6fSRomain Jobredeaux
1088*9e965d6fSRomain Jobredeauxdef _bump_min_sdk(
1089*9e965d6fSRomain Jobredeaux        ctx,
1090*9e965d6fSRomain Jobredeaux        manifest = None,
1091*9e965d6fSRomain Jobredeaux        manifest_values = None,
1092*9e965d6fSRomain Jobredeaux        floor = None,
1093*9e965d6fSRomain Jobredeaux        enforce_min_sdk_floor_tool = None):
1094*9e965d6fSRomain Jobredeaux    """Bumps the min SDK attribute of AndroidManifest to the floor.
1095*9e965d6fSRomain Jobredeaux
1096*9e965d6fSRomain Jobredeaux    Args:
1097*9e965d6fSRomain Jobredeaux      ctx: The rules context.
1098*9e965d6fSRomain Jobredeaux      manifest: File. The AndroidManifest.xml file.
1099*9e965d6fSRomain Jobredeaux      manifest_values: Dictionary. The optional manifest_values to process.
1100*9e965d6fSRomain Jobredeaux      floor: int. The min SDK floor. Manifest is unchanged if floor <= 0.
1101*9e965d6fSRomain Jobredeaux      enforce_min_sdk_floor_tool: FilesToRunProvider. The enforce_min_sdk_tool executable or
1102*9e965d6fSRomain Jobredeaux        FilesToRunprovider
1103*9e965d6fSRomain Jobredeaux
1104*9e965d6fSRomain Jobredeaux    Returns:
1105*9e965d6fSRomain Jobredeaux      A dict containing _ManifestContextInfo provider fields.
1106*9e965d6fSRomain Jobredeaux    """
1107*9e965d6fSRomain Jobredeaux    manifest_ctx = {}
1108*9e965d6fSRomain Jobredeaux
1109*9e965d6fSRomain Jobredeaux    if floor == None:
1110*9e965d6fSRomain Jobredeaux        fail("Missing required `floor` in bump_min_sdk")
1111*9e965d6fSRomain Jobredeaux
1112*9e965d6fSRomain Jobredeaux    if manifest_values != None:
1113*9e965d6fSRomain Jobredeaux        manifest_ctx[_PROCESSED_MANIFEST_VALUES] = _process_manifest_values(
1114*9e965d6fSRomain Jobredeaux            ctx,
1115*9e965d6fSRomain Jobredeaux            manifest_values,
1116*9e965d6fSRomain Jobredeaux            floor,
1117*9e965d6fSRomain Jobredeaux        )
1118*9e965d6fSRomain Jobredeaux
1119*9e965d6fSRomain Jobredeaux    if not manifest or floor <= 0:
1120*9e965d6fSRomain Jobredeaux        manifest_ctx[_PROCESSED_MANIFEST] = manifest
1121*9e965d6fSRomain Jobredeaux        return _ManifestContextInfo(**manifest_ctx)
1122*9e965d6fSRomain Jobredeaux
1123*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
1124*9e965d6fSRomain Jobredeaux    args.add("-action", "bump")
1125*9e965d6fSRomain Jobredeaux    args.add("-manifest", manifest)
1126*9e965d6fSRomain Jobredeaux    args.add("-min_sdk_floor", floor)
1127*9e965d6fSRomain Jobredeaux
1128*9e965d6fSRomain Jobredeaux    out_dir = "_migrated/_min_sdk_bumped/" + ctx.label.name + "/"
1129*9e965d6fSRomain Jobredeaux    log = ctx.actions.declare_file(
1130*9e965d6fSRomain Jobredeaux        out_dir + "log.txt",
1131*9e965d6fSRomain Jobredeaux    )
1132*9e965d6fSRomain Jobredeaux    args.add("-log", log.path)
1133*9e965d6fSRomain Jobredeaux
1134*9e965d6fSRomain Jobredeaux    out_manifest = ctx.actions.declare_file(
1135*9e965d6fSRomain Jobredeaux        out_dir + "AndroidManifest.xml",
1136*9e965d6fSRomain Jobredeaux    )
1137*9e965d6fSRomain Jobredeaux    args.add("-output", out_manifest.path)
1138*9e965d6fSRomain Jobredeaux    ctx.actions.run(
1139*9e965d6fSRomain Jobredeaux        executable = enforce_min_sdk_floor_tool,
1140*9e965d6fSRomain Jobredeaux        inputs = [manifest],
1141*9e965d6fSRomain Jobredeaux        outputs = [out_manifest, log],
1142*9e965d6fSRomain Jobredeaux        arguments = [args],
1143*9e965d6fSRomain Jobredeaux        mnemonic = "BumpMinSdkFloor",
1144*9e965d6fSRomain Jobredeaux        progress_message = "Bumping up AndroidManifest min SDK %s" % str(ctx.label),
1145*9e965d6fSRomain Jobredeaux        toolchain = None,
1146*9e965d6fSRomain Jobredeaux    )
1147*9e965d6fSRomain Jobredeaux    manifest_ctx[_PROCESSED_MANIFEST] = out_manifest
1148*9e965d6fSRomain Jobredeaux
1149*9e965d6fSRomain Jobredeaux    return _ManifestContextInfo(**manifest_ctx)
1150*9e965d6fSRomain Jobredeaux
1151*9e965d6fSRomain Jobredeauxdef _set_default_min_sdk(
1152*9e965d6fSRomain Jobredeaux        ctx,
1153*9e965d6fSRomain Jobredeaux        manifest,
1154*9e965d6fSRomain Jobredeaux        default,
1155*9e965d6fSRomain Jobredeaux        enforce_min_sdk_floor_tool):
1156*9e965d6fSRomain Jobredeaux    """ Sets the min SDK attribute of AndroidManifest to default if it is not already set.
1157*9e965d6fSRomain Jobredeaux
1158*9e965d6fSRomain Jobredeaux    Args:
1159*9e965d6fSRomain Jobredeaux      ctx: The rules context.
1160*9e965d6fSRomain Jobredeaux      manifest: File. The AndroidManifest.xml file.
1161*9e965d6fSRomain Jobredeaux      default: string. The default value for min SDK. The manifest is unchanged if it already
1162*9e965d6fSRomain Jobredeaux        specifies a min SDK.
1163*9e965d6fSRomain Jobredeaux      enforce_min_sdk_floor_tool: FilesToRunProvider. The enforce_min_sdk_tool executable or
1164*9e965d6fSRomain Jobredeaux        FilesToRunprovider
1165*9e965d6fSRomain Jobredeaux
1166*9e965d6fSRomain Jobredeaux    Returns:
1167*9e965d6fSRomain Jobredeaux      A dict containing _ManifestContextInfo provider fields.
1168*9e965d6fSRomain Jobredeaux    """
1169*9e965d6fSRomain Jobredeaux    manifest_ctx = {}
1170*9e965d6fSRomain Jobredeaux    if not manifest or not default:
1171*9e965d6fSRomain Jobredeaux        manifest_ctx[_PROCESSED_MANIFEST] = manifest
1172*9e965d6fSRomain Jobredeaux        return _ManifestContextInfo(**manifest_ctx)
1173*9e965d6fSRomain Jobredeaux
1174*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
1175*9e965d6fSRomain Jobredeaux    args.add("-action", "set_default")
1176*9e965d6fSRomain Jobredeaux    args.add("-manifest", manifest)
1177*9e965d6fSRomain Jobredeaux    args.add("-default_min_sdk", default)
1178*9e965d6fSRomain Jobredeaux
1179*9e965d6fSRomain Jobredeaux    out_dir = "_migrated/_min_sdk_default_set/" + ctx.label.name + "/"
1180*9e965d6fSRomain Jobredeaux    log = ctx.actions.declare_file(
1181*9e965d6fSRomain Jobredeaux        out_dir + "log.txt",
1182*9e965d6fSRomain Jobredeaux    )
1183*9e965d6fSRomain Jobredeaux    args.add("-log", log.path)
1184*9e965d6fSRomain Jobredeaux
1185*9e965d6fSRomain Jobredeaux    out_manifest = ctx.actions.declare_file(
1186*9e965d6fSRomain Jobredeaux        out_dir + "AndroidManifest.xml",
1187*9e965d6fSRomain Jobredeaux    )
1188*9e965d6fSRomain Jobredeaux    args.add("-output", out_manifest.path)
1189*9e965d6fSRomain Jobredeaux    ctx.actions.run(
1190*9e965d6fSRomain Jobredeaux        executable = enforce_min_sdk_floor_tool,
1191*9e965d6fSRomain Jobredeaux        inputs = [manifest],
1192*9e965d6fSRomain Jobredeaux        outputs = [out_manifest, log],
1193*9e965d6fSRomain Jobredeaux        arguments = [args],
1194*9e965d6fSRomain Jobredeaux        mnemonic = "SetDefaultMinSdkFloor",
1195*9e965d6fSRomain Jobredeaux        progress_message = "Setting AndroidManifest min SDK to default %s" % str(ctx.label),
1196*9e965d6fSRomain Jobredeaux        toolchain = None,
1197*9e965d6fSRomain Jobredeaux    )
1198*9e965d6fSRomain Jobredeaux    manifest_ctx[_PROCESSED_MANIFEST] = out_manifest
1199*9e965d6fSRomain Jobredeaux
1200*9e965d6fSRomain Jobredeaux    return _ManifestContextInfo(**manifest_ctx)
1201*9e965d6fSRomain Jobredeaux
1202*9e965d6fSRomain Jobredeauxdef _validate_min_sdk(
1203*9e965d6fSRomain Jobredeaux        ctx,
1204*9e965d6fSRomain Jobredeaux        manifest,
1205*9e965d6fSRomain Jobredeaux        floor,
1206*9e965d6fSRomain Jobredeaux        enforce_min_sdk_floor_tool):
1207*9e965d6fSRomain Jobredeaux    """Validates that the min SDK attribute of AndroidManifest is at least at the floor.
1208*9e965d6fSRomain Jobredeaux
1209*9e965d6fSRomain Jobredeaux    Args:
1210*9e965d6fSRomain Jobredeaux      ctx: The rules context.
1211*9e965d6fSRomain Jobredeaux      manifest: File. The AndroidManifest.xml file.
1212*9e965d6fSRomain Jobredeaux      floor: int. The min SDK floor. No validation is done if floor <= 0.
1213*9e965d6fSRomain Jobredeaux      enforce_min_sdk_floor_tool: FilesToRunProvider. The enforce_min_sdk_tool executable or
1214*9e965d6fSRomain Jobredeaux        FilesToRunprovider
1215*9e965d6fSRomain Jobredeaux
1216*9e965d6fSRomain Jobredeaux    Returns:
1217*9e965d6fSRomain Jobredeaux      A dict containing _ManifestValidationContextInfo provider fields.
1218*9e965d6fSRomain Jobredeaux    """
1219*9e965d6fSRomain Jobredeaux    manifest_validation_ctx = {_VALIDATION_OUTPUTS: []}
1220*9e965d6fSRomain Jobredeaux    if not manifest or floor <= 0:
1221*9e965d6fSRomain Jobredeaux        return _ManifestValidationContextInfo(**manifest_validation_ctx)
1222*9e965d6fSRomain Jobredeaux
1223*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
1224*9e965d6fSRomain Jobredeaux    args.add("-action", "validate")
1225*9e965d6fSRomain Jobredeaux    args.add("-manifest", manifest)
1226*9e965d6fSRomain Jobredeaux    args.add("-min_sdk_floor", floor)
1227*9e965d6fSRomain Jobredeaux
1228*9e965d6fSRomain Jobredeaux    out_dir = "_migrated/_min_sdk_validated/" + ctx.label.name + "/"
1229*9e965d6fSRomain Jobredeaux    log = ctx.actions.declare_file(
1230*9e965d6fSRomain Jobredeaux        out_dir + "log.txt",
1231*9e965d6fSRomain Jobredeaux    )
1232*9e965d6fSRomain Jobredeaux    args.add("-log", log.path)
1233*9e965d6fSRomain Jobredeaux
1234*9e965d6fSRomain Jobredeaux    ctx.actions.run(
1235*9e965d6fSRomain Jobredeaux        executable = enforce_min_sdk_floor_tool,
1236*9e965d6fSRomain Jobredeaux        inputs = [manifest],
1237*9e965d6fSRomain Jobredeaux        outputs = [log],
1238*9e965d6fSRomain Jobredeaux        arguments = [args],
1239*9e965d6fSRomain Jobredeaux        mnemonic = "ValidateMinSdkFloor",
1240*9e965d6fSRomain Jobredeaux        progress_message = "Validating AndroidManifest min SDK %s" % str(ctx.label),
1241*9e965d6fSRomain Jobredeaux        toolchain = None,
1242*9e965d6fSRomain Jobredeaux    )
1243*9e965d6fSRomain Jobredeaux    manifest_validation_ctx[_VALIDATION_OUTPUTS].append(log)
1244*9e965d6fSRomain Jobredeaux
1245*9e965d6fSRomain Jobredeaux    return _ManifestValidationContextInfo(**manifest_validation_ctx)
1246*9e965d6fSRomain Jobredeaux
1247*9e965d6fSRomain Jobredeauxdef _process_starlark(
1248*9e965d6fSRomain Jobredeaux        ctx,
1249*9e965d6fSRomain Jobredeaux        java_package = None,
1250*9e965d6fSRomain Jobredeaux        manifest = None,
1251*9e965d6fSRomain Jobredeaux        defined_assets = False,
1252*9e965d6fSRomain Jobredeaux        assets = None,
1253*9e965d6fSRomain Jobredeaux        defined_assets_dir = False,
1254*9e965d6fSRomain Jobredeaux        assets_dir = None,
1255*9e965d6fSRomain Jobredeaux        exports_manifest = False,
1256*9e965d6fSRomain Jobredeaux        stamp_manifest = True,
1257*9e965d6fSRomain Jobredeaux        deps = [],
1258*9e965d6fSRomain Jobredeaux        resource_apks = [],
1259*9e965d6fSRomain Jobredeaux        exports = [],
1260*9e965d6fSRomain Jobredeaux        resource_files = None,
1261*9e965d6fSRomain Jobredeaux        neverlink = False,
1262*9e965d6fSRomain Jobredeaux        enable_data_binding = False,
1263*9e965d6fSRomain Jobredeaux        propagate_resources = True,
1264*9e965d6fSRomain Jobredeaux        fix_resource_transitivity = False,
1265*9e965d6fSRomain Jobredeaux        aapt = None,
1266*9e965d6fSRomain Jobredeaux        android_jar = None,
1267*9e965d6fSRomain Jobredeaux        android_kit = None,
1268*9e965d6fSRomain Jobredeaux        busybox = None,
1269*9e965d6fSRomain Jobredeaux        java_toolchain = None,
1270*9e965d6fSRomain Jobredeaux        host_javabase = None,
1271*9e965d6fSRomain Jobredeaux        instrument_xslt = None,
1272*9e965d6fSRomain Jobredeaux        xsltproc = None,
1273*9e965d6fSRomain Jobredeaux        zip_tool = None):
1274*9e965d6fSRomain Jobredeaux    """Processes Android Resources.
1275*9e965d6fSRomain Jobredeaux
1276*9e965d6fSRomain Jobredeaux    Args:
1277*9e965d6fSRomain Jobredeaux      ctx: The rules context.
1278*9e965d6fSRomain Jobredeaux      java_package: string. Java package for which java sources will be
1279*9e965d6fSRomain Jobredeaux        generated. By default the package is inferred from the directory where
1280*9e965d6fSRomain Jobredeaux        the BUILD file containing the rule is.
1281*9e965d6fSRomain Jobredeaux      manifest: File. The AndroidManifest.xml file.
1282*9e965d6fSRomain Jobredeaux      defined_assets: Bool. Signifies that the assets attribute was set, even
1283*9e965d6fSRomain Jobredeaux        if the value is an empty list.
1284*9e965d6fSRomain Jobredeaux      assets: sequence of Files. A list of Android assets files to be processed.
1285*9e965d6fSRomain Jobredeaux      defined_assets_dir: Bool. Signifies that the assets dir attribute was set,
1286*9e965d6fSRomain Jobredeaux        even if the value is an empty string.
1287*9e965d6fSRomain Jobredeaux      assets_dir: String. The name of the assets directory.
1288*9e965d6fSRomain Jobredeaux      exports_manifest: boolean. Whether to export manifest entries to the
1289*9e965d6fSRomain Jobredeaux        android_binary targets that depend on this target.
1290*9e965d6fSRomain Jobredeaux        NOTE: "uses-permissions" attributes are never exported.
1291*9e965d6fSRomain Jobredeaux      stamp_manifest: boolean. Whether to stamp the manifest with the java
1292*9e965d6fSRomain Jobredeaux        package of the target. If True, java_package needs to be passed to
1293*9e965d6fSRomain Jobredeaux        the function.
1294*9e965d6fSRomain Jobredeaux      deps: sequence of Targets. The list of other libraries targets to link
1295*9e965d6fSRomain Jobredeaux        against.
1296*9e965d6fSRomain Jobredeaux      resource_apks: sequence of resource apk files to link against.
1297*9e965d6fSRomain Jobredeaux      exports: sequence of Targets. The closure of all rules reached via exports
1298*9e965d6fSRomain Jobredeaux        attributes are considered direct dependencies of any rule that directly
1299*9e965d6fSRomain Jobredeaux        depends on the target with exports. The exports are not direct deps of
1300*9e965d6fSRomain Jobredeaux        the rule they belong to (TODO(b/144134042): make this so).
1301*9e965d6fSRomain Jobredeaux      resource_files: sequence of Files. A list of Android resource files to be
1302*9e965d6fSRomain Jobredeaux        processed.
1303*9e965d6fSRomain Jobredeaux      neverlink: boolean. Only use this library for compilation and not runtime.
1304*9e965d6fSRomain Jobredeaux        The outputs of a rule marked as neverlink will not be used in .apk
1305*9e965d6fSRomain Jobredeaux        creation. Useful if the library will be provided by the runtime
1306*9e965d6fSRomain Jobredeaux        environment during execution.
1307*9e965d6fSRomain Jobredeaux      enable_data_binding: boolean. If true, processesing the data binding
1308*9e965d6fSRomain Jobredeaux        expressions in layout resources included through the resource_files
1309*9e965d6fSRomain Jobredeaux        parameter is enabled. Without this setting, data binding expressions
1310*9e965d6fSRomain Jobredeaux        produce build failures.
1311*9e965d6fSRomain Jobredeaux      propagate_resources: boolean. If false, the target will no longer propagate
1312*9e965d6fSRomain Jobredeaux        providers required for Android Resource processing/packaging. But will
1313*9e965d6fSRomain Jobredeaux        continue to propagate others (AndroidLibraryResourceClassJarProvider).
1314*9e965d6fSRomain Jobredeaux      fix_resource_transitivity: Whether to ensure that transitive resources are
1315*9e965d6fSRomain Jobredeaux        correctly marked as transitive.
1316*9e965d6fSRomain Jobredeaux      aapt: FilesToRunProvider. The aapt executable or FilesToRunProvider.
1317*9e965d6fSRomain Jobredeaux      android_jar: File. The android Jar.
1318*9e965d6fSRomain Jobredeaux      android_kit: FilesToRunProvider. The android_kit executable or
1319*9e965d6fSRomain Jobredeaux        FilesToRunProvider.
1320*9e965d6fSRomain Jobredeaux      busybox: FilesToRunProvider. The ResourceBusyBox executable or
1321*9e965d6fSRomain Jobredeaux        FilesToRunprovider
1322*9e965d6fSRomain Jobredeaux      java_toolchain: The java_toolchain Target.
1323*9e965d6fSRomain Jobredeaux      host_javabase: Target. The host javabase.
1324*9e965d6fSRomain Jobredeaux      instrument_xslt: File. The xslt transform to apply g3itr.
1325*9e965d6fSRomain Jobredeaux      xsltproc: FilesToRunProvider. The xsltproc executable or FilesToRunProvider.
1326*9e965d6fSRomain Jobredeaux      zip_tool: FilesToRunProvider. The zip tool executable or FilesToRunProvider.
1327*9e965d6fSRomain Jobredeaux
1328*9e965d6fSRomain Jobredeaux    Returns:
1329*9e965d6fSRomain Jobredeaux      A dict containing _ResourcesProcessContextInfo provider fields.
1330*9e965d6fSRomain Jobredeaux    """
1331*9e965d6fSRomain Jobredeaux    if (xsltproc and not instrument_xslt) or (not xsltproc and instrument_xslt):
1332*9e965d6fSRomain Jobredeaux        fail(
1333*9e965d6fSRomain Jobredeaux            "Error, both instrument_xslt and xsltproc need to be " +
1334*9e965d6fSRomain Jobredeaux            "specified or not, got:\nxlstproc = %s\ninstrument_xslt = %s" %
1335*9e965d6fSRomain Jobredeaux            (xsltproc, instrument_xslt),
1336*9e965d6fSRomain Jobredeaux        )
1337*9e965d6fSRomain Jobredeaux
1338*9e965d6fSRomain Jobredeaux    _validate_resources(resource_files)
1339*9e965d6fSRomain Jobredeaux
1340*9e965d6fSRomain Jobredeaux    defines_resources = bool(
1341*9e965d6fSRomain Jobredeaux        manifest or
1342*9e965d6fSRomain Jobredeaux        resource_files or
1343*9e965d6fSRomain Jobredeaux        defined_assets or
1344*9e965d6fSRomain Jobredeaux        defined_assets_dir or
1345*9e965d6fSRomain Jobredeaux        exports_manifest,
1346*9e965d6fSRomain Jobredeaux    )
1347*9e965d6fSRomain Jobredeaux
1348*9e965d6fSRomain Jobredeaux    # TODO(djwhang): Clean up the difference between neverlink the attribute used
1349*9e965d6fSRomain Jobredeaux    # by Java compilation and resources neverlink.
1350*9e965d6fSRomain Jobredeaux    resources_neverlink = (
1351*9e965d6fSRomain Jobredeaux        neverlink and (
1352*9e965d6fSRomain Jobredeaux            defines_resources or
1353*9e965d6fSRomain Jobredeaux            ctx.fragments.android.fixed_resource_neverlinking
1354*9e965d6fSRomain Jobredeaux        )
1355*9e965d6fSRomain Jobredeaux    )
1356*9e965d6fSRomain Jobredeaux
1357*9e965d6fSRomain Jobredeaux    resources_ctx = {
1358*9e965d6fSRomain Jobredeaux        _RESOURCES_APK: None,
1359*9e965d6fSRomain Jobredeaux        _PROVIDERS: [],
1360*9e965d6fSRomain Jobredeaux        # TODO(b/156530953): Move the validation result to the validation_outputs list when we are
1361*9e965d6fSRomain Jobredeaux        # done rolling out Starlark resources processing
1362*9e965d6fSRomain Jobredeaux        _VALIDATION_RESULTS: [],
1363*9e965d6fSRomain Jobredeaux        _DEFINES_RESOURCES: defines_resources,
1364*9e965d6fSRomain Jobredeaux        _R_JAVA: None,
1365*9e965d6fSRomain Jobredeaux        _DATA_BINDING_LAYOUT_INFO: None,
1366*9e965d6fSRomain Jobredeaux        _MERGED_MANIFEST: None,
1367*9e965d6fSRomain Jobredeaux        _STARLARK_PROCESSED_MANIFEST: None,
1368*9e965d6fSRomain Jobredeaux        _STARLARK_R_TXT: None,
1369*9e965d6fSRomain Jobredeaux        _STARLARK_PROCESSED_RESOURCES: [],
1370*9e965d6fSRomain Jobredeaux    }
1371*9e965d6fSRomain Jobredeaux
1372*9e965d6fSRomain Jobredeaux    if resource_files and not manifest:
1373*9e965d6fSRomain Jobredeaux        _log.error(_MANIFEST_MISSING_ERROR % ctx.label)
1374*9e965d6fSRomain Jobredeaux
1375*9e965d6fSRomain Jobredeaux    direct_resources_nodes = []
1376*9e965d6fSRomain Jobredeaux    transitive_resources_nodes = []
1377*9e965d6fSRomain Jobredeaux    transitive_assets = []
1378*9e965d6fSRomain Jobredeaux    transitive_assets_symbols = []
1379*9e965d6fSRomain Jobredeaux    transitive_compiled_assets = []
1380*9e965d6fSRomain Jobredeaux    direct_compiled_resources = []
1381*9e965d6fSRomain Jobredeaux    transitive_compiled_resources = []
1382*9e965d6fSRomain Jobredeaux    transitive_resources_files = []
1383*9e965d6fSRomain Jobredeaux    transitive_manifests = []
1384*9e965d6fSRomain Jobredeaux    transitive_r_txts = []
1385*9e965d6fSRomain Jobredeaux    packages_to_r_txts_depset = dict()
1386*9e965d6fSRomain Jobredeaux    transitive_resource_apks = []
1387*9e965d6fSRomain Jobredeaux
1388*9e965d6fSRomain Jobredeaux    for dep in utils.collect_providers(StarlarkAndroidResourcesInfo, deps):
1389*9e965d6fSRomain Jobredeaux        direct_resources_nodes.append(dep.direct_resources_nodes)
1390*9e965d6fSRomain Jobredeaux        transitive_resources_nodes.append(dep.transitive_resources_nodes)
1391*9e965d6fSRomain Jobredeaux        transitive_assets.append(dep.transitive_assets)
1392*9e965d6fSRomain Jobredeaux        transitive_assets_symbols.append(dep.transitive_assets_symbols)
1393*9e965d6fSRomain Jobredeaux        transitive_compiled_assets.append(dep.transitive_compiled_assets)
1394*9e965d6fSRomain Jobredeaux        direct_compiled_resources.append(dep.direct_compiled_resources)
1395*9e965d6fSRomain Jobredeaux        transitive_compiled_resources.append(dep.transitive_compiled_resources)
1396*9e965d6fSRomain Jobredeaux        transitive_resources_files.append(dep.transitive_resource_files)
1397*9e965d6fSRomain Jobredeaux        transitive_manifests.append(dep.transitive_manifests)
1398*9e965d6fSRomain Jobredeaux        transitive_r_txts.append(dep.transitive_r_txts)
1399*9e965d6fSRomain Jobredeaux        for pkg, r_txts in dep.packages_to_r_txts.items():
1400*9e965d6fSRomain Jobredeaux            packages_to_r_txts_depset.setdefault(pkg, []).append(r_txts)
1401*9e965d6fSRomain Jobredeaux        transitive_resource_apks.append(dep.transitive_resource_apks)
1402*9e965d6fSRomain Jobredeaux    exports_direct_resources_nodes = []
1403*9e965d6fSRomain Jobredeaux    exports_transitive_resources_nodes = []
1404*9e965d6fSRomain Jobredeaux    exports_transitive_assets = []
1405*9e965d6fSRomain Jobredeaux    exports_transitive_assets_symbols = []
1406*9e965d6fSRomain Jobredeaux    exports_transitive_compiled_assets = []
1407*9e965d6fSRomain Jobredeaux    exports_direct_compiled_resources = []
1408*9e965d6fSRomain Jobredeaux    exports_transitive_compiled_resources = []
1409*9e965d6fSRomain Jobredeaux    exports_transitive_resources_files = []
1410*9e965d6fSRomain Jobredeaux    exports_transitive_manifests = []
1411*9e965d6fSRomain Jobredeaux    exports_transitive_r_txts = []
1412*9e965d6fSRomain Jobredeaux    for dep in utils.collect_providers(StarlarkAndroidResourcesInfo, exports):
1413*9e965d6fSRomain Jobredeaux        exports_direct_resources_nodes.append(dep.direct_resources_nodes)
1414*9e965d6fSRomain Jobredeaux        exports_transitive_resources_nodes.append(dep.transitive_resources_nodes)
1415*9e965d6fSRomain Jobredeaux        exports_transitive_assets.append(dep.transitive_assets)
1416*9e965d6fSRomain Jobredeaux        exports_transitive_assets_symbols.append(dep.transitive_assets_symbols)
1417*9e965d6fSRomain Jobredeaux        exports_transitive_compiled_assets.append(dep.transitive_compiled_assets)
1418*9e965d6fSRomain Jobredeaux        exports_direct_compiled_resources.append(dep.direct_compiled_resources)
1419*9e965d6fSRomain Jobredeaux        exports_transitive_compiled_resources.append(dep.transitive_compiled_resources)
1420*9e965d6fSRomain Jobredeaux        exports_transitive_resources_files.append(dep.transitive_resource_files)
1421*9e965d6fSRomain Jobredeaux        exports_transitive_manifests.append(dep.transitive_manifests)
1422*9e965d6fSRomain Jobredeaux        exports_transitive_r_txts.append(dep.transitive_r_txts)
1423*9e965d6fSRomain Jobredeaux        for pkg, r_txts in dep.packages_to_r_txts.items():
1424*9e965d6fSRomain Jobredeaux            packages_to_r_txts_depset.setdefault(pkg, []).append(r_txts)
1425*9e965d6fSRomain Jobredeaux
1426*9e965d6fSRomain Jobredeaux    # TODO(b/144134042): Don't merge exports; exports are not deps.
1427*9e965d6fSRomain Jobredeaux    direct_resources_nodes.extend(exports_direct_resources_nodes)
1428*9e965d6fSRomain Jobredeaux    transitive_resources_nodes.extend(exports_transitive_resources_nodes)
1429*9e965d6fSRomain Jobredeaux    transitive_assets.extend(exports_transitive_assets)
1430*9e965d6fSRomain Jobredeaux    transitive_assets_symbols.extend(exports_transitive_assets_symbols)
1431*9e965d6fSRomain Jobredeaux    transitive_compiled_assets.extend(exports_transitive_compiled_assets)
1432*9e965d6fSRomain Jobredeaux    direct_compiled_resources.extend(exports_direct_compiled_resources)
1433*9e965d6fSRomain Jobredeaux    transitive_compiled_resources.extend(exports_transitive_compiled_resources)
1434*9e965d6fSRomain Jobredeaux    transitive_resources_files.extend(exports_transitive_resources_files)
1435*9e965d6fSRomain Jobredeaux    transitive_manifests.extend(exports_transitive_manifests)
1436*9e965d6fSRomain Jobredeaux    transitive_r_txts.extend(exports_transitive_r_txts)
1437*9e965d6fSRomain Jobredeaux
1438*9e965d6fSRomain Jobredeaux    compiled_assets = None
1439*9e965d6fSRomain Jobredeaux    parsed_assets = None
1440*9e965d6fSRomain Jobredeaux    compiled_resources = None
1441*9e965d6fSRomain Jobredeaux    out_aapt2_r_txt = None
1442*9e965d6fSRomain Jobredeaux    r_txt = None
1443*9e965d6fSRomain Jobredeaux    data_binding_layout_info = None
1444*9e965d6fSRomain Jobredeaux    processed_resources = resource_files
1445*9e965d6fSRomain Jobredeaux    processed_manifest = None
1446*9e965d6fSRomain Jobredeaux    if not defines_resources:
1447*9e965d6fSRomain Jobredeaux        if aapt:
1448*9e965d6fSRomain Jobredeaux            # Generate an empty manifest with the right package
1449*9e965d6fSRomain Jobredeaux            generated_manifest = ctx.actions.declare_file(
1450*9e965d6fSRomain Jobredeaux                "_migrated/_generated/" + ctx.label.name + "/AndroidManifest.xml",
1451*9e965d6fSRomain Jobredeaux            )
1452*9e965d6fSRomain Jobredeaux            _generate_dummy_manifest(
1453*9e965d6fSRomain Jobredeaux                ctx,
1454*9e965d6fSRomain Jobredeaux                out_manifest = generated_manifest,
1455*9e965d6fSRomain Jobredeaux                java_package = java_package if java_package else ctx.label.package.replace("/", "."),
1456*9e965d6fSRomain Jobredeaux                min_sdk_version = acls.get_min_sdk_floor(str(ctx.label)),
1457*9e965d6fSRomain Jobredeaux            )
1458*9e965d6fSRomain Jobredeaux            r_txt = ctx.actions.declare_file(
1459*9e965d6fSRomain Jobredeaux                "_migrated/" + ctx.label.name + "_symbols/R.txt",
1460*9e965d6fSRomain Jobredeaux            )
1461*9e965d6fSRomain Jobredeaux            out_manifest = ctx.actions.declare_file(
1462*9e965d6fSRomain Jobredeaux                "_migrated/" + ctx.label.name + "_processed_manifest/AndroidManifest.xml",
1463*9e965d6fSRomain Jobredeaux            )
1464*9e965d6fSRomain Jobredeaux            _busybox.package(
1465*9e965d6fSRomain Jobredeaux                ctx,
1466*9e965d6fSRomain Jobredeaux                out_r_src_jar = ctx.actions.declare_file(
1467*9e965d6fSRomain Jobredeaux                    "_migrated/" + ctx.label.name + ".srcjar",
1468*9e965d6fSRomain Jobredeaux                ),
1469*9e965d6fSRomain Jobredeaux                out_r_txt = r_txt,
1470*9e965d6fSRomain Jobredeaux                out_manifest = out_manifest,
1471*9e965d6fSRomain Jobredeaux                manifest = generated_manifest,
1472*9e965d6fSRomain Jobredeaux                assets = assets,
1473*9e965d6fSRomain Jobredeaux                assets_dir = assets_dir,
1474*9e965d6fSRomain Jobredeaux                resource_files = resource_files,
1475*9e965d6fSRomain Jobredeaux                resource_apks = depset(resource_apks, transitive = transitive_resource_apks, order = "preorder"),
1476*9e965d6fSRomain Jobredeaux                direct_resources_nodes =
1477*9e965d6fSRomain Jobredeaux                    depset(transitive = direct_resources_nodes, order = "preorder"),
1478*9e965d6fSRomain Jobredeaux                transitive_resources_nodes =
1479*9e965d6fSRomain Jobredeaux                    depset(transitive = transitive_resources_nodes, order = "preorder"),
1480*9e965d6fSRomain Jobredeaux                transitive_assets = transitive_assets,
1481*9e965d6fSRomain Jobredeaux                transitive_compiled_assets = transitive_compiled_assets,
1482*9e965d6fSRomain Jobredeaux                transitive_resource_files = transitive_resources_files,
1483*9e965d6fSRomain Jobredeaux                transitive_compiled_resources = transitive_compiled_resources,
1484*9e965d6fSRomain Jobredeaux                transitive_manifests = transitive_manifests,
1485*9e965d6fSRomain Jobredeaux                transitive_r_txts = transitive_r_txts,
1486*9e965d6fSRomain Jobredeaux                package_type = "LIBRARY",
1487*9e965d6fSRomain Jobredeaux                java_package = java_package,
1488*9e965d6fSRomain Jobredeaux                android_jar = android_jar,
1489*9e965d6fSRomain Jobredeaux                aapt = aapt,
1490*9e965d6fSRomain Jobredeaux                busybox = busybox,
1491*9e965d6fSRomain Jobredeaux                host_javabase = host_javabase,
1492*9e965d6fSRomain Jobredeaux                should_throw_on_conflict = False,
1493*9e965d6fSRomain Jobredeaux            )
1494*9e965d6fSRomain Jobredeaux            resources_ctx[_STARLARK_PROCESSED_MANIFEST] = out_manifest
1495*9e965d6fSRomain Jobredeaux            resources_ctx[_STARLARK_R_TXT] = r_txt
1496*9e965d6fSRomain Jobredeaux            resources_ctx[_STARLARK_PROCESSED_RESOURCES] = resource_files
1497*9e965d6fSRomain Jobredeaux
1498*9e965d6fSRomain Jobredeaux    else:
1499*9e965d6fSRomain Jobredeaux        if stamp_manifest:
1500*9e965d6fSRomain Jobredeaux            stamped_manifest = ctx.actions.declare_file(
1501*9e965d6fSRomain Jobredeaux                "_migrated/_renamed/" + ctx.label.name + "/AndroidManifest.xml",
1502*9e965d6fSRomain Jobredeaux            )
1503*9e965d6fSRomain Jobredeaux            _busybox.merge_manifests(
1504*9e965d6fSRomain Jobredeaux                ctx,
1505*9e965d6fSRomain Jobredeaux                out_file = stamped_manifest,
1506*9e965d6fSRomain Jobredeaux                manifest = manifest,
1507*9e965d6fSRomain Jobredeaux                merge_type = "LIBRARY",
1508*9e965d6fSRomain Jobredeaux                java_package = java_package,
1509*9e965d6fSRomain Jobredeaux                busybox = busybox,
1510*9e965d6fSRomain Jobredeaux                host_javabase = host_javabase,
1511*9e965d6fSRomain Jobredeaux            )
1512*9e965d6fSRomain Jobredeaux            manifest = stamped_manifest
1513*9e965d6fSRomain Jobredeaux
1514*9e965d6fSRomain Jobredeaux        if instrument_xslt:
1515*9e965d6fSRomain Jobredeaux            g3itr_manifest = ctx.actions.declare_file(
1516*9e965d6fSRomain Jobredeaux                "_migrated/" + ctx.label.name + "_g3itr_manifest/AndroidManifest.xml",
1517*9e965d6fSRomain Jobredeaux            )
1518*9e965d6fSRomain Jobredeaux            _add_g3itr(
1519*9e965d6fSRomain Jobredeaux                ctx,
1520*9e965d6fSRomain Jobredeaux                out_manifest = g3itr_manifest,
1521*9e965d6fSRomain Jobredeaux                manifest = manifest,
1522*9e965d6fSRomain Jobredeaux                xsltproc = xsltproc,
1523*9e965d6fSRomain Jobredeaux                instrument_xslt = instrument_xslt,
1524*9e965d6fSRomain Jobredeaux            )
1525*9e965d6fSRomain Jobredeaux            manifest = g3itr_manifest
1526*9e965d6fSRomain Jobredeaux
1527*9e965d6fSRomain Jobredeaux        parsed_assets = ctx.actions.declare_file(
1528*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_symbols/assets.bin",
1529*9e965d6fSRomain Jobredeaux        )
1530*9e965d6fSRomain Jobredeaux        _busybox.parse(
1531*9e965d6fSRomain Jobredeaux            ctx,
1532*9e965d6fSRomain Jobredeaux            out_symbols = parsed_assets,
1533*9e965d6fSRomain Jobredeaux            assets = assets,
1534*9e965d6fSRomain Jobredeaux            assets_dir = assets_dir,
1535*9e965d6fSRomain Jobredeaux            busybox = busybox,
1536*9e965d6fSRomain Jobredeaux            host_javabase = host_javabase,
1537*9e965d6fSRomain Jobredeaux        )
1538*9e965d6fSRomain Jobredeaux        merged_assets = ctx.actions.declare_file(
1539*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_files/assets.zip",
1540*9e965d6fSRomain Jobredeaux        )
1541*9e965d6fSRomain Jobredeaux        _busybox.merge_assets(
1542*9e965d6fSRomain Jobredeaux            ctx,
1543*9e965d6fSRomain Jobredeaux            out_assets_zip = merged_assets,
1544*9e965d6fSRomain Jobredeaux            assets = assets,
1545*9e965d6fSRomain Jobredeaux            assets_dir = assets_dir,
1546*9e965d6fSRomain Jobredeaux            symbols = parsed_assets,
1547*9e965d6fSRomain Jobredeaux            direct_resources_nodes = depset(
1548*9e965d6fSRomain Jobredeaux                transitive = direct_resources_nodes,
1549*9e965d6fSRomain Jobredeaux                order = "preorder",
1550*9e965d6fSRomain Jobredeaux            ),
1551*9e965d6fSRomain Jobredeaux            transitive_resources_nodes = depset(
1552*9e965d6fSRomain Jobredeaux                transitive = transitive_resources_nodes,
1553*9e965d6fSRomain Jobredeaux                order = "preorder",
1554*9e965d6fSRomain Jobredeaux            ),
1555*9e965d6fSRomain Jobredeaux            transitive_assets = transitive_assets,
1556*9e965d6fSRomain Jobredeaux            transitive_assets_symbols = transitive_assets_symbols,
1557*9e965d6fSRomain Jobredeaux            busybox = busybox,
1558*9e965d6fSRomain Jobredeaux            host_javabase = host_javabase,
1559*9e965d6fSRomain Jobredeaux        )
1560*9e965d6fSRomain Jobredeaux        resources_ctx[_VALIDATION_RESULTS].append(merged_assets)
1561*9e965d6fSRomain Jobredeaux
1562*9e965d6fSRomain Jobredeaux        if assets:
1563*9e965d6fSRomain Jobredeaux            compiled_assets = ctx.actions.declare_file(
1564*9e965d6fSRomain Jobredeaux                "_migrated/" + ctx.label.name + "_symbols/assets.zip",
1565*9e965d6fSRomain Jobredeaux            )
1566*9e965d6fSRomain Jobredeaux            _busybox.compile(
1567*9e965d6fSRomain Jobredeaux                ctx,
1568*9e965d6fSRomain Jobredeaux                out_file = compiled_assets,
1569*9e965d6fSRomain Jobredeaux                assets = assets,
1570*9e965d6fSRomain Jobredeaux                assets_dir = assets_dir,
1571*9e965d6fSRomain Jobredeaux                aapt = aapt,
1572*9e965d6fSRomain Jobredeaux                busybox = busybox,
1573*9e965d6fSRomain Jobredeaux                host_javabase = host_javabase,
1574*9e965d6fSRomain Jobredeaux            )
1575*9e965d6fSRomain Jobredeaux
1576*9e965d6fSRomain Jobredeaux        if enable_data_binding:
1577*9e965d6fSRomain Jobredeaux            data_binding_layout_info = ctx.actions.declare_file(
1578*9e965d6fSRomain Jobredeaux                "_migrated/databinding/" + ctx.label.name + "/layout-info.zip",
1579*9e965d6fSRomain Jobredeaux            )
1580*9e965d6fSRomain Jobredeaux            processed_resources, resources_dirname = _make_databinding_outputs(
1581*9e965d6fSRomain Jobredeaux                ctx,
1582*9e965d6fSRomain Jobredeaux                resource_files,
1583*9e965d6fSRomain Jobredeaux            )
1584*9e965d6fSRomain Jobredeaux            _busybox.process_databinding(
1585*9e965d6fSRomain Jobredeaux                ctx,
1586*9e965d6fSRomain Jobredeaux                out_databinding_info = data_binding_layout_info,
1587*9e965d6fSRomain Jobredeaux                out_databinding_processed_resources = processed_resources,
1588*9e965d6fSRomain Jobredeaux                databinding_resources_dirname = resources_dirname,
1589*9e965d6fSRomain Jobredeaux                resource_files = resource_files,
1590*9e965d6fSRomain Jobredeaux                java_package = java_package,
1591*9e965d6fSRomain Jobredeaux                busybox = busybox,
1592*9e965d6fSRomain Jobredeaux                host_javabase = host_javabase,
1593*9e965d6fSRomain Jobredeaux            )
1594*9e965d6fSRomain Jobredeaux
1595*9e965d6fSRomain Jobredeaux        compiled_resources = ctx.actions.declare_file(
1596*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_symbols/symbols.zip",
1597*9e965d6fSRomain Jobredeaux        )
1598*9e965d6fSRomain Jobredeaux        _busybox.compile(
1599*9e965d6fSRomain Jobredeaux            ctx,
1600*9e965d6fSRomain Jobredeaux            out_file = compiled_resources,
1601*9e965d6fSRomain Jobredeaux            resource_files = processed_resources,
1602*9e965d6fSRomain Jobredeaux            aapt = aapt,
1603*9e965d6fSRomain Jobredeaux            busybox = busybox,
1604*9e965d6fSRomain Jobredeaux            host_javabase = host_javabase,
1605*9e965d6fSRomain Jobredeaux        )
1606*9e965d6fSRomain Jobredeaux
1607*9e965d6fSRomain Jobredeaux        # TODO(b/160907203): Remove this fix once the native resource processing pipeline is turned off.
1608*9e965d6fSRomain Jobredeaux        if enable_data_binding:
1609*9e965d6fSRomain Jobredeaux            fixed_compiled_resources = ctx.actions.declare_file(
1610*9e965d6fSRomain Jobredeaux                "_migrated/fixed/" + ctx.label.name + "_symbols/symbols.zip",
1611*9e965d6fSRomain Jobredeaux            )
1612*9e965d6fSRomain Jobredeaux            _fix_databinding_compiled_resources(
1613*9e965d6fSRomain Jobredeaux                ctx,
1614*9e965d6fSRomain Jobredeaux                out_compiled_resources = fixed_compiled_resources,
1615*9e965d6fSRomain Jobredeaux                compiled_resources = compiled_resources,
1616*9e965d6fSRomain Jobredeaux                zip_tool = zip_tool,
1617*9e965d6fSRomain Jobredeaux            )
1618*9e965d6fSRomain Jobredeaux            compiled_resources = fixed_compiled_resources
1619*9e965d6fSRomain Jobredeaux
1620*9e965d6fSRomain Jobredeaux        out_class_jar = ctx.actions.declare_file(
1621*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_resources.jar",
1622*9e965d6fSRomain Jobredeaux        )
1623*9e965d6fSRomain Jobredeaux        processed_manifest = ctx.actions.declare_file(
1624*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_processed_manifest/AndroidManifest.xml",
1625*9e965d6fSRomain Jobredeaux        )
1626*9e965d6fSRomain Jobredeaux        out_aapt2_r_txt = ctx.actions.declare_file(
1627*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_symbols/R.aapt2.txt",
1628*9e965d6fSRomain Jobredeaux        )
1629*9e965d6fSRomain Jobredeaux        _busybox.merge_compiled(
1630*9e965d6fSRomain Jobredeaux            ctx,
1631*9e965d6fSRomain Jobredeaux            out_class_jar = out_class_jar,
1632*9e965d6fSRomain Jobredeaux            out_manifest = processed_manifest,
1633*9e965d6fSRomain Jobredeaux            out_aapt2_r_txt = out_aapt2_r_txt,
1634*9e965d6fSRomain Jobredeaux            java_package = java_package,
1635*9e965d6fSRomain Jobredeaux            manifest = manifest,
1636*9e965d6fSRomain Jobredeaux            compiled_resources = compiled_resources,
1637*9e965d6fSRomain Jobredeaux            direct_resources_nodes =
1638*9e965d6fSRomain Jobredeaux                depset(transitive = direct_resources_nodes, order = "preorder"),
1639*9e965d6fSRomain Jobredeaux            transitive_resources_nodes = depset(
1640*9e965d6fSRomain Jobredeaux                transitive = transitive_resources_nodes,
1641*9e965d6fSRomain Jobredeaux                order = "preorder",
1642*9e965d6fSRomain Jobredeaux            ),
1643*9e965d6fSRomain Jobredeaux            direct_compiled_resources = depset(
1644*9e965d6fSRomain Jobredeaux                transitive = direct_compiled_resources,
1645*9e965d6fSRomain Jobredeaux                order = "preorder",
1646*9e965d6fSRomain Jobredeaux            ),
1647*9e965d6fSRomain Jobredeaux            transitive_compiled_resources = depset(
1648*9e965d6fSRomain Jobredeaux                transitive = transitive_compiled_resources,
1649*9e965d6fSRomain Jobredeaux                order = "preorder",
1650*9e965d6fSRomain Jobredeaux            ),
1651*9e965d6fSRomain Jobredeaux            android_jar = android_jar,
1652*9e965d6fSRomain Jobredeaux            busybox = busybox,
1653*9e965d6fSRomain Jobredeaux            host_javabase = host_javabase,
1654*9e965d6fSRomain Jobredeaux        )
1655*9e965d6fSRomain Jobredeaux        resources_ctx[_MERGED_MANIFEST] = processed_manifest
1656*9e965d6fSRomain Jobredeaux
1657*9e965d6fSRomain Jobredeaux        apk = ctx.actions.declare_file(
1658*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_files/library.ap_",
1659*9e965d6fSRomain Jobredeaux        )
1660*9e965d6fSRomain Jobredeaux        r_java = ctx.actions.declare_file(
1661*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + ".srcjar",
1662*9e965d6fSRomain Jobredeaux        )
1663*9e965d6fSRomain Jobredeaux        r_txt = ctx.actions.declare_file(
1664*9e965d6fSRomain Jobredeaux            "_migrated/" + ctx.label.name + "_symbols/R.txt",
1665*9e965d6fSRomain Jobredeaux        )
1666*9e965d6fSRomain Jobredeaux        _busybox.validate_and_link(
1667*9e965d6fSRomain Jobredeaux            ctx,
1668*9e965d6fSRomain Jobredeaux            out_r_src_jar = r_java,
1669*9e965d6fSRomain Jobredeaux            out_r_txt = r_txt,
1670*9e965d6fSRomain Jobredeaux            out_file = apk,
1671*9e965d6fSRomain Jobredeaux            compiled_resources = compiled_resources,
1672*9e965d6fSRomain Jobredeaux            transitive_compiled_resources = depset(
1673*9e965d6fSRomain Jobredeaux                transitive = transitive_compiled_resources,
1674*9e965d6fSRomain Jobredeaux                order = "preorder",
1675*9e965d6fSRomain Jobredeaux            ),
1676*9e965d6fSRomain Jobredeaux            java_package = java_package,
1677*9e965d6fSRomain Jobredeaux            manifest = processed_manifest,
1678*9e965d6fSRomain Jobredeaux            android_jar = android_jar,
1679*9e965d6fSRomain Jobredeaux            aapt = aapt,
1680*9e965d6fSRomain Jobredeaux            busybox = busybox,
1681*9e965d6fSRomain Jobredeaux            host_javabase = host_javabase,
1682*9e965d6fSRomain Jobredeaux            resource_apks = resource_apks,
1683*9e965d6fSRomain Jobredeaux        )
1684*9e965d6fSRomain Jobredeaux        resources_ctx[_RESOURCES_APK] = apk
1685*9e965d6fSRomain Jobredeaux
1686*9e965d6fSRomain Jobredeaux        java_info = JavaInfo(
1687*9e965d6fSRomain Jobredeaux            output_jar = out_class_jar,
1688*9e965d6fSRomain Jobredeaux            compile_jar = out_class_jar,
1689*9e965d6fSRomain Jobredeaux            source_jar = r_java,
1690*9e965d6fSRomain Jobredeaux        )
1691*9e965d6fSRomain Jobredeaux
1692*9e965d6fSRomain Jobredeaux        packages_to_r_txts_depset.setdefault(java_package, []).append(depset([out_aapt2_r_txt]))
1693*9e965d6fSRomain Jobredeaux
1694*9e965d6fSRomain Jobredeaux        resources_ctx[_R_JAVA] = java_info
1695*9e965d6fSRomain Jobredeaux        resources_ctx[_DATA_BINDING_LAYOUT_INFO] = data_binding_layout_info
1696*9e965d6fSRomain Jobredeaux
1697*9e965d6fSRomain Jobredeaux        # In a normal build, the outputs of _busybox.validate_and_link are unused. However we need
1698*9e965d6fSRomain Jobredeaux        # this action to run to support resource visibility checks.
1699*9e965d6fSRomain Jobredeaux        resources_ctx[_VALIDATION_RESULTS].append(r_txt)
1700*9e965d6fSRomain Jobredeaux
1701*9e965d6fSRomain Jobredeaux        # Needed for AAR generation. The Starlark resource processing pipeline uses the aapt2_r_txt file,
1702*9e965d6fSRomain Jobredeaux        # which is why we can't use the StarlarkAndroidResourcesInfo provider when generating the aar.
1703*9e965d6fSRomain Jobredeaux        resources_ctx[_STARLARK_PROCESSED_MANIFEST] = processed_manifest
1704*9e965d6fSRomain Jobredeaux        resources_ctx[_STARLARK_R_TXT] = r_txt
1705*9e965d6fSRomain Jobredeaux        resources_ctx[_STARLARK_PROCESSED_RESOURCES] = processed_resources
1706*9e965d6fSRomain Jobredeaux
1707*9e965d6fSRomain Jobredeaux    # TODO(b/117338320): Transitive lists defined here are incorrect; direct should come
1708*9e965d6fSRomain Jobredeaux    # before transitive, and the order should be topological order instead of preorder.
1709*9e965d6fSRomain Jobredeaux    # However, some applications may depend on this incorrect order.
1710*9e965d6fSRomain Jobredeaux    if defines_resources:
1711*9e965d6fSRomain Jobredeaux        transitive_resources_nodes = transitive_resources_nodes + direct_resources_nodes
1712*9e965d6fSRomain Jobredeaux        direct_resources_nodes = []
1713*9e965d6fSRomain Jobredeaux        transitive_compiled_resources = transitive_compiled_resources + direct_compiled_resources
1714*9e965d6fSRomain Jobredeaux        direct_compiled_resources = []
1715*9e965d6fSRomain Jobredeaux    else:
1716*9e965d6fSRomain Jobredeaux        if fix_resource_transitivity:
1717*9e965d6fSRomain Jobredeaux            transitive_resources_nodes = transitive_resources_nodes + direct_resources_nodes
1718*9e965d6fSRomain Jobredeaux            direct_resources_nodes = []
1719*9e965d6fSRomain Jobredeaux            transitive_compiled_resources = transitive_compiled_resources + direct_compiled_resources
1720*9e965d6fSRomain Jobredeaux            direct_compiled_resources = []
1721*9e965d6fSRomain Jobredeaux
1722*9e965d6fSRomain Jobredeaux        # TODO(b/144163743): If the resource transitivity fix is disabled and resources-related
1723*9e965d6fSRomain Jobredeaux        # inputs are missing, we implicitly export deps here. This legacy behavior must exist in the
1724*9e965d6fSRomain Jobredeaux        # Starlark resource processing pipeline until we can clean up the depot.
1725*9e965d6fSRomain Jobredeaux
1726*9e965d6fSRomain Jobredeaux    packages_to_r_txts = dict()
1727*9e965d6fSRomain Jobredeaux    for pkg, depsets in packages_to_r_txts_depset.items():
1728*9e965d6fSRomain Jobredeaux        packages_to_r_txts[pkg] = depset(transitive = depsets)
1729*9e965d6fSRomain Jobredeaux
1730*9e965d6fSRomain Jobredeaux    # TODO(b/159916013): Audit neverlink behavior. Some processing can likely be skipped if the target is neverlink.
1731*9e965d6fSRomain Jobredeaux    # TODO(b/69668042): Don't propagate exported providers/artifacts. Exports should respect neverlink.
1732*9e965d6fSRomain Jobredeaux    if resources_neverlink:
1733*9e965d6fSRomain Jobredeaux        resources_ctx[_PROVIDERS].append(StarlarkAndroidResourcesInfo(
1734*9e965d6fSRomain Jobredeaux            direct_resources_nodes = depset(
1735*9e965d6fSRomain Jobredeaux                transitive = exports_direct_resources_nodes,
1736*9e965d6fSRomain Jobredeaux                order = "preorder",
1737*9e965d6fSRomain Jobredeaux            ),
1738*9e965d6fSRomain Jobredeaux            transitive_resources_nodes = depset(
1739*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_resources_nodes,
1740*9e965d6fSRomain Jobredeaux                order = "preorder",
1741*9e965d6fSRomain Jobredeaux            ),
1742*9e965d6fSRomain Jobredeaux            transitive_assets = depset(
1743*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_assets,
1744*9e965d6fSRomain Jobredeaux                order = "preorder",
1745*9e965d6fSRomain Jobredeaux            ),
1746*9e965d6fSRomain Jobredeaux            transitive_assets_symbols = depset(
1747*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_assets_symbols,
1748*9e965d6fSRomain Jobredeaux                order = "preorder",
1749*9e965d6fSRomain Jobredeaux            ),
1750*9e965d6fSRomain Jobredeaux            transitive_compiled_assets = depset(
1751*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_compiled_assets,
1752*9e965d6fSRomain Jobredeaux                order = "preorder",
1753*9e965d6fSRomain Jobredeaux            ),
1754*9e965d6fSRomain Jobredeaux            transitive_resource_files = depset(
1755*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_resources_files,
1756*9e965d6fSRomain Jobredeaux                order = "preorder",
1757*9e965d6fSRomain Jobredeaux            ),
1758*9e965d6fSRomain Jobredeaux            direct_compiled_resources = depset(
1759*9e965d6fSRomain Jobredeaux                transitive = exports_direct_compiled_resources,
1760*9e965d6fSRomain Jobredeaux                order = "preorder",
1761*9e965d6fSRomain Jobredeaux            ),
1762*9e965d6fSRomain Jobredeaux            transitive_compiled_resources = depset(
1763*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_compiled_resources,
1764*9e965d6fSRomain Jobredeaux                order = "preorder",
1765*9e965d6fSRomain Jobredeaux            ),
1766*9e965d6fSRomain Jobredeaux            transitive_manifests = depset(
1767*9e965d6fSRomain Jobredeaux                [processed_manifest] if processed_manifest else [],
1768*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_manifests,
1769*9e965d6fSRomain Jobredeaux                order = "preorder",
1770*9e965d6fSRomain Jobredeaux            ),
1771*9e965d6fSRomain Jobredeaux            transitive_r_txts = depset(
1772*9e965d6fSRomain Jobredeaux                [out_aapt2_r_txt] if out_aapt2_r_txt else [],
1773*9e965d6fSRomain Jobredeaux                transitive = exports_transitive_r_txts,
1774*9e965d6fSRomain Jobredeaux                order = "preorder",
1775*9e965d6fSRomain Jobredeaux            ),
1776*9e965d6fSRomain Jobredeaux            packages_to_r_txts = packages_to_r_txts,
1777*9e965d6fSRomain Jobredeaux            transitive_resource_apks = depset(
1778*9e965d6fSRomain Jobredeaux                resource_apks,
1779*9e965d6fSRomain Jobredeaux                transitive = transitive_resource_apks,
1780*9e965d6fSRomain Jobredeaux                order = "preorder",
1781*9e965d6fSRomain Jobredeaux            ),
1782*9e965d6fSRomain Jobredeaux        ))
1783*9e965d6fSRomain Jobredeaux    else:
1784*9e965d6fSRomain Jobredeaux        # Depsets are ordered below to match the order in the legacy native rules.
1785*9e965d6fSRomain Jobredeaux        resources_ctx[_PROVIDERS].append(StarlarkAndroidResourcesInfo(
1786*9e965d6fSRomain Jobredeaux            direct_resources_nodes = depset(
1787*9e965d6fSRomain Jobredeaux                [ResourcesNodeInfo(
1788*9e965d6fSRomain Jobredeaux                    label = ctx.label,
1789*9e965d6fSRomain Jobredeaux                    assets = depset(assets),
1790*9e965d6fSRomain Jobredeaux                    assets_dir = assets_dir,
1791*9e965d6fSRomain Jobredeaux                    assets_symbols = parsed_assets,
1792*9e965d6fSRomain Jobredeaux                    compiled_assets = compiled_assets,
1793*9e965d6fSRomain Jobredeaux                    resource_apks = depset(resource_apks),
1794*9e965d6fSRomain Jobredeaux                    resource_files = depset(processed_resources),
1795*9e965d6fSRomain Jobredeaux                    compiled_resources = compiled_resources,
1796*9e965d6fSRomain Jobredeaux                    r_txt = out_aapt2_r_txt,
1797*9e965d6fSRomain Jobredeaux                    manifest = processed_manifest,
1798*9e965d6fSRomain Jobredeaux                    exports_manifest = exports_manifest,
1799*9e965d6fSRomain Jobredeaux                )] if defines_resources else [],
1800*9e965d6fSRomain Jobredeaux                transitive = direct_resources_nodes + exports_direct_resources_nodes,
1801*9e965d6fSRomain Jobredeaux                order = "preorder",
1802*9e965d6fSRomain Jobredeaux            ),
1803*9e965d6fSRomain Jobredeaux            transitive_resources_nodes = depset(
1804*9e965d6fSRomain Jobredeaux                transitive = transitive_resources_nodes + exports_transitive_resources_nodes,
1805*9e965d6fSRomain Jobredeaux                order = "preorder",
1806*9e965d6fSRomain Jobredeaux            ),
1807*9e965d6fSRomain Jobredeaux            transitive_assets = depset(
1808*9e965d6fSRomain Jobredeaux                assets,
1809*9e965d6fSRomain Jobredeaux                transitive = transitive_assets + exports_transitive_assets,
1810*9e965d6fSRomain Jobredeaux                order = "preorder",
1811*9e965d6fSRomain Jobredeaux            ),
1812*9e965d6fSRomain Jobredeaux            transitive_assets_symbols = depset(
1813*9e965d6fSRomain Jobredeaux                [parsed_assets] if parsed_assets else [],
1814*9e965d6fSRomain Jobredeaux                transitive = transitive_assets_symbols + exports_transitive_assets_symbols,
1815*9e965d6fSRomain Jobredeaux                order = "preorder",
1816*9e965d6fSRomain Jobredeaux            ),
1817*9e965d6fSRomain Jobredeaux            transitive_compiled_assets = depset(
1818*9e965d6fSRomain Jobredeaux                [compiled_assets] if compiled_assets else [],
1819*9e965d6fSRomain Jobredeaux                transitive = transitive_compiled_assets + exports_transitive_compiled_assets,
1820*9e965d6fSRomain Jobredeaux                order = "preorder",
1821*9e965d6fSRomain Jobredeaux            ),
1822*9e965d6fSRomain Jobredeaux            transitive_resource_files = depset(
1823*9e965d6fSRomain Jobredeaux                processed_resources,
1824*9e965d6fSRomain Jobredeaux                transitive = transitive_resources_files + exports_transitive_resources_files,
1825*9e965d6fSRomain Jobredeaux                order = "preorder",
1826*9e965d6fSRomain Jobredeaux            ),
1827*9e965d6fSRomain Jobredeaux            direct_compiled_resources = depset(
1828*9e965d6fSRomain Jobredeaux                [compiled_resources] if compiled_resources else [],
1829*9e965d6fSRomain Jobredeaux                transitive = direct_compiled_resources + exports_direct_compiled_resources,
1830*9e965d6fSRomain Jobredeaux                order = "preorder",
1831*9e965d6fSRomain Jobredeaux            ),
1832*9e965d6fSRomain Jobredeaux            transitive_compiled_resources = depset(
1833*9e965d6fSRomain Jobredeaux                [compiled_resources] if compiled_resources else [],
1834*9e965d6fSRomain Jobredeaux                transitive = transitive_compiled_resources + exports_transitive_compiled_resources,
1835*9e965d6fSRomain Jobredeaux                order = "preorder",
1836*9e965d6fSRomain Jobredeaux            ),
1837*9e965d6fSRomain Jobredeaux            transitive_manifests = depset(
1838*9e965d6fSRomain Jobredeaux                [processed_manifest] if processed_manifest else [],
1839*9e965d6fSRomain Jobredeaux                transitive = transitive_manifests + exports_transitive_manifests,
1840*9e965d6fSRomain Jobredeaux                order = "preorder",
1841*9e965d6fSRomain Jobredeaux            ),
1842*9e965d6fSRomain Jobredeaux            transitive_r_txts = depset(
1843*9e965d6fSRomain Jobredeaux                [out_aapt2_r_txt] if out_aapt2_r_txt else [],
1844*9e965d6fSRomain Jobredeaux                transitive = transitive_r_txts + exports_transitive_r_txts,
1845*9e965d6fSRomain Jobredeaux                order = "preorder",
1846*9e965d6fSRomain Jobredeaux            ),
1847*9e965d6fSRomain Jobredeaux            packages_to_r_txts = packages_to_r_txts,
1848*9e965d6fSRomain Jobredeaux            transitive_resource_apks = depset(
1849*9e965d6fSRomain Jobredeaux                resource_apks,
1850*9e965d6fSRomain Jobredeaux                transitive = transitive_resource_apks,
1851*9e965d6fSRomain Jobredeaux                order = "preorder",
1852*9e965d6fSRomain Jobredeaux            ),
1853*9e965d6fSRomain Jobredeaux        ))
1854*9e965d6fSRomain Jobredeaux
1855*9e965d6fSRomain Jobredeaux    if not propagate_resources:
1856*9e965d6fSRomain Jobredeaux        resources_ctx[_R_JAVA] = None
1857*9e965d6fSRomain Jobredeaux        resources_ctx[_PROVIDERS] = []
1858*9e965d6fSRomain Jobredeaux
1859*9e965d6fSRomain Jobredeaux    # TODO(b/69552500): In the Starlark Android Rules, the R compile time
1860*9e965d6fSRomain Jobredeaux    # JavaInfo is added as a runtime dependency to the JavaInfo. Stop
1861*9e965d6fSRomain Jobredeaux    # adding the R.jar as a runtime dependency.
1862*9e965d6fSRomain Jobredeaux    resources_ctx[_PROVIDERS].append(
1863*9e965d6fSRomain Jobredeaux        AndroidLibraryResourceClassJarProvider(
1864*9e965d6fSRomain Jobredeaux            depset(
1865*9e965d6fSRomain Jobredeaux                (resources_ctx[_R_JAVA].runtime_output_jars if resources_ctx[_R_JAVA] else []),
1866*9e965d6fSRomain Jobredeaux                transitive = [
1867*9e965d6fSRomain Jobredeaux                    p.jars
1868*9e965d6fSRomain Jobredeaux                    for p in utils.collect_providers(
1869*9e965d6fSRomain Jobredeaux                        AndroidLibraryResourceClassJarProvider,
1870*9e965d6fSRomain Jobredeaux                        deps,
1871*9e965d6fSRomain Jobredeaux                        exports,
1872*9e965d6fSRomain Jobredeaux                    )
1873*9e965d6fSRomain Jobredeaux                ],
1874*9e965d6fSRomain Jobredeaux                order = "preorder",
1875*9e965d6fSRomain Jobredeaux            ),
1876*9e965d6fSRomain Jobredeaux        ),
1877*9e965d6fSRomain Jobredeaux    )
1878*9e965d6fSRomain Jobredeaux
1879*9e965d6fSRomain Jobredeaux    return resources_ctx
1880*9e965d6fSRomain Jobredeaux
1881*9e965d6fSRomain Jobredeauxdef _process(
1882*9e965d6fSRomain Jobredeaux        ctx,
1883*9e965d6fSRomain Jobredeaux        manifest = None,
1884*9e965d6fSRomain Jobredeaux        resource_files = None,
1885*9e965d6fSRomain Jobredeaux        defined_assets = False,
1886*9e965d6fSRomain Jobredeaux        assets = None,
1887*9e965d6fSRomain Jobredeaux        defined_assets_dir = False,
1888*9e965d6fSRomain Jobredeaux        assets_dir = None,
1889*9e965d6fSRomain Jobredeaux        exports_manifest = False,
1890*9e965d6fSRomain Jobredeaux        java_package = None,
1891*9e965d6fSRomain Jobredeaux        custom_package = None,
1892*9e965d6fSRomain Jobredeaux        neverlink = False,
1893*9e965d6fSRomain Jobredeaux        enable_data_binding = False,
1894*9e965d6fSRomain Jobredeaux        deps = [],
1895*9e965d6fSRomain Jobredeaux        resource_apks = [],
1896*9e965d6fSRomain Jobredeaux        exports = [],
1897*9e965d6fSRomain Jobredeaux        android_jar = None,
1898*9e965d6fSRomain Jobredeaux        android_kit = None,
1899*9e965d6fSRomain Jobredeaux        aapt = None,
1900*9e965d6fSRomain Jobredeaux        busybox = None,
1901*9e965d6fSRomain Jobredeaux        xsltproc = None,
1902*9e965d6fSRomain Jobredeaux        instrument_xslt = None,
1903*9e965d6fSRomain Jobredeaux        java_toolchain = None,
1904*9e965d6fSRomain Jobredeaux        host_javabase = None,
1905*9e965d6fSRomain Jobredeaux        enable_res_v3 = False,
1906*9e965d6fSRomain Jobredeaux        res_v3_dummy_manifest = None,
1907*9e965d6fSRomain Jobredeaux        res_v3_dummy_r_txt = None,
1908*9e965d6fSRomain Jobredeaux        fix_resource_transitivity = False,
1909*9e965d6fSRomain Jobredeaux        fix_export_exporting = False,
1910*9e965d6fSRomain Jobredeaux        propagate_resources = True,
1911*9e965d6fSRomain Jobredeaux        zip_tool = None):
1912*9e965d6fSRomain Jobredeaux    out_ctx = _process_starlark(
1913*9e965d6fSRomain Jobredeaux        ctx,
1914*9e965d6fSRomain Jobredeaux        java_package = java_package,
1915*9e965d6fSRomain Jobredeaux        manifest = manifest,
1916*9e965d6fSRomain Jobredeaux        defined_assets = defined_assets,
1917*9e965d6fSRomain Jobredeaux        # TODO(b/159937795): When the Starlark Resources Processing pipeline is
1918*9e965d6fSRomain Jobredeaux        # default and the native version is no longer used, remove the depset
1919*9e965d6fSRomain Jobredeaux        # creation and directly pass through ctx.files.assets to this method.
1920*9e965d6fSRomain Jobredeaux        assets =
1921*9e965d6fSRomain Jobredeaux            depset(transitive = [target.files for target in assets]).to_list(),
1922*9e965d6fSRomain Jobredeaux        defined_assets_dir = defined_assets_dir,
1923*9e965d6fSRomain Jobredeaux        assets_dir = assets_dir,
1924*9e965d6fSRomain Jobredeaux        exports_manifest = exports_manifest,
1925*9e965d6fSRomain Jobredeaux        stamp_manifest = True if java_package else False,
1926*9e965d6fSRomain Jobredeaux        deps = deps,
1927*9e965d6fSRomain Jobredeaux        resource_apks = resource_apks,
1928*9e965d6fSRomain Jobredeaux        exports = exports,
1929*9e965d6fSRomain Jobredeaux        resource_files = depset(transitive = [target.files for target in resource_files]).to_list(),
1930*9e965d6fSRomain Jobredeaux        enable_data_binding = enable_data_binding,
1931*9e965d6fSRomain Jobredeaux        fix_resource_transitivity = fix_resource_transitivity,
1932*9e965d6fSRomain Jobredeaux        neverlink = neverlink,
1933*9e965d6fSRomain Jobredeaux        propagate_resources = propagate_resources,
1934*9e965d6fSRomain Jobredeaux        android_jar = android_jar,
1935*9e965d6fSRomain Jobredeaux        aapt = aapt,
1936*9e965d6fSRomain Jobredeaux        android_kit = android_kit,
1937*9e965d6fSRomain Jobredeaux        busybox = busybox,
1938*9e965d6fSRomain Jobredeaux        instrument_xslt = instrument_xslt,
1939*9e965d6fSRomain Jobredeaux        xsltproc = xsltproc,
1940*9e965d6fSRomain Jobredeaux        java_toolchain = java_toolchain,
1941*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
1942*9e965d6fSRomain Jobredeaux        zip_tool = zip_tool,
1943*9e965d6fSRomain Jobredeaux    )
1944*9e965d6fSRomain Jobredeaux
1945*9e965d6fSRomain Jobredeaux    if _VALIDATION_OUTPUTS not in out_ctx:
1946*9e965d6fSRomain Jobredeaux        out_ctx[_VALIDATION_OUTPUTS] = []
1947*9e965d6fSRomain Jobredeaux
1948*9e965d6fSRomain Jobredeaux    return _ResourcesProcessContextInfo(**out_ctx)
1949*9e965d6fSRomain Jobredeaux
1950*9e965d6fSRomain Jobredeauxdef _shrink(
1951*9e965d6fSRomain Jobredeaux        ctx,
1952*9e965d6fSRomain Jobredeaux        resources_zip = None,
1953*9e965d6fSRomain Jobredeaux        aapt = None,
1954*9e965d6fSRomain Jobredeaux        android_jar = None,
1955*9e965d6fSRomain Jobredeaux        r_txt = None,
1956*9e965d6fSRomain Jobredeaux        shrunk_jar = None,
1957*9e965d6fSRomain Jobredeaux        proguard_mapping = None,
1958*9e965d6fSRomain Jobredeaux        busybox = None,
1959*9e965d6fSRomain Jobredeaux        host_javabase = None):
1960*9e965d6fSRomain Jobredeaux    """Shrinks the resources apk.
1961*9e965d6fSRomain Jobredeaux
1962*9e965d6fSRomain Jobredeaux    Args:
1963*9e965d6fSRomain Jobredeaux        ctx: The context.
1964*9e965d6fSRomain Jobredeaux        resources_zip: File. The input resources file zip containing the merged assets and resources to be shrunk.
1965*9e965d6fSRomain Jobredeaux        aapt: FilesToRunProvider. The AAPT executable.
1966*9e965d6fSRomain Jobredeaux        android_jar: File. The Android Jar.
1967*9e965d6fSRomain Jobredeaux        r_txt: File. The resource IDs outputted by linking resources in text.
1968*9e965d6fSRomain Jobredeaux        shrunk_jar: File. The proguarded output jar.
1969*9e965d6fSRomain Jobredeaux        proguard_mapping: File. The Proguard Mapping file.
1970*9e965d6fSRomain Jobredeaux        busybox: FilesToRunProvider. The ResourceBusyBox executable.
1971*9e965d6fSRomain Jobredeaux        host_javabase: Target. The host javabase.
1972*9e965d6fSRomain Jobredeaux
1973*9e965d6fSRomain Jobredeaux    Returns:
1974*9e965d6fSRomain Jobredeaux        A dict contaning all of the shrunk resource outputs.
1975*9e965d6fSRomain Jobredeaux    """
1976*9e965d6fSRomain Jobredeaux    shrunk_ctx = {
1977*9e965d6fSRomain Jobredeaux        _SHRUNK_RESOURCE_APK: None,
1978*9e965d6fSRomain Jobredeaux        _SHRUNK_RESOURCE_ZIP: None,
1979*9e965d6fSRomain Jobredeaux        _RESOURCE_SHRINKER_LOG: None,
1980*9e965d6fSRomain Jobredeaux        _RESOURCE_OPTIMIZATION_CONFIG: None,
1981*9e965d6fSRomain Jobredeaux    }
1982*9e965d6fSRomain Jobredeaux
1983*9e965d6fSRomain Jobredeaux    out_apk = ctx.actions.declare_file(ctx.label.name + "_shrunk.ap_")
1984*9e965d6fSRomain Jobredeaux    out_zip = ctx.actions.declare_file(ctx.label.name + "_files/resource_files_shrunk.zip")
1985*9e965d6fSRomain Jobredeaux    out_log = ctx.actions.declare_file(ctx.label.name + "_files/resource_shrinker.log")
1986*9e965d6fSRomain Jobredeaux    out_config = ctx.actions.declare_file(ctx.label.name + "_files/resource_optimization.cfg")
1987*9e965d6fSRomain Jobredeaux    _busybox.shrink(
1988*9e965d6fSRomain Jobredeaux        ctx,
1989*9e965d6fSRomain Jobredeaux        out_apk,
1990*9e965d6fSRomain Jobredeaux        out_zip,
1991*9e965d6fSRomain Jobredeaux        out_log,
1992*9e965d6fSRomain Jobredeaux        out_config,
1993*9e965d6fSRomain Jobredeaux        resources_zip = resources_zip,
1994*9e965d6fSRomain Jobredeaux        aapt = aapt,
1995*9e965d6fSRomain Jobredeaux        android_jar = android_jar,
1996*9e965d6fSRomain Jobredeaux        r_txt = r_txt,
1997*9e965d6fSRomain Jobredeaux        shrunk_jar = shrunk_jar,
1998*9e965d6fSRomain Jobredeaux        proguard_mapping = proguard_mapping,
1999*9e965d6fSRomain Jobredeaux        debug = _compilation_mode.get(ctx) != _compilation_mode.OPT,
2000*9e965d6fSRomain Jobredeaux        busybox = busybox,
2001*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
2002*9e965d6fSRomain Jobredeaux    )
2003*9e965d6fSRomain Jobredeaux
2004*9e965d6fSRomain Jobredeaux    shrunk_ctx[_SHRUNK_RESOURCE_APK] = out_apk
2005*9e965d6fSRomain Jobredeaux    shrunk_ctx[_SHRUNK_RESOURCE_ZIP] = out_zip
2006*9e965d6fSRomain Jobredeaux    shrunk_ctx[_RESOURCE_SHRINKER_LOG] = out_log
2007*9e965d6fSRomain Jobredeaux    shrunk_ctx[_RESOURCE_OPTIMIZATION_CONFIG] = out_config
2008*9e965d6fSRomain Jobredeaux
2009*9e965d6fSRomain Jobredeaux    return _ResourcesShrinkContextInfo(**shrunk_ctx)
2010*9e965d6fSRomain Jobredeaux
2011*9e965d6fSRomain Jobredeauxdef _optimize(
2012*9e965d6fSRomain Jobredeaux        ctx,
2013*9e965d6fSRomain Jobredeaux        resources_apk = None,
2014*9e965d6fSRomain Jobredeaux        resource_optimization_config = None,
2015*9e965d6fSRomain Jobredeaux        is_resource_shrunk = False,
2016*9e965d6fSRomain Jobredeaux        aapt = None,
2017*9e965d6fSRomain Jobredeaux        busybox = None,
2018*9e965d6fSRomain Jobredeaux        host_javabase = None):
2019*9e965d6fSRomain Jobredeaux    """Optimizes the resources apk if necessary.
2020*9e965d6fSRomain Jobredeaux
2021*9e965d6fSRomain Jobredeaux    Args:
2022*9e965d6fSRomain Jobredeaux        ctx: The context.
2023*9e965d6fSRomain Jobredeaux        resources_apk: File. The resources apk.
2024*9e965d6fSRomain Jobredeaux        resource_optimization_config: File. The resource optimization config outputted
2025*9e965d6fSRomain Jobredeaux          by resource shrinking. It will only be used if resource name obfuscation is enabled.
2026*9e965d6fSRomain Jobredeaux        is_resource_shrunk: Boolean. Whether the resources has been shrunk or not.
2027*9e965d6fSRomain Jobredeaux        aapt: FilesToRunProvider. The AAPT executable.
2028*9e965d6fSRomain Jobredeaux        busybox: FilesToRunProvider. The ResourceBusyBox executable.
2029*9e965d6fSRomain Jobredeaux        host_javabase: Target. The host javabase.
2030*9e965d6fSRomain Jobredeaux
2031*9e965d6fSRomain Jobredeaux    Returns:
2032*9e965d6fSRomain Jobredeaux        A dict contaning all of the optimized resource outputs.
2033*9e965d6fSRomain Jobredeaux    """
2034*9e965d6fSRomain Jobredeaux    optimize_ctx = {
2035*9e965d6fSRomain Jobredeaux        _OPTIMIZED_RESOURCE_APK: None,
2036*9e965d6fSRomain Jobredeaux        _RESOURCE_PATH_SHORTENING_MAP: None,
2037*9e965d6fSRomain Jobredeaux    }
2038*9e965d6fSRomain Jobredeaux
2039*9e965d6fSRomain Jobredeaux    use_resource_path_shortening_map = _is_resource_path_shortening_enabled(ctx)
2040*9e965d6fSRomain Jobredeaux    use_resource_optimization_config = _is_resource_name_obfuscation_enabled(ctx, is_resource_shrunk)
2041*9e965d6fSRomain Jobredeaux
2042*9e965d6fSRomain Jobredeaux    if not (use_resource_path_shortening_map or use_resource_optimization_config):
2043*9e965d6fSRomain Jobredeaux        return _ResourcesOptimizeContextInfo(**optimize_ctx)
2044*9e965d6fSRomain Jobredeaux
2045*9e965d6fSRomain Jobredeaux    optimized_resource_apk = ctx.actions.declare_file(ctx.label.name + "optimized.ap_")
2046*9e965d6fSRomain Jobredeaux    optimize_ctx[_OPTIMIZED_RESOURCE_APK] = optimized_resource_apk
2047*9e965d6fSRomain Jobredeaux
2048*9e965d6fSRomain Jobredeaux    resource_path_shortening_map = None
2049*9e965d6fSRomain Jobredeaux    if use_resource_path_shortening_map:
2050*9e965d6fSRomain Jobredeaux        resource_path_shortening_map = ctx.actions.declare_file(ctx.label.name + "_resource_paths.map")
2051*9e965d6fSRomain Jobredeaux        optimize_ctx[_RESOURCE_PATH_SHORTENING_MAP] = resource_path_shortening_map
2052*9e965d6fSRomain Jobredeaux
2053*9e965d6fSRomain Jobredeaux    _busybox.optimize(
2054*9e965d6fSRomain Jobredeaux        ctx,
2055*9e965d6fSRomain Jobredeaux        out_apk = optimized_resource_apk,
2056*9e965d6fSRomain Jobredeaux        in_apk = resources_apk,
2057*9e965d6fSRomain Jobredeaux        resource_path_shortening_map = optimize_ctx[_RESOURCE_PATH_SHORTENING_MAP],
2058*9e965d6fSRomain Jobredeaux        resource_optimization_config = resource_optimization_config if use_resource_optimization_config else None,
2059*9e965d6fSRomain Jobredeaux        aapt = aapt,
2060*9e965d6fSRomain Jobredeaux        busybox = busybox,
2061*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
2062*9e965d6fSRomain Jobredeaux    )
2063*9e965d6fSRomain Jobredeaux
2064*9e965d6fSRomain Jobredeaux    return _ResourcesOptimizeContextInfo(**optimize_ctx)
2065*9e965d6fSRomain Jobredeaux
2066*9e965d6fSRomain Jobredeauxdef _is_resource_path_shortening_enabled(ctx):
2067*9e965d6fSRomain Jobredeaux    return ctx.fragments.android.use_android_resource_path_shortening and \
2068*9e965d6fSRomain Jobredeaux           _compilation_mode.get(ctx) == _compilation_mode.OPT and \
2069*9e965d6fSRomain Jobredeaux           not acls.in_android_binary_raw_access_to_resource_paths_allowlist(str(ctx.label))
2070*9e965d6fSRomain Jobredeaux
2071*9e965d6fSRomain Jobredeauxdef _is_resource_name_obfuscation_enabled(ctx, is_resource_shrunk):
2072*9e965d6fSRomain Jobredeaux    return (ctx.fragments.android.use_android_resource_name_obfuscation or
2073*9e965d6fSRomain Jobredeaux            _FEATURE_RESOURCE_NAME_OBFUSCATION in ctx.features) and \
2074*9e965d6fSRomain Jobredeaux           is_resource_shrunk and \
2075*9e965d6fSRomain Jobredeaux           not acls.in_android_binary_raw_access_to_resource_paths_allowlist(str(ctx.label))
2076*9e965d6fSRomain Jobredeaux
2077*9e965d6fSRomain Jobredeauxresources = struct(
2078*9e965d6fSRomain Jobredeaux    process = _process,
2079*9e965d6fSRomain Jobredeaux    process_starlark = _process_starlark,
2080*9e965d6fSRomain Jobredeaux    package = _package,
2081*9e965d6fSRomain Jobredeaux    make_aar = _make_aar,
2082*9e965d6fSRomain Jobredeaux
2083*9e965d6fSRomain Jobredeaux    # Exposed for mobile-install
2084*9e965d6fSRomain Jobredeaux    compile = _compile,
2085*9e965d6fSRomain Jobredeaux    legacy_merge_manifests = _legacy_merge_manifests,
2086*9e965d6fSRomain Jobredeaux
2087*9e965d6fSRomain Jobredeaux    # Exposed for android_local_test and android_library
2088*9e965d6fSRomain Jobredeaux    generate_dummy_manifest = _generate_dummy_manifest,
2089*9e965d6fSRomain Jobredeaux
2090*9e965d6fSRomain Jobredeaux    # Exposed for android_library, aar_import, android_local_test and android_binary
2091*9e965d6fSRomain Jobredeaux    bump_min_sdk = _bump_min_sdk,
2092*9e965d6fSRomain Jobredeaux    process_manifest_values = _process_manifest_values,
2093*9e965d6fSRomain Jobredeaux
2094*9e965d6fSRomain Jobredeaux    # Exposed for use in AOSP
2095*9e965d6fSRomain Jobredeaux    set_default_min_sdk = _set_default_min_sdk,
2096*9e965d6fSRomain Jobredeaux    # TODO: b/301258446 - AOSP-only change, should upstream some equivalent.
2097*9e965d6fSRomain Jobredeaux    ManifestContextInfo = _ManifestContextInfo,
2098*9e965d6fSRomain Jobredeaux
2099*9e965d6fSRomain Jobredeaux    # Exposed for android_binary
2100*9e965d6fSRomain Jobredeaux    is_resource_shrinking_enabled = _is_resource_shrinking_enabled,
2101*9e965d6fSRomain Jobredeaux    validate_min_sdk = _validate_min_sdk,
2102*9e965d6fSRomain Jobredeaux    shrink = _shrink,
2103*9e965d6fSRomain Jobredeaux    optimize = _optimize,
2104*9e965d6fSRomain Jobredeaux)
2105*9e965d6fSRomain Jobredeaux
2106*9e965d6fSRomain Jobredeauxtesting = struct(
2107*9e965d6fSRomain Jobredeaux    add_g3itr = _add_g3itr,
2108*9e965d6fSRomain Jobredeaux    filter_multi_cpu_configuration_targets = _filter_multi_cpu_configuration_targets,
2109*9e965d6fSRomain Jobredeaux    get_legacy_mergee_manifests = _get_legacy_mergee_manifests,
2110*9e965d6fSRomain Jobredeaux    make_databinding_outputs = _make_databinding_outputs,
2111*9e965d6fSRomain Jobredeaux    ResourcesPackageContextInfo = _ResourcesPackageContextInfo,
2112*9e965d6fSRomain Jobredeaux    ResourcesProcessContextInfo = _ResourcesProcessContextInfo,
2113*9e965d6fSRomain Jobredeaux    ResourcesShrinkContextInfo = _ResourcesShrinkContextInfo,
2114*9e965d6fSRomain Jobredeaux    ResourcesOptimizeContextInfo = _ResourcesOptimizeContextInfo,
2115*9e965d6fSRomain Jobredeaux)
2116