声明和使用 build 标志

build 标志是 build 时常量,无法在运行时更改。这些标志在无法使用 aconfig 标志的情况下使用,例如

  • 您有一个预编译或预构建的代码段,希望在 build 中可选地包含该代码段。
  • 您想要更改构建系统本身。
  • 您希望在依赖项周围添加标志以管理代码大小。
  • 您想要管理某项功能的发布,但需要先检查标志的值,然后系统才会提供 aconfig 标志。

声明 build 标志

构建标志在 textproto 文件中声明。如需声明 build 标志,请执行以下操作:

  1. 导航到WORKING_DIRECTORY/build/release/flag_declarations/
  2. 创建一个名为 RELEASE_MY_FLAG_NAME.textproto 的文件。
  3. 修改该文件并添加类似以下内容的条目:

    name: "RELEASE_MY_FLAG_NAME"
    namespace: "android_UNKNOWN"
    description: "Control if we should read from new storage."
    workflow: LAUNCH
    containers: "product"
    containers: "system"
    containers: "system_ext"
    containers: "vendor"
    

    其中:

    • name 包含标志的名称,前面带有 RELEASE_。仅允许使用大写字母和下划线。
    • namespace 包含用于贡献的命名空间。您必须与指定的 Google 审核人员合作来确定您的命名空间。如果您使用功能启动标志来维护您自己的 AOSP 镜像的稳定性,则可以随意使用命名空间。
    • value 是标志的初始类型和值。类型可以是 bool_valuestring_value。如果类型为 string_value,则值必须用引号括起来。如果未指定,则该值将为空字符串。布尔值以 true 表示,如果为 false,则表示为空字符串。
    • workflowLAUNCHPREBUILT。对于从 false 推进到 true 的布尔值标志,请使用 LAUNCH,类似于功能启动标志。对于用于设置版本的标志(通常是预构建的版本),请使用 PREBUILT
    • containers 您要编写的代码类型,例如供应商代码的“供应商”或产品代码的“产品”。如果您不确定要使用哪个值,请使用前面的示例中显示的所有四种容器类型。

在 Soong 文件中使用 build 标志

在要查询标志值的 build 文件和模块中,使用条件在标志值上分支。例如,在以下代码段中,系统会查询 RELEASE__READ_FROM_NEW_STORAGE 标志的值:

cc_defaults {
  name: "aconfig_lib_cc_shared_link.defaults",
  shared_libs: select(release_flag("RELEASE_READ_FROM_NEW_STORAGE"), {
    true: ["libaconfig_storage_read_api_cc],
    default: [],
  }),
}

如果该标记的值为 true,则 libaconfig_storage_read_api_cc 模块会动态链接到 cc_defaults 模块。

如果此标志的值为 false,则不会发生任何 (default: [],)。

在 makefile 中使用 build 标志

在 make 文件中,build 标志是只读的 make 变量。以下 makefile 示例会访问名为 RELEASED_PACKAGE_NFC_STCK 的 build 标志:

# NFC and Secure Element packages
PRODUCT_PACKAGES += \
    $(RELEASE_PACKAGE_NFC_STACK) \
    Tag \
    SecureElement \
    android.hardware.nfc-service.st \
    android.hardware.secure_element@1.0-service.st \
    NfcOverlayCoral

此标志的声明在 RELEASE_PACKAGE_NFC_STACK.textproto 中将 workflow 字段设置为 PREBUILT,并在 trunk_staging 开发配置的标志值文件 RELEASE_PACKAGE_NFC_STACK.textproto 中将字符串值设置为 com.android.nfcservices

ifeq (,$(RELEASE_MY_FLAG))