规则
- android_binary
- aar_import
- android_library
- android_instrumentation_test
- android_local_test
- android_device
- android_ndk_repository
- android_sdk_repository
android_binary
查看规则源代码android_binary(name, deps, srcs, assets, assets_dir, compatible_with, crunch_png, custom_package, debug_key, debug_signing_keys, debug_signing_lineage_file, densities, deprecation, dex_shards, dexopts, distribs, enable_data_binding, exec_compatible_with, exec_properties, features, incremental_dexing, instruments, javacopts, key_rotation_min_sdk, licenses, main_dex_list, main_dex_list_opts, main_dex_proguard_specs, manifest, manifest_values, multidex, nocompress_extensions, package_id, plugins, proguard_apply_dictionary, proguard_apply_mapping, proguard_generate_mapping, proguard_specs, resource_configuration_filters, resource_files, restricted_to, shrink_resources, tags, target_compatible_with, testonly, visibility)
生成 Android 应用软件包文件 (.apk)。
隐式输出目标
name.apk:使用调试密钥签名且 已压缩的 Android 应用软件包文件,可用于开发和调试应用。使用调试密钥签名的应用无法发布。name_unsigned.apk:上述文件的未签名版本,可在面向公众发布之前使用发布密钥对其进行签名。name_deploy.jar:包含此目标的传递闭包的 Java 归档。部署 JAR 文件包含从头到尾搜索此目标的运行时类路径的类加载器会找到的所有类。
name_proguard.jar:一个 Java 归档文件,其中包含对name_deploy.jar运行 ProGuard 的结果。 仅当指定了 proguard_specs 属性时,才会生成此输出。name_proguard.map:在name_deploy.jar上运行 ProGuard 的映射文件结果。 仅当指定了 proguard_specs 属性并设置了 proguard_generate_mapping 或 shrink_resources 时,才会生成此输出。
示例
如需查看 Android 规则示例,请参阅 Bazel 源代码树的 examples/android 目录。
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 android_library、带有 android 约束条件的 java_library,以及为 Android 目标平台封装或生成 .so 原生库的 cc_library。
|
srcs
|
标签列表;默认值为 编译了类型为 系统会解压缩并编译类型为 |
assets
|
标签列表;默认值为 assets 目录下所有文件的 glob。您还可以引用其他软件包中的其他规则(生成文件的任何规则)或导出的文件,前提是所有这些文件都位于相应软件包的 assets_dir 目录下。
|
assets_dir
|
字符串;默认值为 assets 中文件路径的字符串。
assets 和 assets_dir 对用于描述打包的资源,并且应同时提供这两个属性,或者都不提供。
|
crunch_png
|
布尔值;默认值为 |
custom_package
|
字符串;默认值为 |
debug_key
|
标签;默认值为 警告:请勿使用生产密钥,应对其进行严格保护,并将其保存在源代码树中。 |
debug_signing_keys
|
标签列表;默认值为 警告:请勿使用生产密钥,应对其进行严格保护,并将其保存在源代码树中。 |
debug_signing_lineage_file
|
标签;默认值为 警告:请勿使用生产密钥,应对其进行严格保护,并将其保存在源代码树中。 |
densities
|
字符串列表;默认值为 |
dex_shards
|
整数;默认为 请注意,每个分片都会在最终应用中产生至少一个 dex。因此,不建议将其设置为大于 1 的值。 |
dexopts
|
字符串列表;默认值为 |
enable_data_binding
|
布尔值;默认值为 如需使用数据绑定构建 Android 应用,您还必须执行以下操作:
|
incremental_dexing
|
整数;不可配置;默认为 |
instruments
|
标签;默认值为 要插桩的 如果设置此属性,此 |
javacopts
|
字符串列表;默认值为 这些编译器选项会在全局编译器选项之后传递给 javac。 |
key_rotation_min_sdk
|
字符串;默认值为 |
main_dex_list
|
标签;默认值为
android/support/multidex/MultiDex$V19.class
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
com/google/common/base/Objects.class
multidex="manual_main_dex" 结合使用。
|
main_dex_list_opts
|
字符串列表;默认值为 |
main_dex_proguard_specs
|
标签列表;默认值为 multidex 属性设置为 legacy 时才允许。
|
manifest
|
标签;必填 Android 清单文件的名称,通常为AndroidManifest.xml。
如果定义了 resource_files 或 assets,则必须定义。
|
manifest_values
|
字典:字符串 -> 字符串;默认值为
清单中的任何
系统会忽略
将 |
multidex
|
字符串;默认值为 可能的值:
|
nocompress_extensions
|
字符串列表;默认值为 |
package_id
|
整数;默认为 如需了解详情,请参阅 AAPT2 的 |
plugins
|
标签列表;默认值为 java_plugin 都会运行。插件生成的资源将包含在目标的结果 jar 中。
|
proguard_apply_dictionary
|
标签;默认值为 |
proguard_apply_mapping
|
标签;默认值为 proguard_generate_mapping 生成的映射文件,可重复使用,以将相同的映射应用于新 build。
|
proguard_generate_mapping
|
布尔值;不可配置;默认值为 proguard_specs 时,系统才会生成映射文件。此文件将列出原始类、方法和字段名称与经过混淆处理的类、方法和字段名称之间的映射。
警告:如果使用此属性,Proguard 规范不应包含 |
proguard_specs
|
标签列表;默认值为 |
resource_configuration_filters
|
字符串列表;默认值为 en_XA 和/或 ar_XB 伪语言区域。
|
resource_files
|
标签列表;默认值为 res 目录下所有文件的 glob。
您还可以通过此处的标签引用生成的文件(来自 genrules)。唯一的限制是,生成的输出必须与包含的任何其他资源文件位于同一“ res”目录下。
|
shrink_resources
|
整数;默认为 manifest 和 resource_files 属性)的规则支持此功能,并且需要 ProGuard。它的运作方式与 Gradle 资源缩减器 (https://developer.android.com/studio/build/shrink-code.html#shrink-resources) 大致相同。显著差异:
name_files/resource_shrinker.log,详细说明所执行的分析和删除操作。
可能的值:
|
aar_import
查看规则源代码aar_import(name, deps, data, aar, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, licenses, restricted_to, srcjar, tags, target_compatible_with, testonly, visibility)
此规则允许将 .aar 文件用作 android_library 和 android_binary 规则的库。
示例
aar_import(
name = "google-vr-sdk",
aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar",
)
android_binary(
name = "app",
manifest = "AndroidManifest.xml",
srcs = glob(["**.java"]),
deps = [":google-vr-sdk"],
)
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
aar
|
标签;必填 要提供给依赖于此目标的 Android 目标的.aar 文件。
|
exports
|
标签列表;默认值为 |
srcjar
|
标签;默认值为 |
android_library
查看规则源代码android_library(name, deps, srcs, data, assets, assets_dir, compatible_with, custom_package, deprecation, distribs, enable_data_binding, exec_compatible_with, exec_properties, exported_plugins, exports, exports_manifest, features, idl_import_root, idl_parcelables, idl_preprocessed, idl_srcs, javacopts, licenses, manifest, neverlink, plugins, proguard_specs, resource_files, restricted_to, tags, target_compatible_with, testonly, visibility)
此规则会将其源代码编译并归档到 .jar 文件中。
Android 运行时库 android.jar 会被隐式放置在编译类路径中。
隐式输出目标
libname.jar:Java 归档文件。libname-src.jar:包含源代码的归档文件(“源 jar”)。name.aar:一个 Android“aar”软件包,其中包含此目标的 Java 归档文件和资源。不包含传递闭包。
示例
如需查看 Android 规则示例,请参阅 Bazel 源代码树的 examples/android 目录。
以下示例展示了如何设置 idl_import_root。假设 //java/bazel/helloandroid/BUILD 包含以下内容:
android_library(
name = "parcelable",
srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable
# MyParcelable.aidl will be used as import for other .aidl
# files that depend on it, but will not be compiled.
idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable
# We don't need to specify idl_import_root since the aidl file
# which declares bazel.helloandroid.MyParcelable
# is present at java/bazel/helloandroid/MyParcelable.aidl
# underneath a java root (java/).
)
android_library(
name = "foreign_parcelable",
srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable
idl_parcelables = [
"src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable
],
# We need to specify idl_import_root because the aidl file which
# declares android.helloandroid.OtherParcelable is not positioned
# at android/helloandroid/OtherParcelable.aidl under a normal java root.
# Setting idl_import_root to "src" in //java/bazel/helloandroid
# adds java/bazel/helloandroid/src to the list of roots
# the aidl compiler will search for imported types.
idl_import_root = "src",
)
# Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement.
android_library(
name = "foreign_interface",
idl_srcs = [
"src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface
"src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface
],
# As above, idl_srcs which are not correctly positioned under a java root
# must have idl_import_root set. Otherwise, OtherInterface (or any other
# interface in a library which depends on this one) will not be able
# to find CallbackInterface when it is imported.
idl_import_root = "src",
)
# MyParcelable.aidl is imported by MyInterface.aidl, so the generated
# MyInterface.java requires MyParcelable.class at compile time.
# Depending on :parcelable ensures that aidl compilation of MyInterface.aidl
# specifies the correct import roots and can access MyParcelable.aidl, and
# makes MyParcelable.class available to Java compilation of MyInterface.java
# as usual.
android_library(
name = "idl",
idl_srcs = ["MyInterface.aidl"],
deps = [":parcelable"],
)
# Here, ServiceParcelable uses and thus depends on ParcelableService,
# when it's compiled, but ParcelableService also uses ServiceParcelable,
# which creates a circular dependency.
# As a result, these files must be compiled together, in the same android_library.
android_library(
name = "circular_dependencies",
srcs = ["ServiceParcelable.java"],
idl_srcs = ["ParcelableService.aidl"],
idl_parcelables = ["ServiceParcelable.aidl"],
)
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 android_library、带有 android 约束条件的 java_library,以及为 Android 目标平台封装或生成 .so 原生库的 cc_library。
|
srcs
|
标签列表;默认值为 .java 或 .srcjar 文件的列表。
编译了类型为 系统会解压缩并编译类型为 如果省略 |
assets
|
标签列表;默认值为 assets 目录下所有文件的 glob。您还可以引用其他软件包中的其他规则(生成文件的任何规则)或导出的文件,前提是所有这些文件都位于相应软件包的 assets_dir 目录下。
|
assets_dir
|
字符串;默认值为 assets 中文件路径的字符串。
assets 和 assets_dir 对用于描述打包的资源,并且应同时提供这两个属性,或者都不提供。
|
custom_package
|
字符串;默认值为 |
enable_data_binding
|
布尔值;默认值为 如需使用数据绑定构建 Android 应用,您还必须执行以下操作:
|
exported_plugins
|
标签列表;默认值为 java_plugin(例如注解处理程序)的列表。
指定的 |
exports
|
标签列表;默认值为 exports 属性可访问的所有规则的闭包都被视为直接依赖于具有 exports 的目标的任何规则的直接依赖项。
|
exports_manifest
|
整数;默认为 android_binary 目标。系统永远不会导出 uses-permissions 属性。
|
idl_import_root
|
字符串;默认值为 在处理依赖于此库的 idl 源代码时,此路径将用作导入根目录。 指定 请参阅 示例。 |
idl_parcelables
|
标签列表;默认值为 android_library 目标,但不会翻译为 Java 或编译。应仅添加直接与此库中的 这些文件必须放置在适当的位置,以便 aidl 编译器能够找到它们。 如需了解这意味着什么,请参阅 idl_import_root 的说明。 |
idl_preprocessed
|
标签列表;默认值为 android_library 目标,但不会翻译为 Java 或编译。应仅包含与此库中的 |
idl_srcs
|
标签列表;默认值为 srcs 的内容一起编译。
这些文件将作为导入项提供给直接或通过传递闭包依赖于此库的任何 这些文件必须放置在适当的位置,以便 aidl 编译器能够找到它们。 如需了解这意味着什么,请参阅 idl_import_root 的说明。 |
javacopts
|
字符串列表;默认值为 这些编译器选项会在全局编译器选项之后传递给 javac。 |
manifest
|
标签;默认值为 AndroidManifest.xml。
如果定义了 resource_files 或 assets,则必须定义。
|
neverlink
|
布尔值;默认值为 neverlink 的规则的输出不会用于创建 .apk。如果库将由运行时环境在执行期间提供,则此属性非常有用。
|
plugins
|
标签列表;默认值为 java_plugin 都会运行。插件生成的资源将包含在目标的结果 jar 中。
|
proguard_specs
|
标签列表;默认值为 android_binary 目标中。
此处包含的文件只能包含幂等规则,即 -dontnote、-dontwarn、assumenosideeffects 以及以 -keep 开头的规则。其他选项只能显示在 android_binary 的 proguard_specs 中,以确保非自相矛盾的合并。
|
resource_files
|
标签列表;默认值为 res 目录下所有文件的 glob。
您还可以通过此处的标签引用生成的文件(来自 genrules)。唯一的限制是,生成的输出必须与包含的任何其他资源文件位于同一“ res”目录下。
|
android_instrumentation_test
查看规则源代码android_instrumentation_test(name, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, licenses, local, restricted_to, shard_count, size, support_apks, tags, target_compatible_with, target_device, test_app, testonly, timeout, toolchains, visibility)
android_instrumentation_test 规则用于运行 Android 插桩测试。它将启动模拟器,安装被测应用、测试应用以及任何其他所需的应用,并运行测试软件包中定义的测试。
test_app 属性指定包含测试的 android_binary。该 android_binary 反过来通过其 instruments 属性指定要测试的 android_binary 应用。
示例
# java/com/samples/hello_world/BUILD
android_library(
name = "hello_world_lib",
srcs = ["Lib.java"],
manifest = "LibraryManifest.xml",
resource_files = glob(["res/**"]),
)
# The app under test
android_binary(
name = "hello_world_app",
manifest = "AndroidManifest.xml",
deps = [":hello_world_lib"],
)
# javatests/com/samples/hello_world/BUILD
android_library(
name = "hello_world_test_lib",
srcs = ["Tests.java"],
deps = [
"//java/com/samples/hello_world:hello_world_lib",
... # test dependencies such as Espresso and Mockito
],
)
# The test app
android_binary(
name = "hello_world_test_app",
instruments = "//java/com/samples/hello_world:hello_world_app",
manifest = "AndroidManifest.xml",
deps = [":hello_world_test_lib"],
)
android_instrumentation_test(
name = "hello_world_uiinstrumentation_tests",
target_device = ":some_target_device",
test_app = ":hello_world_test_app",
)
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
support_apks
|
标签列表;默认值为 |
target_device
|
标签;必填 测试应在其上运行的 android_device。 如需在已在运行的模拟器或实体设备上运行测试,请使用以下参数:
|
test_app
|
标签;必填 包含测试类的 android_binary 目标。android_binary 目标必须通过其 instruments 属性指定要测试的目标。
|
android_local_test
查看规则源代码android_local_test(name, deps, srcs, data, args, compatible_with, custom_package, densities, deprecation, enable_data_binding, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, licenses, local, manifest, manifest_values, nocompress_extensions, plugins, resource_configuration_filters, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, visibility)
此规则用于在本地(而非在设备上)单元测试 android_library 规则。它可与 Android Robolectric 测试框架搭配使用。如需详细了解如何编写 Robolectric 测试,请访问 Android Robolectric 网站。
隐式输出目标
name.jar:测试的 Java 归档。name-src.jar:包含源代码的归档文件(“源 jar”)。name_deploy.jar:适合部署的 Java 部署归档文件(仅在明确请求时构建)。
示例
如需将 Robolectric 与 android_local_test 搭配使用,请将 Robolectric 的代码库添加到 WORKSPACE 文件中:
http_archive(
name = "robolectric",
urls = ["https://github.com/robolectric/robolectric-bazel/archive/<COMMIT>.tar.gz"],
strip_prefix = "robolectric-bazel-<COMMIT>",
sha256 = "<HASH>",
)
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
robolectric_repositories()
maven_jar 规则。
然后,每条 android_local_test 规则都应依赖于 @robolectric//bazel:robolectric。请参阅下面的示例。
android_local_test(
name = "SampleTest",
srcs = [
"SampleTest.java",
],
manifest = "LibManifest.xml",
deps = [
":sample_test_lib",
"@robolectric//bazel:android-all",
],
)
android_library(
name = "sample_test_lib",
srcs = [
"Lib.java",
],
resource_files = glob(["res/**"]),
manifest = "AndroidManifest.xml",
)
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为
|
srcs
|
标签列表;默认值为 编译了类型为 系统会解压缩并编译类型为 只要存在上述文件类型的至少一个文件,系统就会忽略所有其他文件。否则,系统会抛出错误。
|
custom_package
|
字符串;默认值为 test_class。
|
densities
|
字符串列表;默认值为 |
enable_data_binding
|
布尔值;默认值为 |
javacopts
|
字符串列表;默认值为 这些编译器选项会在全局编译器选项之后传递给 javac。 |
jvm_flags
|
字符串列表;默认值为 Java 二进制文件的封装容器脚本包含 CLASSPATH 定义(用于查找所有依赖项 jar),并调用正确的 Java 解释器。
封装容器脚本生成的命令行包含主类名称后跟 请注意,此属性对 |
manifest
|
标签;默认值为 AndroidManifest.xml。
如果定义了 resource_files 或 assets,或者受测库中的任何清单中包含 minSdkVersion 标记,则必须定义。
|
manifest_values
|
字典:字符串 -> 字符串;默认值为 applicationId、versionCode、versionName、minSdkVersion、targetSdkVersion 和 maxSdkVersion 还会替换清单和 uses-sdk 标记的相应属性。系统会忽略 packageName,并根据 applicationId(如果已指定)或清单中的软件包进行设置。
无需在规则中添加清单即可使用 manifest_values。
|
nocompress_extensions
|
字符串列表;默认值为 |
plugins
|
标签列表;默认值为 java_plugin。库还可以从使用 exported_plugins 的依赖项继承插件。插件生成的资源将包含在此规则的生成 jar 中。
|
resource_configuration_filters
|
字符串列表;默认值为 |
resource_jars
|
标签列表;默认值为 |
resource_strip_prefix
|
字符串;默认值为
如果指定了此路径前缀,系统会从 |
runtime_deps
|
标签列表;默认值为 deps 一样,这些类会显示在运行时类路径中,但与它们不同的是,不会显示在编译时类路径中。仅在运行时需要的依赖项应在此处列出。依赖项分析工具应忽略同时出现在 runtime_deps 和 deps 中的目标。
|
stamp
|
整数;默认为
除非其依赖项发生变化,否则不会重新构建带有标记的二进制文件。 |
test_class
|
字符串;默认值为
此属性指定要由此测试运行的 Java 类的名称。很少需要设置此参数。如果省略此参数,则系统会使用名称与此 |
use_launcher
|
布尔值;默认值为 如果此属性设置为 false,系统将忽略此目标的 launcher 属性和相关的 |
android_device
查看规则源代码android_device(name, cache, compatible_with, default_properties, deprecation, distribs, exec_compatible_with, exec_properties, features, horizontal_resolution, licenses, platform_apks, ram, restricted_to, screen_density, system_image, tags, target_compatible_with, testonly, vertical_resolution, visibility, vm_heap)
此规则会创建一个使用给定规范配置的 Android 模拟器。您可以通过 bazel run 命令或直接执行生成的脚本来启动此模拟器。建议依赖现有的 android_device 规则,而不是自行定义规则。
此规则是适合将 --run_under 标志传递给 bazel 测试和 blaze 运行的目标。它会启动模拟器,将要测试/运行的目标复制到模拟器,并根据需要对其进行测试或运行。
如果底层 system_image 基于 x86 且最多针对 I686 CPU 架构进行了优化,android_device 支持创建 KVM 映像。如需使用 KVM,请将 tags = ['requires-kvm'] 添加到 android_device 规则。
隐式输出目标
name_images/userdata.dat:包含用于启动模拟器的映像文件和快照name_images/emulator-meta-data.pb:包含传递给模拟器以重启模拟器所需的序列化信息。
示例
以下示例展示了如何使用 android_device。//java/android/helloandroid/BUILD 包含
android_device(
name = "nexus_s",
cache = 32,
default_properties = "nexus_s.properties",
horizontal_resolution = 480,
ram = 512,
screen_density = 233,
system_image = ":emulator_images_android_16_x86",
vertical_resolution = 800,
vm_heap = 32,
)
filegroup(
name = "emulator_images_android_16_x86",
srcs = glob(["androidsdk/system-images/android-16/**"]),
)
//java/android/helloandroid/nexus_s.properties 包含:
ro.product.brand=google ro.product.device=crespo ro.product.manufacturer=samsung ro.product.model=Nexus S ro.product.name=soju
此规则将生成映像和启动脚本。您可以通过执行 bazel run :nexus_s -- --action=start 在本地启动模拟器。该脚本会公开以下标志:
- --adb_port:用于公开 adb 的端口。如果您想向模拟器发出 adb 命令,则需要通过此端口发出 adb connect 命令。
- --emulator_port:用于公开模拟器 telnet 管理控制台的端口。
- --enable_display:如果为 true,则使用显示屏启动模拟器(默认为 false)。
- --action:start 或 kill。
- --apks_to_install:要在模拟器上安装的 apk 的列表。
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
cache
|
整数;必需 模拟器缓存分区的大小(以兆字节为单位)。 此值的最小值为 16 兆字节。 |
default_properties
|
标签;默认值为 |
horizontal_resolution
|
整数;必需 要模拟的水平屏幕分辨率(以像素为单位)。 最小值为 240。 |
platform_apks
|
标签列表;默认值为 |
ram
|
整数;必需 要为设备模拟的 RAM 量(以兆字节为单位)。 这适用于整个设备,而不仅仅是设备上安装的特定应用。最小值为 64 兆字节。 |
screen_density
|
整数;必需 模拟屏幕的密度(以每英寸像素为单位)。 此值的最小值为 30 ppi。 |
system_image
|
标签;必填 包含以下文件的文件组:
|
vertical_resolution
|
整数;必需 要模拟的垂直屏幕分辨率(以像素为单位)。 最小值为 240。 |
vm_heap
|
整数;必需 Android 将为每个进程使用的虚拟机堆的大小(以兆字节为单位)。 最小值为 16 兆字节。 |
android_ndk_repository
查看规则源代码android_ndk_repository(name, api_level, path, repo_mapping)
将 Bazel 配置为使用 Android NDK 来支持使用原生代码构建 Android 目标。
请注意,此 android_ndk_repository 实现将被 Starlark 中的实现取代。android_ndk_repository 的 Starlark 版本将支持未来版本的 NDK(包括 25 及更高版本)。如需了解 Starlark 版本,请参阅 rules_android_ndk。
请注意,若要针对 Android 构建,您还需要在 WORKSPACE 文件中添加 android_sdk_repository 规则。
如需了解详情,请参阅 有关将 Android NDK 与 Bazel 搭配使用的完整文档。
示例
android_ndk_repository(
name = "androidndk",
)
上述示例将从 $ANDROID_NDK_HOME 中定位您的 Android NDK,并检测其支持的最高 API 级别。
android_ndk_repository(
name = "androidndk",
path = "./android-ndk-r20",
api_level = 24,
)
上述示例将使用位于 ./android-ndk-r20 中工作区内的 Android NDK。它会在编译 JNI 代码时使用 API 级别 24 库。
cpufeatures
Android NDK 包含 cpufeatures 库,可用于在运行时检测设备的 CPU。以下示例演示了如何将 cpufeatures 与 Bazel 搭配使用。
# jni.cc #include "ndk/sources/android/cpufeatures/cpu-features.h" ...
# BUILD
cc_library(
name = "jni",
srcs = ["jni.cc"],
deps = ["@androidndk//:cpufeatures"],
)
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
api_level
|
整数;不可配置;默认为 |
path
|
字符串;不可配置;默认值为 $ANDROID_NDK_HOME 环境变量。
您可以从 Android 开发者网站 下载 Android NDK。 |
repo_mapping
|
字典:字符串 -> 字符串;默认值为 例如,条目 |
android_sdk_repository
查看规则源代码android_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)
配置 Bazel 以使用本地 Android SDK 来支持构建 Android 目标。
示例
若要为 Bazel 设置 Android SDK,至少需要在WORKSPACE 文件中放置一个名为“androidsdk”的 android_sdk_repository 规则,并将 $ANDROID_HOME 环境变量设置为 Android SDK 的路径。默认情况下,Bazel 会使用 Android SDK 中安装的最高 Android API 级别和 build 工具版本。
android_sdk_repository(
name = "androidsdk",
)
为确保可重现的 build,可以将 path、api_level 和 build_tools_version 属性设置为特定值。如果 Android SDK 未安装指定的 API 级别或 build 工具版本,构建将会失败。
android_sdk_repository(
name = "androidsdk",
path = "./sdk",
api_level = 19,
build_tools_version = "25.0.0",
)
上述示例还演示了如何使用相对于工作区的 Android SDK 路径。如果 Android SDK 是您的 Bazel 工作区的一部分(例如,已提交到版本控制系统),此方法非常有用。
支持库
支持库在 Android SDK 管理器中显示为“Android 支持代码库”。这是一个版本化的常用 Android 库集(例如 Support 库和 AppCompat 库),已打包为本地 Maven 制品库。android_sdk_repository 会为这些库中的每个库生成 Bazel 目标,这些目标可在 android_binary 和 android_library 目标的依赖项中使用。
生成的目标的名称派生自 Android 支持库中库的 Maven 坐标,格式为 @androidsdk//${group}:${artifact}-${version}。以下示例展示了 android_library 如何依赖于 v7 appcompat 库的 25.0.0 版。
android_library(
name = "lib",
srcs = glob(["*.java"]),
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
deps = ["@androidsdk//com.android.support:appcompat-v7-25.0.0"],
)
参数
| 属性 | |
|---|---|
name |
名称;必需 此目标的唯一名称。 |
api_level
|
整数;不可配置;默认为 您可以使用 如需查看 |
build_tools_version
|
字符串;不可配置;默认值为 Bazel 需要使用版本 30.0.0 或更高版本的构建工具。 |
path
|
字符串;不可配置;默认值为 $ANDROID_HOME 环境变量。
您可以从 Android 开发者网站下载 Android SDK。 |
repo_mapping
|
字典:字符串 -> 字符串;默认值为 例如,条目 |