Android 规则

报告问题 查看源代码 每夜 build · 8.0 . 7.47.3 · 7.2 · 7.1 · 7.0 · 6.5

规则

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_mappingshrink_resources 时,才会生成此输出。

示例

如需查看 Android 规则示例,请参阅 Bazel 源代码树的 examples/android 目录。

参数

属性
name

名称;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

要关联到二进制目标的其他库的列表。 允许的库类型包括:android_library、带有 android 约束条件的 java_library,以及为 Android 目标平台封装或生成 .so 原生库的 cc_library
srcs

标签列表;默认值为 []

用于创建目标而经过处理的源文件列表。

编译了类型为 .javasrcs 文件。 为方便阅读,请勿将生成的 .java 源文件的名称放入 srcs。 而是将依赖的规则名称放在 srcs 中,如下所述。

系统会解压缩并编译类型为 .srcjarsrcs 文件。(如果您需要使用 genrule 或 build 扩展生成一组 .java 文件,这会很有用。)

assets

标签列表;默认值为 []

要打包的资源列表。 这通常是 assets 目录下所有文件的 glob。您还可以引用其他软件包中的其他规则(生成文件的任何规则)或导出的文件,前提是所有这些文件都位于相应软件包的 assets_dir 目录下。
assets_dir

字符串;默认值为 ""

用于指定 assets 中文件路径的字符串。 assetsassets_dir 对用于描述打包的资源,并且应同时提供这两个属性,或者都不提供。
crunch_png

布尔值;默认值为 True

执行 PNG 处理(或不执行)。这与始终执行的九宫格处理无关。这是针对 aapt bug 的已废弃解决方法,该 bug 已在 aapt2 中修复。
custom_package

字符串;默认值为 ""

要为其生成 Java 源代码的 Java 软件包。 默认情况下,系统会根据包含规则的 build 文件所在的目录推断出软件包。您可以指定其他软件包,但强烈建议您不要这样做,因为这可能会导致与其他库引入类路径冲突,而这些冲突只会在运行时检测到。
debug_key

标签;默认值为 "@bazel_tools//tools/android:debug_keystore"

包含要用于对调试 APK 签名的调试密钥库的文件。通常,您不希望使用默认密钥以外的密钥,因此应省略此属性。

警告:请勿使用您的生产密钥,应对其进行严格保护,并将其保存在源代码树中

debug_signing_keys

标签列表;默认值为 []

用于对调试 APK 进行签名的文件和调试密钥库的列表。通常,您不希望使用默认密钥以外的密钥,因此应省略此属性。

警告:请勿使用您的生产密钥,应对其进行严格保护,并将其保存在源代码树中

debug_signing_lineage_file

标签;默认值为 None

包含 debug_signing_keys 的签名谱系的文件。通常,您不希望使用默认密钥以外的密钥,因此应省略此属性。

警告:请勿使用您的生产密钥,应对其进行严格保护,并将其保存在源代码树中

densities

字符串列表;默认值为 []

构建 APK 时要过滤的密度。 这会移除不会由具有指定屏幕密度的设备加载的光栅可绘制资源,以缩减 APK 大小。如果清单中尚不包含超集列表,系统还会在清单中添加相应的“compatible-screens”部分。
dex_shards

整数;默认为 1

应分解为的索引分片数量。 这样可以加快 dex 速度,但会牺牲应用安装和启动时间。二进制文件越大,应使用的分片就越多。25 是一个不错的起始值。

请注意,每个分片都会在最终应用中产生至少一个 dex。因此,不建议将此值设置为大于 1 的值。

dexopts

字符串列表;默认值为 []

生成 classes.dex 时,dx 工具的其他命令行标志。 会受到 “Make 变量”替换和 Bourne shell 令牌化的影响。
enable_data_binding

布尔值;默认值为 False

如果为 true,此规则会处理通过 resource_files 属性包含的布局资源中的数据绑定表达式。如果没有此设置,数据绑定表达式会导致 build 失败。

如需使用数据绑定构建 Android 应用,您还必须执行以下操作:

  1. 为所有传递依赖于此规则的 Android 规则设置此属性。 这是因为依赖项会通过资源合并继承规则的数据绑定表达式。因此,它们还需要使用数据绑定进行构建,以解析这些表达式。
  2. 为设置此属性的所有目标添加数据绑定运行时库的 deps = 条目。此库的位置取决于您的代码库设置。
incremental_dexing

整数;不可配置;默认为 -1

强制以是否启用增量编译的方式构建目标,覆盖默认值和 --incremental_dexing 标志。
instruments

标签;默认值为 None

要插桩的 android_binary 目标。

如果设置此属性,系统会将此 android_binary 视为插桩测试的测试应用。然后,android_instrumentation_test 目标可以在其 test_app 属性中指定此目标。

javacopts

字符串列表;默认值为 []

此目标的额外编译器选项。 会受到 “Make 变量”替换和 Bourne shell 令牌化的影响。

这些编译器选项会在全局编译器选项之后传递给 javac。

key_rotation_min_sdk

字符串;默认值为 ""

设置应使用 APK 的轮替签名密钥生成 APK 签名的最低 Android 平台版本(API 级别)。该 APK 的原始签名密钥将用于所有先前的平台版本。
main_dex_list

标签;默认值为 None

文本文件包含类文件名称列表。这些类文件定义的类会放入主要的 classes.dex 中,例如:
          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

字符串列表;默认值为 []

要传递给主要 dex 列表构建器的命令行选项。 使用此选项可影响主 DEX 列表中包含的类。
main_dex_proguard_specs

标签列表;默认值为 []

要用作 ProGuard 规范的文件,用于确定必须保留在主 DEX 中的类。 仅当 multidex 属性设置为 legacy 时才允许。
manifest

标签;必填

Android 清单文件的名称,通常为 AndroidManifest.xml。 如果定义了 resource_files 或 assets,则必须定义。
manifest_values

字典:字符串 -> 字符串;默认值为 {}

要在清单中替换的值的字典。

清单中的任何 ${name} 实例都将替换为此字典中与 name 对应的值。

applicationIdversionCodeversionNameminSdkVersiontargetSdkVersionmaxSdkVersion 还会替换清单和 uses-sdk 标记中的相应属性。

系统会忽略 packageName,并根据 applicationId(如果已指定)或清单中的软件包进行设置。

manifest_merger 设置为 legacy 时,只有 applicationIdversionCodeversionName 才会产生任何影响。

multidex

字符串;默认值为 "native"

是否将代码拆分为多个 dex 文件。
可能的值:
  • native:当超过 DEX 64K 索引限制时,将代码拆分为多个 DEX 文件。假定原生平台支持在运行时加载 multidex 类。 此方法仅适用于 Android L 及更高版本
  • legacy:当超过 DEX 64K 索引限制时,将代码拆分为多个 DEX 文件。假定 Multidex 类是通过应用代码加载的(即不支持原生平台)。
  • manual_main_dex:当超过 DEX 64K 索引限制时,将代码拆分为多个 DEX 文件。您需要使用 main_dex_list 属性在文本文件中提供类列表,以指定主 DEX 文件的内容。
  • off:将所有代码编译到单个 dex 文件,即使其超出索引限制也是如此。
nocompress_extensions

字符串列表;默认值为 []

要在 APK 中保持未压缩状态的文件扩展名的列表。
package_id

整数;默认为 0

要分配给此二进制文件中的资源的软件包 ID。

如需了解详情,请参阅 AAPT2 的 --package-id 参数。通常可以(也应)将其保持未设置状态,默认值为 127 (0x7F)。

plugins

标签列表;默认值为 []

要在编译时运行的 Java 编译器插件。 每当构建此目标时,plugins 属性中指定的每个 java_plugin 都会运行。插件生成的资源将包含在目标的结果 jar 中。
proguard_apply_dictionary

标签;默认值为 None

要用作 ProGuard 映射的文件。 在混淆期间重命名类和成员时要从中提取的“字词”的行分隔文件。
proguard_apply_mapping

标签;默认值为 None

要用作 ProGuard 映射的文件。 由 proguard_generate_mapping 生成的映射文件,可重复使用,以将相同的映射应用于新 build。
proguard_generate_mapping

布尔值;不可配置;默认值为 False

是否生成 Proguard 映射文件。 仅当指定了 proguard_specs 时,系统才会生成映射文件。此文件将列出原始与混淆过的类、方法和字段名称之间的映射。

警告:如果使用此属性,Proguard 规范不应包含 -dontobfuscate-printmapping

proguard_specs

标签列表;默认值为 []

要用作 Proguard 规范的文件。 此文件将介绍 Proguard 要使用的一组规范。
resource_configuration_filters

字符串列表;默认值为 []

资源配置过滤条件列表,例如“en”,用于将 apk 中的资源限制为仅包含“en”配置中的资源。如需启用伪本地化,请添加 en_XA 和/或 ar_XB 伪语言区域。
resource_files

标签列表;默认值为 []

要打包的资源列表。 这通常是 res 目录下所有文件的 glob
您还可以通过此处的标签引用生成的文件(来自 genrules)。唯一的限制是,生成的输出必须与包含的任何其他资源文件位于同一“res”目录下。
shrink_resources

整数;默认为 -1

是否执行资源缩减。二进制文件未使用的资源将从 APK 中移除。只有使用本地资源(即 manifestresource_files 属性)的规则支持此功能,并且需要 ProGuard。它的运作方式与 Gradle 资源缩减器 (https://developer.android.com/studio/build/shrink-code.html#shrink-resources) 基本相同。

显著差异:

  • 系统会移除 values/ 中的资源以及基于文件的资源
  • 默认使用 strict mode
  • 仅 aapt2 支持移除未使用的 ID 资源
如果启用了资源缩减功能,系统还会生成 name_files/resource_shrinker.log,详细说明所执行的分析和删除操作。

可能的值:

  • shrink_resources = 1:开启 Android 资源缩减
  • shrink_resources = 0:停用 Android 资源缩减
  • shrink_resources = -1:压缩由 --android_resource_shrinking 标志控制。

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_libraryandroid_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

标签列表;默认值为 []

要导出到依赖于此规则的规则的目标。 请参阅 java_library.exports。
srcjar

标签;默认值为 None

一个 JAR 文件,其中包含 AAR 中已编译 JAR 文件的源代码。

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 文件的列表。

编译了类型为 .javasrcs 文件。 为方便阅读,请勿将生成的 .java 源文件的名称放入 srcs。 而是将依赖的规则名称放在 srcs 中,如下所述。

系统会解压缩并编译类型为 .srcjarsrcs 文件。(如果您需要使用 genrule 或 build 扩展生成一组 .java 文件,这会很有用。)

如果省略 srcs,则 deps 中指定的任何依赖项都会从此规则导出(如需详细了解如何导出依赖项,请参阅 java_library 的导出)。不过,此行为很快就会被弃用;请尽量不要依赖它。

assets

标签列表;默认值为 []

要打包的资源列表。 这通常是 assets 目录下所有文件的 glob。您还可以引用其他软件包中的其他规则(生成文件的任何规则)或导出的文件,前提是所有这些文件都位于相应软件包的 assets_dir 目录下。
assets_dir

字符串;默认值为 ""

用于指定 assets 中文件路径的字符串。 assetsassets_dir 对用于描述打包的资源,并且应同时提供这两个属性,或者都不提供。
custom_package

字符串;默认值为 ""

要为其生成 Java 源代码的 Java 软件包。 默认情况下,系统会根据包含规则的 build 文件所在的目录推断出软件包。您可以指定其他软件包,但强烈建议您不要这样做,因为这可能会导致与其他库引入类路径冲突,而这些冲突只会在运行时检测到。
enable_data_binding

布尔值;默认值为 False

如果为 true,此规则会处理通过 resource_files 属性包含的布局资源中的数据绑定表达式。如果没有此设置,数据绑定表达式会导致 build 失败。

如需使用数据绑定构建 Android 应用,您还必须执行以下操作:

  1. 为所有传递依赖于此规则的 Android 规则设置此属性。 这是因为依赖项会通过资源合并继承规则的数据绑定表达式。因此,它们还需要使用数据绑定进行构建,以解析这些表达式。
  2. 为设置此属性的所有目标添加数据绑定运行时库的 deps = 条目。此库的位置取决于您的代码库设置。
exported_plugins

标签列表;默认值为 []

要导出到直接依赖于此库的库的 java_plugin(例如注解处理程序)的列表。

指定的 java_plugin 列表将应用于直接依赖于此库的任何库,就像该库在 plugins 中明确声明了这些标签一样。

exports

标签列表;默认值为 []

通过 exports 属性可访问的所有规则的闭包都被视为直接依赖于具有 exports 的目标的任何规则的直接依赖项。

exports 不是其所属规则的直接依赖项。

exports_manifest

整数;默认为 1

是否将清单条目导出到依赖于此目标的 android_binary 目标。系统永远不会导出 uses-permissions 属性。
idl_import_root

字符串;默认值为 ""

相对于软件包的路径,指向包含此库中所含 idl 源代码的 Java 软件包树的根目录。

在处理依赖于此库的 idl 源代码时,此路径将用作导入根目录。

指定 idl_import_root 后,idl_parcelablesidl_srcs 都必须位于 idl_import_root 下代表它们的对象的 Java 软件包指定的路径中。如果未指定 idl_import_root,则 idl_parcelablesidl_srcs 都必须位于 Java 根目录下的软件包指定的路径中。

请参阅 示例

idl_parcelables

标签列表;默认值为 []

要作为导入项提供的 Android IDL 定义的列表。 这些文件将作为导入项提供给直接或通过其传递闭包依赖于此库的任何 android_library 目标,但不会翻译为 Java 或编译。

应仅添加直接与此库中的 .java 源对应的 .aidl 文件(例如 Parcelable 的自定义实现),否则应使用 idl_srcs

这些文件必须放置在适当的位置,以便 aidl 编译器能够找到它们。 如需了解这意味着什么,请参阅 idl_import_root 的说明

idl_preprocessed

标签列表;默认值为 []

要作为导入项提供的预处理 Android IDL 定义的列表。 这些文件将作为导入项提供给直接或通过其传递闭包依赖于此库的任何 android_library 目标,但不会翻译为 Java 或编译。

应仅包含与此库中的 .java 源直接对应的预处理 .aidl 文件(例如 Parcelable 的自定义实现),否则,请为需要转换为 Java 接口的 Android IDL 定义使用 idl_srcs,并为未经预处理的 AIDL 文件使用 idl_parcelable

idl_srcs

标签列表;默认值为 []

要转换为 Java 接口的 Android IDL 定义的列表。 生成 Java 接口后,它们将与 srcs 的内容一起编译。

这些文件将作为导入项提供给直接或通过传递闭包依赖于此库的任何 android_library 目标。

这些文件必须放置在适当的位置,以便 aidl 编译器能够找到它们。 如需了解这意味着什么,请参阅 idl_import_root 的说明

javacopts

字符串列表;默认值为 []

此目标的额外编译器选项。 会受到 “Make 变量”替换和 Bourne shell 令牌化的影响。

这些编译器选项会在全局编译器选项之后传递给 javac。

manifest

标签;默认值为 None

Android 清单文件的名称,通常为 AndroidManifest.xml。 如果定义了 resource_files 或 assets,则必须定义。

布尔值;默认值为 False

请仅在编译时使用此库,不要在运行时使用。 标记为 neverlink 的规则的输出不会用于创建 .apk。如果库将由运行时环境在执行期间提供,则此属性非常有用。
plugins

标签列表;默认值为 []

要在编译时运行的 Java 编译器插件。 每当构建此目标时,plugins 属性中指定的每个 java_plugin 都会运行。插件生成的资源将包含在目标的结果 jar 中。
proguard_specs

标签列表;默认值为 []

要用作 Proguard 规范的文件。 这些文件将描述 Proguard 要使用的一组规范。如果指定了这些属性,系统会将其添加到依赖于此库的任何 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

标签列表;默认值为 []

在插桩测试开始之前要安装到设备上的其他 APK。
target_device

标签;必填

测试应在其上运行的 android_device

如需在已在运行的模拟器或实体设备上运行测试,请使用以下参数: --test_output=streamed --test_arg=--device_broker_type=LOCAL_ADB_SERVER --test_arg=--device_serial_number=$device_identifier

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()
这会提取 Robolectric 所需的 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

标签列表;默认值为 []

要测试的库的列表,以及要关联到目标的其他库。 此属性的传递闭包中 Android 规则中声明的所有资源、资源和清单文件都会在测试中提供。

deps 中允许的规则列表包括 android_libraryaar_importjava_importjava_libraryjava_lite_proto_library

srcs

标签列表;默认值为 []

用于创建目标而被处理的源文件的列表。 除下文所述的特殊情况外,必须提供。

编译了类型为 .javasrcs 文件。 为方便阅读,请勿将生成的 .java 源文件的名称放入 srcs。 而是将依赖的规则名称放在 srcs 中,如下所述。

系统会解压缩并编译类型为 .srcjarsrcs 文件。(如果您需要使用 genrule 或 build 扩展生成一组 .java 文件,这会很有用。)

只要存在上述文件类型的至少一个文件,系统就会忽略所有其他文件。否则,系统会抛出错误。

srcs 属性是必需属性,不能为空,除非指定了 runtime_deps

custom_package

字符串;默认值为 ""

将生成 R 类的 Java 软件包。默认情况下,系统会根据包含相应规则的 BUILD 文件所在的目录推断出软件包。如果您使用此属性,可能还需要使用 test_class
densities

字符串列表;默认值为 []

构建 APK 时要过滤的密度。如果清单中尚不包含超集 StarlarkListing,系统还会向清单中添加相应的“compatible-screens”部分。
enable_data_binding

布尔值;默认值为 False

如果为 true,此规则会处理此测试所使用的启用了数据绑定的依赖项中使用的数据绑定引用。如果没有此设置,数据绑定依赖项将不会进行必要的二进制级代码生成,并且可能会导致构建失败。
javacopts

字符串列表;默认值为 []

此库的额外编译器选项。 会受到 “Make 变量”替换和 Bourne shell 令牌化的影响。

这些编译器选项会在全局编译器选项之后传递给 javac。

jvm_flags

字符串列表;默认值为 []

要嵌入到为运行此二进制文件而生成的封装容器脚本中的标志列表。 会受到 $(location)“Make 变量”替换以及 Bourne shell 令牌化的影响。

Java 二进制文件的封装容器脚本包含 CLASSPATH 定义(用于查找所有依赖项 jar),并调用正确的 Java 解释器。 封装容器脚本生成的命令行包含主类名称,后跟 "$@",以便您在类名称后传递其他参数。不过,必须在命令行上的类名称前指定要由 JVM 解析的参数。jvm_flags 的内容会在列出类名称之前添加到封装容器脚本中。

请注意,此属性对 *_deploy.jar 输出没有影响

manifest

标签;默认值为 None

Android 清单文件的名称,通常为 AndroidManifest.xml。 如果定义了 resource_files 或 assets,或者受测库中的任何清单中包含 minSdkVersion 标记,则必须定义。
manifest_values

字典:字符串 -> 字符串;默认值为 {}

要在清单中替换的值的字典。清单中的 ${name} 的任何实例都将替换为此字典中与 name 对应的值。 applicationIdversionCodeversionNameminSdkVersiontargetSdkVersionmaxSdkVersion 还会替换清单和 uses-sdk 标记的相应属性。系统会忽略 packageName,并根据 applicationId(如果已指定)或清单中的软件包进行设置。 无需在规则中添加清单即可使用 manifest_values。
nocompress_extensions

字符串列表;默认值为 []

要在资源 APK 中保持未压缩状态的文件扩展名的列表。
plugins

标签列表;默认值为 []

要在编译时运行的 Java 编译器插件。 每当构建此规则时,系统都会运行此属性中指定的每个 java_plugin。库还可以从使用 exported_plugins 的依赖项继承插件。插件生成的资源将包含在此规则的生成 jar 中。
resource_configuration_filters

字符串列表;默认值为 []

资源配置过滤条件列表,例如“en”,用于将 apk 中的资源限制为仅包含“en”配置中的资源。
resource_jars

标签列表;默认值为 []

已废弃:请改用 java_import 和 deps 或 runtime_deps。
resource_strip_prefix

字符串;默认值为 ""

要从 Java 资源中剥离的路径前缀。

如果指定了此路径前缀,系统会从 resources 属性中的每个文件中剥离此前缀。如果资源文件不在该目录下,则会出错。如果未指定(默认),系统会根据与源文件的 Java 软件包相同的逻辑确定资源文件的路径。例如,位于 stuff/java/foo/bar/a.txt 的源文件将位于 foo/bar/a.txt

runtime_deps

标签列表;默认值为 []

仅在运行时提供给最终二进制文件或进行测试的库。 与普通 deps 一样,这些类会显示在运行时类路径中,但与它们不同的是,不会显示在编译时类路径中。仅在运行时需要的依赖项应在此处列出。依赖项分析工具应忽略同时出现在 runtime_depsdeps 中的目标。
stamp

整数;默认为 0

是否将 build 信息编码到二进制文件中。可能的值:
  • stamp = 1:始终将 build 信息戳入二进制文件,即使在 --nostamp build 中也是如此。应避免使用此设置,因为它可能会终止二进制文件以及依赖于它的所有下游操作的远程缓存。
  • stamp = 0:始终将 build 信息替换为常量值。这可实现良好的 build 结果缓存。
  • stamp = -1:build 信息的嵌入由 --[no]stamp 标志控制。

除非其依赖项发生变化,否则不会重新构建带有标记的二进制文件。

test_class

字符串;默认值为 ""

要由测试运行程序加载的 Java 类。

此属性指定要由此测试运行的 Java 类的名称。很少需要设置此参数。如果省略此参数,则系统会使用名称与此 android_local_test 规则的 name 对应的 Java 类。 测试类需要添加 org.junit.runner.RunWith 注解。

use_launcher

布尔值;默认值为 True

二进制文件是否应使用自定义启动器。

如果此属性设置为 false,系统将忽略此目标的 launcher 属性和相关的 --java_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

标签;默认值为 None

一个要放置在模拟器上的 /default.prop 中的属性文件。 这样,规则作者就可以进一步配置模拟器,使其看起来更像真实设备(尤其是控制其 UserAgent 字符串和其他可能导致应用或服务在特定设备上表现出不同行为的行为)。此文件中的属性将替换模拟器通常设置的只读属性,例如 ro.product.model。
horizontal_resolution

整数;必需

要模拟的水平屏幕分辨率(以像素为单位)。 最小值为 240。
platform_apks

标签列表;默认值为 []

要于启动时安装在设备上的 apk 的列表。
ram

整数;必需

要为设备模拟的 RAM 大小(以兆字节为单位)。 这适用于整个设备,而不仅仅是设备上安装的特定应用。最小值为 64 兆字节。
screen_density

整数;必需

模拟屏幕的密度(以每英寸像素为单位)。 此值的最小值为 30 ppi。
system_image

标签;必填

包含以下文件的文件组:
  • system.img:系统分区
  • kernel-qemu:模拟器将加载的 Linux 内核
  • ramdisk.img:启动时要使用的 initrd 映像
  • userdata.img:初始 userdata 分区
  • source.properties:包含图片相关信息的属性文件
这些文件是 Android SDK 的一部分,或由第三方提供(例如,Intel 提供 x86 映像)。
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

整数;不可配置;默认为 0

构建时所依赖的 Android API 级别。如果未指定,系统将使用安装的最高 API 级别。
path

字符串;不可配置;默认值为 ""

Android NDK 的绝对路径或相对路径。必须设置此属性或 $ANDROID_NDK_HOME 环境变量。

您可以从 Android 开发者网站 下载 Android NDK。

repo_mapping

字典:字符串 -> 字符串;默认值为 {}

一个字典,用于将本地代码库名称转换为全局代码库名称。这样,您就可以控制此仓库依赖项的工作区依赖项解析。

例如,条目 "@foo": "@bar" 声明,每当此代码库依赖于 "@foo"(例如对 "@foo//some:target" 的依赖项)时,它实际上都应在全局声明的 "@bar" ("@bar//some:target") 中解析该依赖项。

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,可以将 pathapi_levelbuild_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_binaryandroid_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

整数;不可配置;默认为 0

默认要构建的 Android API 级别。如果未指定,系统将使用安装的最高 API 级别。

您可以使用 android_sdk 标志替换为给定 build 使用的 API 级别。android_sdk_repository 会为 SDK 中安装的每个 API 级别创建一个名称为 @androidsdk//:sdk-${level}android_sdk 目标,无论是否指定此属性。例如,如需针对非默认 API 级别 bazel build --android_sdk=@androidsdk//:sdk-19 //java/com/example:app 进行构建,请使用以下命令:

如需查看 android_sdk_repository 生成的所有 android_sdk 目标,您可以运行 bazel query "kind(android_sdk, @androidsdk//...)"

build_tools_version

字符串;不可配置;默认值为 ""

要在 Android SDK 中使用的 Android 构建工具的版本。如果未指定,系统将使用安装的最新 build 工具版本。

Bazel 需要使用版本 30.0.0 或更高版本的构建工具。

path

字符串;不可配置;默认值为 ""

Android SDK 的绝对路径或相对路径。必须设置此属性或 $ANDROID_HOME 环境变量。

您可以从 Android 开发者网站下载 Android SDK。

repo_mapping

字典:字符串 -> 字符串;默认值为 {}

一个字典,用于将本地代码库名称转换为全局代码库名称。这样,您就可以控制此仓库依赖项的工作区依赖项解析。

例如,条目 "@foo": "@bar" 声明,每当此代码库依赖于 "@foo"(例如对 "@foo//some:target" 的依赖项)时,它实际上都应在全局声明的 "@bar" ("@bar//some:target") 中解析该依赖项。