Android 规则

报告问题 查看源代码 敬上 每晚 · 7.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 应用 使用调试密钥签名的软件包文件 zipaligned,就可用于开发和调试应用。 使用调试密钥签名时,您无法发布应用。
  • name_unsigned.apk: 上面可以使用发布密钥签名的 。
  • name_deploy.jar:包含 传递关闭此目标。

    这个部署 jar 中包含了 搜索此目标的运行时类路径的类加载器 自始至终。

  • name_proguard.jar:Java 归档,其中包含 在 name_deploy.jar。 只有在以下情况下才会生成此输出: proguard_specs 属性均为 。
  • name_proguard.map:映射文件结果 在 name_deploy.jar 上运行 ProGuard。 只有在以下情况下才会生成此输出: proguard_specs 属性均为 且 proguard_generate_mapping 或者设置了 shrink_resources 时。

示例

Android 规则的示例可在 examples/android 目录 Bazel 源代码树。

参数

属性
name

姓名;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

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

标签列表;默认值为 []

为创建目标而处理的源文件列表。

系统会编译 .java 类型的 srcs 文件。 为了便于阅读,最好不要输入 将生成的 .java 源文件复制到 srcs 中。 请改为将依赖的规则名称放入 srcs 中,如 如下所述。

系统会将 .srcjar 类型的 srcs 个文件解压缩并 编译完成。(如果您需要生成一组 Genrule 或 build 扩展程序。)

assets

标签列表;默认值为 []

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

String;默认值为 ""

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

布尔值;默认值为 True

是否处理 PNG 文件。这与九宫格处理无关,九宫格处理 完成。对于 aapt bug,其中 已在 aapt2 中修复。
custom_package

String;默认值为 ""

将为其生成 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 大小。对应的兼容屏幕 部分也会添加到清单中(如果它尚未包含超集) 商家信息。
dex_shards

整数;默认值为 1

dexing 应分解的分片数。 这可以大幅提升 dex 处理的速度,但会消耗应用安装和启动时间。通过 二进制文件越大,应该使用的分片就越多。刚开始时,最好将 25 进行试验。

请注意,每个分片都会在最终应用中生成至少一个 dex。因此 对于发布二进制文件,不建议将此值设置为大于 1。

dexopts

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

生成 class.dex 时用于 dx 工具的其他命令行标记。 需遵循 "Make variable" 替换和 Bourne shell 令牌化
enable_data_binding

布尔值;默认值为 False

如果为 true,此规则将处理 数据 binding 表达式,通过 resource_files 属性。不使用 设置,数据绑定表达式会导致构建失败。

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

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

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

强制构建目标,无论是否使用增量 dexing,覆盖默认值 和 --incremental_dexing 标志。
instruments

标签;默认值为 None

要插桩的 android_binary 目标。

如果设置了此属性,系统会将此 android_binary 视为测试 用于插桩测试的应用android_instrumentation_test 然后,可在其 test_app 属性。

javacopts

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

此目标的额外编译器选项。 需遵循 "Make variable" 替换和 Bourne shell 令牌化

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

key_rotation_min_sdk

String;默认值为 ""

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

标签;默认值为 None

文本文件包含类文件名列表。由这些类文件定义的类 放在主 class.dex 中。e.g.:
          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

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

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

清单中的任何 ${name} 实例都将替换为该值 。

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

packageName 将被忽略,并且会设为 applicationId(如果指定)或清单中的软件包。

manifest_merger 设置为 legacy 时, applicationIdversionCodeversionName将会 无效。

multidex

String;默认值为 "native"

是否将代码拆分为多个 dex 文件。
可能的值:
  • native:当 dex 为 64K 索引限制时,将代码拆分为多个 dex 文件 上限。假设原生平台支持在运行时加载 MultiDex 类。 这仅适用于 Android L 及更高版本。
  • legacy:当 dex 为 64K 索引限制时,将代码拆分为多个 dex 文件 上限。假设 MultiDex 类通过应用代码加载(即没有 原生平台支持)。
  • manual_main_dex:当 dex 为 64K 时,将代码拆分为多个 dex 文件 超出了索引限制。主 dex 文件的内容需要由 使用 main_dex_list 属性。
  • off:将所有代码编译为单个 dex 文件,即使该文件超出 索引限制。
nocompress_extensions

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

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

整数;默认值为 0

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

如需了解详情,请参阅 AAPT2 的 --package-id 参数。这可以(以及 通常应保持未设置状态,因此会采用默认值 127 (0x7F)。

plugins

标签列表;默认值为 []

在编译时运行的 Java 编译器插件。 以下列中指定的每个java_plugin: 插件属性会在 这个目标就创建好了生成的资源 该插件将会包含在 目标。
proguard_apply_dictionary

标签;默认值为 None

用作 ProGuard 映射的文件。 以换行符分隔的“words”文件重命名类和成员时提取的 混淆处理。
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

标签列表;默认值为 []

要打包的资源列表。 通常是 glob 下所有文件的 res 目录中。
生成的文件(来自 genrule)可通过 还要在此处添加标签。唯一的限制是 生成的输出必须在同一“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 标志。

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 归档的 bundle 此目标的资源和资源。不包含传递性闭包。

示例

Android 规则的示例可在 examples/android 目录 Bazel 源代码树。

以下示例展示了 如何设置 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 以及 cc_library 封装或生成 .so 原生库 针对 Android 目标平台。
srcs

标签列表;默认值为 []

.java.srcjar 文件的列表, 以创建目标。

系统会编译 .java 类型的 srcs 文件。 为了便于阅读,最好不要输入 将生成的 .java 源文件复制到 srcs 中。 请改为将依赖的规则名称放入 srcs 中,如 如下所述。

系统会将 .srcjar 类型的 srcs 个文件解压缩并 编译完成。(如果您需要生成一组 Genrule 或 build 扩展程序。)

如果省略 srcs,则将 已从此规则导出 deps(请参阅 java_library.exports了解详情 了解有关导出依赖项的信息)。不过,这种行为 即将弃用;尽量不要依赖于它。

assets

标签列表;默认值为 []

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

String;默认值为 ""

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

String;默认值为 ""

将为其生成 Java 源代码的 Java 软件包。 默认情况下,系统会根据 BUILD 文件所在的目录推断软件包 包含该规则的位置您可以指定其他软件包 强烈建议您不要这样做,因为它可能会导致 只在运行时检测到的库。
enable_data_binding

布尔值;默认值为 False

如果为 true,此规则将处理 数据 binding 表达式,通过 resource_files 属性。不使用 设置,数据绑定表达式会导致构建失败。

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

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

标签列表;默认值为 []

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

指定的 java_plugin 列表将应用于任何符合以下条件的库: 直接依赖于此库,就好比该库 plugins 中的标签。

exports

标签列表;默认值为 []

将关闭通过 exports 属性到达的所有规则 被视为直接依赖 使用 exports 确定目标。

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

exports_manifest

整数;默认值为 1

是否将清单条目导出到 android_binary 目标 依赖于此定位条件的应用绝不会导出 uses-permissions 属性。
idl_import_root

String;默认值为 ""

包含 idl 的 Java 软件包树根目录的软件包相对路径 此库中包含的一些来源。

处理要上传的 idl 来源时,此路径将用作导入根 都依赖于此库

如果指定了 idl_import_root,则 idl_parcelablesidl_srcs 必须位于对象的 java 软件包指定的路径下 它们在 idl_import_root 下代表。当idl_import_root: 未指定,则 idl_parcelablesidl_srcs 都必须位于 Java 根目录下由其软件包指定的路径。

请参阅 示例

idl_parcelables

标签列表;默认值为 []

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

只有 .aidl 文件直接对应于 应包含此库中的 .java 个来源(例如,自定义 Parcelable 的实现代码中),否则 idl_srcs 应为 。

这些文件必须放置在适当的位置,以便 AIDL 编译器找到它们。 请参阅 idl_import_root 的说明 了解其含义。

idl_preprocessed

标签列表;默认值为 []

要作为导入的预处理 Android IDL 定义列表。 这些文件将作为 依赖于此库的 android_library 目标 或通过其传递闭包,不会将其转换为 Java 或经过编译。

只有与以下查询直接对应的经过预处理的 .aidl 文件: 应包含此库中的 .java 个来源(例如,自定义 Parcelable 的实现),否则使用 idl_srcs 需要转换为 Java 接口的 Android IDL 定义 使用idl_parcelable 非预处理的 AIDL 文件。

idl_srcs

标签列表;默认值为 []

要转换为 Java 接口的 Android IDL 定义列表。 生成 Java 接口后,这些接口将一起编译 包含 srcs 的内容。

这些文件将作为 依赖于此库的 android_library 目标 或传递关闭。

这些文件必须放置在适当的位置,以便 AIDL 编译器找到它们。 请参阅 idl_import_root 的说明 了解其含义。

javacopts

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

此目标的额外编译器选项。 需遵循 "Make variable" 替换和 Bourne shell 令牌化

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

manifest

标签;默认值为 None

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

布尔值;默认值为 False

请仅将此库用于编译,不要在运行时使用。 标记为 neverlink 的规则的输出不会用于 “.apk”创建。如果库是由 运行时环境。
plugins

标签列表;默认值为 []

在编译时运行的 Java 编译器插件。 以下列中指定的每个java_plugin: 插件属性会在 这个目标就创建好了生成的资源 该插件将会包含在 目标。
proguard_specs

标签列表;默认值为 []

用作 Proguard 规范的文件。 这些将描述 Proguard 使用的一组规范。如果已指定, 它们会添加到依赖于此库的任何 android_binary 目标中。 此处包含的文件只能具有幂等规则,即 -dontnote、-dontwarn、 以及以 -keep 开头的规则。其他选项只能显示在 android_binary 的 proguard_specs,旨在确保非同义合并。
resource_files

标签列表;默认值为 []

要打包的资源列表。 通常是 glob 下所有文件的 res 目录中。
生成的文件(来自 genrule)可通过 还要在此处添加标签。唯一的限制是 生成的输出必须在同一“res”下与其他任何 资源文件。

android_sdk_repository

查看规则来源
android_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)

将 Bazel 配置为使用本地 Android SDK 来支持构建 Android 目标。

示例

若要设置 Android SDK for Bazel,至少要设置一个 android_sdk_repository 规则 名为“androidsdk”位于 WORKSPACE 文件中,并将 $ANDROID_HOME 环境变量添加到 Android SDK 的路径中。Bazel 将使用最高 Android API 级别 Android SDK 中默认安装的 Build Tools 和 Build Tools 版本。
android_sdk_repository(
    name = "androidsdk",
)

为确保 build 的可重现性,pathapi_level 和 可以将 build_tools_version 属性设为特定值。如果出现以下情况,则构建将失败: Android SDK 未安装指定的 API 级别或构建工具版本。

android_sdk_repository(
    name = "androidsdk",
    path = "./sdk",
    api_level = 19,
    build_tools_version = "25.0.0",
)

上面的示例还演示了如何使用指向 Android SDK 的工作区相对路径。这是 如果 Android SDK 是 Bazel 工作区的一部分(例如,如果它已签入到版本)中,则该 SDK 版本会很有用 控制)。

支持库

支持库在 Android SDK 管理器中可作为“Android 支持存储库”提供。 这是一组带版本号的常见 Android 库,例如 Support 库和 AppCompat 库, 打包为本地 Maven 制品库。android_sdk_repository 生成 Bazel 可以用在 API 的依赖项中, 目标为 android_binaryandroid_library

所生成目标的名称根据 Android 支持代码库,格式为 @androidsdk//${group}:${artifact}-${version}。 以下示例展示了 android_library 如何依赖于 v7 appcompat 库。

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 级别 已安装的版本。

用于给定 build 的 API 级别可被 android_sdk 替换 标志。android_sdk_repository会创建一个android_sdk目标 SDK 中安装的各个名为 @androidsdk//:sdk-${level} 的 API 级别, 。例如,要针对非默认 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

String;不可配置;默认值为 ""

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

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

path

String;不可配置;默认值为 ""

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

您可以从以下位置下载 Android SDK: Android 开发者网站

repo_mapping

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

从本地代码库名称到全局代码库名称的字典。这样,您就可以控制 此代码库依赖项的工作区依赖项解析。

例如,条目 "@foo": "@bar" 声明,在任何时候, 依赖于 "@foo"(例如 "@foo//some:target"),它应该在 全局声明的 "@bar" ("@bar//some:target")。