1# Copyright 2018 The Bazel Authors. All rights reserved. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14"""Rule adapter for android_binary.""" 15 16load(":adapters/base.bzl", "make_adapter") 17load(":launcher.bzl", "make_launcher") 18load(":launcher_direct.bzl", "make_direct_launcher") 19load(":process.bzl", "process") 20load( 21 ":providers.bzl", 22 "MIAndroidAarNativeLibsInfo", 23 "MIAndroidAssetsInfo", 24 "MIAndroidDexInfo", 25 "MIAndroidResourcesInfo", 26 "MIJavaResourcesInfo", 27 "providers", 28) 29load(":resources.bzl", "get_assets_dir") 30load(":transform.bzl", "dex", "filter_jars") 31load(":utils.bzl", "utils") 32load("//rules/flags:flags.bzl", "flags") 33 34def _aspect_attrs(): 35 """Attrs of the rule requiring traversal by the aspect.""" 36 return ["_android_sdk", "deps", "resources", "instruments"] 37 38def extract(target, ctx): 39 # extract is made visibile for testing 40 """extract the rule and target data. 41 42 Args: 43 target: The target. 44 ctx: The context. 45 46 Returns: 47 Input for process method 48 """ 49 extension_registry_class_jar = utils.get_extension_registry_class_jar(target) 50 return dict( 51 debug_key = utils.only(ctx.rule.files.debug_key, allow_empty = True), 52 debug_signing_keys = ctx.rule.files.debug_signing_keys, 53 debug_signing_lineage_file = utils.only(ctx.rule.files.debug_signing_lineage_file, allow_empty = True), 54 key_rotation_min_sdk = ctx.rule.attr.key_rotation_min_sdk, 55 merged_manifest = target[AndroidIdeInfo].generated_manifest, 56 native_libs = target[AndroidIdeInfo].native_libs, 57 package = target[AndroidIdeInfo].java_package, 58 resource_apk = target[AndroidIdeInfo].resource_apk, 59 resource_src_jar = target[AndroidIdeInfo].resource_jar.source_jar, # This is the R with real ids. 60 aar_native_libs_info = providers.make_mi_android_aar_native_libs_info( 61 deps = providers.collect( 62 MIAndroidAarNativeLibsInfo, 63 ctx.rule.attr.deps, 64 ), 65 ), 66 android_assets_info = providers.make_mi_android_assets_info( 67 assets = depset(ctx.rule.files.assets), 68 assets_dir = get_assets_dir( 69 ctx.rule.files.assets[0], 70 ctx.rule.attr.assets_dir, 71 ) if ctx.rule.files.assets else None, 72 deps = providers.collect( 73 MIAndroidAssetsInfo, 74 ctx.rule.attr.deps, 75 ), 76 ), 77 android_dex_info = providers.make_mi_android_dex_info( 78 dex_shards = dex( 79 ctx, 80 filter_jars( 81 ctx.label.name + "_resources.jar", 82 target[JavaInfo].runtime_output_jars, 83 ) + 84 ( 85 [ 86 extension_registry_class_jar, 87 ] if extension_registry_class_jar else [] 88 ), 89 target[JavaInfo].transitive_compile_time_jars, 90 ), 91 deps = providers.collect(MIAndroidDexInfo, ctx.rule.attr.deps), 92 ), 93 # TODO(djwhang): It wasteful to collect packages in 94 # android_resources_info, rather we should be looking to pull them 95 # from the resources_v3_info. 96 android_resources_info = providers.make_mi_android_resources_info( 97 package = target[AndroidIdeInfo].java_package, 98 deps = providers.collect( 99 MIAndroidResourcesInfo, 100 ctx.rule.attr.deps, 101 ), 102 ), 103 java_resources_info = providers.make_mi_java_resources_info( 104 deps = providers.collect( 105 MIJavaResourcesInfo, 106 ctx.rule.attr.deps, 107 ), 108 ), 109 android_jar = ctx.rule.attr._android_sdk[AndroidSdkInfo].android_jar, 110 instrumented_app = ctx.rule.attr.instruments, 111 apk = target.android.apk, 112 ) 113 114def adapt(target, ctx): 115 # adapt is made visibile for testing 116 """Adapts the android rule 117 118 Args: 119 target: The target. 120 ctx: The context. 121 Returns: 122 A list of providers 123 """ 124 125 # launcher is created here to be used as the sibling everywhere else. 126 launcher = utils.isolated_declare_file(ctx, ctx.label.name + "_mi/launcher") 127 mi_app_info = process(ctx, sibling = launcher, **extract(target, ctx)) 128 129 if flags.get(ctx).use_direct_deploy: 130 mi_app_launch_info = make_direct_launcher( 131 ctx, 132 mi_app_info, 133 launcher, 134 use_adb_root = flags.get(ctx).use_adb_root, 135 ) 136 else: 137 mi_app_launch_info = make_launcher( 138 ctx, 139 mi_app_info, 140 launcher, 141 use_adb_root = flags.get(ctx).use_adb_root, 142 ) 143 144 return [ 145 mi_app_info, 146 mi_app_launch_info, 147 OutputGroupInfo( 148 mobile_install_INTERNAL_ = depset(mi_app_launch_info.runfiles).to_list(), 149 mobile_install_launcher_INTERNAL_ = [mi_app_launch_info.launcher], 150 ), 151 ] 152 153android_binary = make_adapter(_aspect_attrs, adapt) 154