|
| 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 | +) |
0 commit comments