xref: /aosp_15_r20/external/bazelbuild-rules_android/mobile_install/adapters/android_binary.bzl (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
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