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