Skip to content

Commit 3e8aab3

Browse files
Ian Childsfacebook-github-bot
Ian Childs
authored andcommitted
Add Android system toolchain
Summary: Basic toolchain, can iterate on it if needed Reviewed By: blackm00n Differential Revision: D74005595 fbshipit-source-id: 569086205dca881cfe01ebc2eea89a9989c9a233
1 parent 0cc1640 commit 3e8aab3

File tree

2 files changed

+261
-0
lines changed

2 files changed

+261
-0
lines changed

prelude/toolchains/android.bzl

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
# Copyright (c) Meta Platforms, Inc. and affiliates.
2+
#
3+
# This source code is licensed under both the MIT license found in the
4+
# LICENSE-MIT file in the root directory of this source tree and the Apache
5+
# License, Version 2.0 found in the LICENSE-APACHE file in the root directory
6+
# of this source tree.
7+
8+
load("@prelude//android:android_toolchain.bzl", "AndroidPlatformInfo", "AndroidToolchainInfo")
9+
10+
def _android_sdk_tools_impl(ctx):
11+
sub_targets = {}
12+
13+
sub_targets["aapt2"] = [RunInfo(args = ["{}/build-tools/{}/aapt2".format(ctx.attrs.android_sdk_path, ctx.attrs.build_tools_version)])]
14+
sub_targets["aidl"] = [RunInfo(args = ["{}/build-tools/{}/aidl".format(ctx.attrs.android_sdk_path, ctx.attrs.build_tools_version)])]
15+
sub_targets["zipalign"] = [RunInfo(args = ["{}/build-tools/{}/zipalign".format(ctx.attrs.android_sdk_path, ctx.attrs.build_tools_version)])]
16+
17+
sub_targets["adb"] = [RunInfo(args = ["{}/build-tools/platform-tools/adb".format(ctx.attrs.android_sdk_path)])]
18+
19+
android_jar = ctx.actions.declare_output("android.jar")
20+
ctx.actions.run(cmd_args(["ln", "-s", "{}/platforms/{}/android.jar".format(ctx.attrs.android_sdk_path, ctx.attrs.compile_sdk_version), android_jar.as_output()]), category = "android_jar_symlink")
21+
sub_targets["android.jar"] = [DefaultInfo(default_output = android_jar)]
22+
23+
framework_aidl_file = ctx.actions.declare_output("framework.aidl")
24+
ctx.actions.run(cmd_args(["ln", "-s", "{}/platforms/{}/framework.aidl".format(ctx.attrs.android_sdk_path, ctx.attrs.compile_sdk_version), framework_aidl_file.as_output()]), category = "framework_aidl_symlink")
25+
sub_targets["framework.aidl"] = [DefaultInfo(default_output = framework_aidl_file)]
26+
27+
optimized_proguard_config = ctx.actions.declare_output("proguard-android-optimize.txt")
28+
ctx.actions.run(cmd_args(["ln", "-s", "{}/platforms/tools/proguard/proguard-android-optimize.txt".format(ctx.attrs.android_sdk_path), optimized_proguard_config.as_output()]), category = "optimized_proguard_config_symlink")
29+
sub_targets["optimized_proguard_config"] = [DefaultInfo(default_output = optimized_proguard_config)]
30+
31+
proguard_config = ctx.actions.declare_output("proguard-android.txt")
32+
ctx.actions.run(cmd_args(["ln", "-s", "{}/platforms/tools/proguard/proguard-android.txt".format(ctx.attrs.android_sdk_path), proguard_config.as_output()]), category = "proguard_config_symlink")
33+
sub_targets["proguard_config"] = [DefaultInfo(default_output = proguard_config)]
34+
35+
proguard_jar = ctx.actions.declare_output("proguard.jar")
36+
ctx.actions.run(cmd_args(["ln", "-s", "{}/platforms/tools/proguard/lib/proguard.jar".format(ctx.attrs.android_sdk_path), proguard_jar.as_output()]), category = "proguard_jar_symlink")
37+
sub_targets["proguard.jar"] = [DefaultInfo(default_output = proguard_jar)]
38+
39+
return [
40+
DefaultInfo(sub_targets = sub_targets),
41+
]
42+
43+
android_sdk_tools = rule(
44+
impl = _android_sdk_tools_impl,
45+
attrs = {
46+
"android_sdk_path": attrs.string(default = "/opt/android/sdk_D37111790"),
47+
"build_tools_version": attrs.string(default = "35.0.0"),
48+
"compile_sdk_version": attrs.string(default = "android-35"),
49+
},
50+
)
51+
52+
def system_android_toolchain(
53+
name,
54+
**kwargs):
55+
android_sdk_tools_name = "{}_android_sdk_tools".format(name)
56+
android_sdk_tools(
57+
name = android_sdk_tools_name,
58+
)
59+
60+
android_sdk_tools_target = ":{}".format(android_sdk_tools_name)
61+
62+
kwargs["aapt2_filter_resources"] = "prelude//android/tools:filter_extra_resources"
63+
kwargs["aapt2"] = "{}[aapt2]".format(android_sdk_tools_target)
64+
kwargs["aar_builder"] = "prelude//toolchains/android/src/com/facebook/buck/android/aar:aar_builder_binary"
65+
kwargs["adb"] = "{}[adb]".format(android_sdk_tools_target)
66+
kwargs["aidl"] = "{}[aidl]".format(android_sdk_tools_target)
67+
kwargs["android_jar"] = "{}[android.jar]".format(android_sdk_tools_target)
68+
kwargs["android_optional_jars"] = []
69+
kwargs["apk_builder"] = "prelude//toolchains/android/src/com/facebook/buck/android/apk:apk_builder_binary"
70+
kwargs["apk_module_graph"] = "prelude//toolchains/android/src/com/facebook/buck/android/apkmodule:apkmodule_binary"
71+
kwargs["app_without_resources_stub"] = "prelude//android/tools:app_without_resources_stub"
72+
kwargs["bundle_apks_builder"] = "prelude//toolchains/android/src/com/facebook/buck/android/bundle:bundle_apks_builder_binary"
73+
kwargs["bundle_builder"] = "prelude//toolchains/android/src/com/facebook/buck/android/bundle:bundle_builder_binary"
74+
kwargs["combine_native_library_dirs"] = "prelude//android/tools:combine_native_library_dirs"
75+
kwargs["copy_string_resources"] = "prelude//toolchains/android/src/com/facebook/buck/android/resources/strings:copy_string_resources_binary"
76+
kwargs["cross_module_native_deps_check"] = True
77+
kwargs["d8_command"] = "prelude//toolchains/android/src/com/facebook/buck/android/dex:run_d8_binary"
78+
kwargs["duplicate_class_checker"] = "prelude//android/tools:duplicate_class_checker"
79+
kwargs["exo_resources_rewriter"] = "prelude//toolchains/android/src/com/facebook/buck/android/resources:exo_resources_rewriter_binary"
80+
81+
# TODO: We should support exopackage in OSS builds.
82+
kwargs["exopackage_agent_apk"] = None
83+
kwargs["filter_dex_class_names"] = "prelude//android/tools:filter_dex"
84+
kwargs["filter_prebuilt_native_library_dir"] = "prelude//android/tools:filter_prebuilt_native_library_dir"
85+
kwargs["filter_resources"] = "prelude//toolchains/android/src/com/facebook/buck/android/resources/filter:filter_resources_binary"
86+
kwargs["framework_aidl_file"] = "{}[framework.aidl]".format(android_sdk_tools_target)
87+
kwargs["generate_build_config"] = "prelude//toolchains/android/src/com/facebook/buck/android/build_config:generate_build_config_binary"
88+
kwargs["generate_manifest"] = "prelude//toolchains/android/src/com/facebook/buck/android/manifest:generate_manifest_binary"
89+
kwargs["installer"] = "prelude//toolchains/android/src/com/facebook/buck/installer/android:android_installer"
90+
kwargs["instrumentation_test_can_run_locally"] = True
91+
kwargs["instrumentation_test_runner_classpath"] = [
92+
"prelude//toolchains/android/src/com/facebook/buck/testrunner:testrunner-bin-fixed",
93+
"prelude//toolchains/android/third-party:android-common",
94+
"prelude//toolchains/android/third-party:ddmlib",
95+
"prelude//toolchains/android/third-party:guava-jar",
96+
"prelude//toolchains/android/third-party:failureaccess",
97+
"prelude//toolchains/android/third-party:listenablefuture",
98+
"prelude//toolchains/android/third-party:kxml2",
99+
"prelude//toolchains/android/third-party:protobuf",
100+
"prelude//toolchains/android/third-party:jackson-annotations",
101+
"prelude//toolchains/android/third-party:jackson-core",
102+
"prelude//toolchains/android/third-party:jackson-databind-jar",
103+
]
104+
kwargs["instrumentation_test_runner_main_class"] = "com.facebook.buck.testrunner.InstrumentationMain"
105+
kwargs["jar_splitter_command"] = "prelude//toolchains/android/src/com/facebook/buck/android/dex:jar_splitter_binary"
106+
kwargs["list_tests_command"] = None
107+
kwargs["manifest_utils"] = "prelude//toolchains/android/src/com/facebook/buck/android:manifest_utils_binary"
108+
kwargs["merge_android_resource_sources"] = "prelude//toolchains/android/src/com/facebook/buck/android/aapt:merge_android_resource_sources_binary"
109+
kwargs["merge_android_resources"] = "prelude//toolchains/android/src/com/facebook/buck/android/resources:merge_android_resources_binary"
110+
kwargs["merge_assets"] = "prelude//toolchains/android/src/com/facebook/buck/android/resources:merge_assets_binary"
111+
kwargs["mergemap_tool"] = "prelude//android/tools:compute_merge_sequence"
112+
kwargs["mini_aapt"] = "prelude//toolchains/android/src/com/facebook/buck/android/aapt:mini_aapt_binary"
113+
kwargs["multi_dex_command"] = "prelude//toolchains/android/src/com/facebook/buck/android/dex:multi_dex_binary"
114+
kwargs["native_libs_as_assets_metadata"] = "prelude//android/tools:native_libs_as_assets_metadata"
115+
kwargs["optimized_proguard_config"] = "{}[optimized_proguard_config]".format(android_sdk_tools_target)
116+
kwargs["package_meta_inf_version_files"] = False
117+
kwargs["package_strings_as_assets"] = "prelude//toolchains/android/src/com/facebook/buck/android/resources/strings:package_strings_as_assets_binary"
118+
kwargs["proguard_config"] = "{}[proguard_config]".format(android_sdk_tools_target)
119+
kwargs["proguard_jar"] = "{}[proguard.jar]".format(android_sdk_tools_target)
120+
kwargs["r_dot_java_weight_factor"] = 8
121+
kwargs["replace_application_id_placeholders"] = "prelude//toolchains/android/src/com/facebook/buck/android/manifest:replace_application_id_placeholders_binary"
122+
kwargs["secondary_dex_compression_command"] = "prelude//toolchains/android/src/com/facebook/buck/android/dex:secondary_dex_compression_binary"
123+
kwargs["secondary_dex_weight_limit"] = 1024
124+
kwargs["set_application_id_to_specified_package"] = True
125+
kwargs["should_run_sanity_check_for_placeholders"] = True
126+
kwargs["unpack_aar"] = "prelude//android/tools:unpack_aar"
127+
kwargs["zipalign"] = "{}[zipalign]".format(android_sdk_tools_target)
128+
129+
system_android_toolchain_rule(
130+
name = name,
131+
**kwargs
132+
)
133+
134+
def system_android_toolchain_rule_impl(ctx):
135+
return [
136+
DefaultInfo(),
137+
AndroidPlatformInfo(
138+
name = ctx.attrs.name,
139+
),
140+
AndroidToolchainInfo(
141+
aapt2 = ctx.attrs.aapt2[RunInfo],
142+
aapt2_filter_resources = ctx.attrs.aapt2_filter_resources[RunInfo],
143+
aar_builder = ctx.attrs.aar_builder[RunInfo],
144+
adb = ctx.attrs.adb[RunInfo],
145+
aidl = ctx.attrs.aidl[RunInfo],
146+
android_bootclasspath = [ctx.attrs.android_jar],
147+
android_jar = ctx.attrs.android_jar,
148+
android_optional_jars = ctx.attrs.android_optional_jars,
149+
apk_builder = ctx.attrs.apk_builder,
150+
apk_module_graph = ctx.attrs.apk_module_graph,
151+
app_without_resources_stub = ctx.attrs.app_without_resources_stub,
152+
bundle_apks_builder = ctx.attrs.bundle_apks_builder,
153+
bundle_builder = ctx.attrs.bundle_builder,
154+
combine_native_library_dirs = ctx.attrs.combine_native_library_dirs,
155+
copy_string_resources = ctx.attrs.copy_string_resources,
156+
cross_module_native_deps_check = ctx.attrs.cross_module_native_deps_check,
157+
d8_command = ctx.attrs.d8_command,
158+
duplicate_class_checker = ctx.attrs.duplicate_class_checker,
159+
exo_resources_rewriter = ctx.attrs.exo_resources_rewriter,
160+
exopackage_agent_apk = ctx.attrs.exopackage_agent_apk,
161+
filter_dex_class_names = ctx.attrs.filter_dex_class_names,
162+
filter_prebuilt_native_library_dir = ctx.attrs.filter_prebuilt_native_library_dir,
163+
filter_resources = ctx.attrs.filter_resources,
164+
framework_aidl_file = ctx.attrs.framework_aidl_file,
165+
generate_build_config = ctx.attrs.generate_build_config,
166+
generate_manifest = ctx.attrs.generate_manifest,
167+
installer = ctx.attrs.installer,
168+
instrumentation_test_can_run_locally = ctx.attrs.instrumentation_test_can_run_locally,
169+
instrumentation_test_runner_classpath = ctx.attrs.instrumentation_test_runner_classpath,
170+
instrumentation_test_runner_main_class = ctx.attrs.instrumentation_test_runner_main_class,
171+
jar_splitter_command = ctx.attrs.jar_splitter_command,
172+
list_tests_command = ctx.attrs.list_tests_command,
173+
manifest_utils = ctx.attrs.manifest_utils,
174+
merge_android_resource_sources = ctx.attrs.merge_android_resource_sources,
175+
merge_android_resources = ctx.attrs.merge_android_resources,
176+
merge_assets = ctx.attrs.merge_assets,
177+
mergemap_tool = ctx.attrs.mergemap_tool[RunInfo],
178+
mini_aapt = ctx.attrs.mini_aapt,
179+
multi_dex_command = ctx.attrs.multi_dex_command,
180+
native_libs_as_assets_metadata = ctx.attrs.native_libs_as_assets_metadata,
181+
optimized_proguard_config = ctx.attrs.optimized_proguard_config,
182+
p7zip = None,
183+
package_meta_inf_version_files = ctx.attrs.package_meta_inf_version_files,
184+
package_strings_as_assets = ctx.attrs.package_strings_as_assets,
185+
proguard_config = ctx.attrs.proguard_config,
186+
proguard_jar = ctx.attrs.proguard_jar,
187+
r_dot_java_weight_factor = ctx.attrs.r_dot_java_weight_factor,
188+
replace_application_id_placeholders = ctx.attrs.replace_application_id_placeholders,
189+
secondary_dex_compression_command = ctx.attrs.secondary_dex_compression_command,
190+
secondary_dex_weight_limit = ctx.attrs.secondary_dex_weight_limit,
191+
set_application_id_to_specified_package = ctx.attrs.set_application_id_to_specified_package,
192+
should_run_sanity_check_for_placeholders = ctx.attrs.should_run_sanity_check_for_placeholders,
193+
unpack_aar = ctx.attrs.unpack_aar,
194+
zipalign = ctx.attrs.zipalign,
195+
),
196+
]
197+
198+
system_android_toolchain_rule = rule(
199+
attrs = {
200+
"aapt2": attrs.dep(providers = [RunInfo]),
201+
"aapt2_filter_resources": attrs.dep(providers = [RunInfo]),
202+
"aar_builder": attrs.dep(providers = [RunInfo]),
203+
"adb": attrs.dep(providers = [RunInfo]),
204+
"aidl": attrs.dep(providers = [RunInfo]),
205+
"android_jar": attrs.source(),
206+
"android_optional_jars": attrs.list(attrs.source()),
207+
"apk_builder": attrs.dep(providers = [RunInfo]),
208+
"apk_module_graph": attrs.dep(providers = [RunInfo]),
209+
"app_without_resources_stub": attrs.source(),
210+
"bundle_apks_builder": attrs.dep(providers = [RunInfo]),
211+
"bundle_builder": attrs.dep(providers = [RunInfo]),
212+
"combine_native_library_dirs": attrs.dep(providers = [RunInfo]),
213+
"copy_string_resources": attrs.dep(providers = [RunInfo]),
214+
"cross_module_native_deps_check": attrs.bool(),
215+
"d8_command": attrs.dep(providers = [RunInfo]),
216+
"duplicate_class_checker": attrs.option(attrs.dep(providers = [RunInfo]), default = None),
217+
"exo_resources_rewriter": attrs.dep(providers = [RunInfo]),
218+
"exopackage_agent_apk": attrs.option(attrs.source(), default = None),
219+
"filter_dex_class_names": attrs.dep(providers = [RunInfo]),
220+
"filter_prebuilt_native_library_dir": attrs.dep(providers = [RunInfo]),
221+
"filter_resources": attrs.dep(providers = [RunInfo]),
222+
"framework_aidl_file": attrs.source(),
223+
"generate_build_config": attrs.dep(providers = [RunInfo]),
224+
"generate_manifest": attrs.dep(providers = [RunInfo]),
225+
"installer": attrs.label(),
226+
"instrumentation_test_can_run_locally": attrs.bool(),
227+
"instrumentation_test_runner_classpath": attrs.list(attrs.source()),
228+
"instrumentation_test_runner_main_class": attrs.string(),
229+
"jar_splitter_command": attrs.dep(providers = [RunInfo]),
230+
"list_tests_command": attrs.option(attrs.dep(providers = [RunInfo]), default = None),
231+
"manifest_utils": attrs.dep(providers = [RunInfo]),
232+
"merge_android_resource_sources": attrs.dep(providers = [RunInfo]),
233+
"merge_android_resources": attrs.dep(providers = [RunInfo]),
234+
"merge_assets": attrs.dep(providers = [RunInfo]),
235+
"mergemap_tool": attrs.dep(providers = [RunInfo]),
236+
"mini_aapt": attrs.dep(providers = [RunInfo]),
237+
"multi_dex_command": attrs.dep(providers = [RunInfo]),
238+
"native_libs_as_assets_metadata": attrs.dep(providers = [RunInfo]),
239+
"optimized_proguard_config": attrs.source(),
240+
"package_meta_inf_version_files": attrs.bool(),
241+
"package_strings_as_assets": attrs.dep(providers = [RunInfo]),
242+
"proguard_config": attrs.source(),
243+
"proguard_jar": attrs.source(),
244+
"r_dot_java_weight_factor": attrs.int(),
245+
"replace_application_id_placeholders": attrs.dep(providers = [RunInfo]),
246+
"secondary_dex_compression_command": attrs.dep(providers = [RunInfo]),
247+
"secondary_dex_weight_limit": attrs.int(),
248+
"set_application_id_to_specified_package": attrs.bool(),
249+
"should_run_sanity_check_for_placeholders": attrs.bool(),
250+
"unpack_aar": attrs.dep(providers = [RunInfo]),
251+
"zipalign": attrs.dep(providers = [RunInfo]),
252+
},
253+
impl = system_android_toolchain_rule_impl,
254+
is_toolchain_rule = True,
255+
)

prelude/toolchains/demo.bzl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
# of this source tree.
77

88
load("@prelude//tests:test_toolchain.bzl", "noop_test_toolchain")
9+
load("@prelude//toolchains:android.bzl", "system_android_toolchain")
910
load("@prelude//toolchains:cxx.bzl", "system_cxx_toolchain")
1011
load("@prelude//toolchains:dex.bzl", "system_noop_dex_toolchain")
1112
load("@prelude//toolchains:genrule.bzl", "system_genrule_toolchain")
@@ -23,6 +24,11 @@ def system_demo_toolchains():
2324
All the default toolchains, suitable for a quick demo or early prototyping.
2425
Most real projects should copy/paste the implementation to configure them.
2526
"""
27+
system_android_toolchain(
28+
name = "android",
29+
visibility = ["PUBLIC"],
30+
)
31+
2632
system_cxx_toolchain(
2733
name = "cxx",
2834
visibility = ["PUBLIC"],

0 commit comments

Comments
 (0)