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