规则
- 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:使用调试密钥签名并经过 zipaligned 的 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 时,才会生成此输出。
示例
您可以在 Bazel 源代码树的 examples/android 目录中找到 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。生成的文件(来自 genrule)也可以通过此处的标签进行引用。唯一的限制是,生成的输出必须与所包含的任何其他资源文件位于同一“ 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:包含相应目标的 Java 归档和资源的 Android“aar”软件包。不包含传递闭包。
示例
您可以在 Bazel 源代码树的 examples/android 目录中找到 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、java_library(具有android约束条件)以及cc_library(用于包装或生成.so原生库)Android 目标平台。 | 
| 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。生成的文件(来自 genrule)也可以通过此处的标签进行引用。唯一的限制是,生成的输出必须与所包含的任何其他资源文件位于同一“ 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,则系统将忽略此目标的 启动器属性和相关的  | 
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 test 和 blaze run。它会启动模拟器,将要测试/运行的目标复制到模拟器,并根据需要对其进行测试或运行。
如果底层 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:启动或终止。
- --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 中的实现所取代。对未来版本的 NDK(包括版本 25 及更高版本)的支持将在 Starlark 版本的 android_ndk_repository 中实现。如需了解 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 tools 版本。
android_sdk_repository(
    name = "androidsdk",
)
为确保可重现的 build,可以将 path、api_level 和 build_tools_version 属性设置为特定值。如果 Android SDK 未安装指定的 API 级别或 build tools 版本,则 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 库(例如支持库和 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 需要 build tools 版本 30.0.0 或更高版本。 | 
| path | 字符串;不可配置;默认值为  $ANDROID_HOME环境变量。您可以从 Android 开发者网站下载 Android SDK。 | 
| repo_mapping | 字典:字符串 -> 字符串;默认值为  例如,条目  |