您可以在 Java、C、C++ 和 Rust 代码中使用 aconfig 标志。AOSP build 系统会启动一个名为 aconfig 的工具,用于生成可用于访问每个标志值的特定于语言的方法库。您必须先声明标记并将其添加到 build 中,然后才能生成该库。
为 Java 声明 aconfig 标志
如需为 Java 声明 aconfig 标志,请执行以下操作:
在新代码所在的目录中,创建一个扩展名为
.aconfig
的文件,例如my_new_aconfig_flag_declarations.aconfig
。aconfig 文件是遵循标准架构的文本 proto 文件。添加类似以下的标志声明:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }
其中:
package
与标志名称结合使用时,可提供唯一键。在 Java 中,将package
设置为foo.bar
会生成名为foo.bar.Flags
的自动生成的类。在 C++ 中,标志访问器方法名为foo::bar::"flagname"
。同一声明文件中的标志属于同一软件包,但多个声明文件可以为同一软件包贡献标志。container
定义了一系列代码,这些代码会作为二进制文件一起构建和交付。有效容器包括system
、vendor
、system_ext
、product
、name.of.apex
和name.of.apk
。name
包含仅包含小写字母、下划线和数字的标志名称。namespace
包含用于贡献的命名空间。您必须与指定的 Google 审核人员合作来确定您的命名空间。如果您使用功能启动标志来维护您自己的 AOSP 镜像的稳定性,则可以随意使用命名空间。description
包含对被标记功能或变更的简要说明。bug
是与新代码贡献相关联的 bug 编号。您必须与指定的 Google 审核员合作,确定您的bug
。如果您使用功能启动标志来维护您自己的 AOSP 镜像的稳定性,则可以使用 bug 跟踪编号或<none>
。
保存文件并退出编辑器。
设置 build
声明标志后,请设置 build,以便其生成用于访问标志值的库代码。
在
Android.bp
build 文件中,添加类似于以下内容的aconfig_declarations
部分:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
其中:
name
包含声明的名称,该名称仅包含小写字母、下划线和数字。package
包含声明中使用的同一软件包名称。srcs
包含声明该标志的.aconfig
文件的名称。
保存文件并退出编辑器。
为 C 和 C++ 声明 aconfig 标志
如需为 C 和 C++ 声明 aconfig 标志,请执行以下操作:
在新代码所在的目录中,创建一个扩展名为
.aconfig
的文件,例如my_new_aconfig_flag_declarations.aconfig
。aconfig 文件是遵循标准架构的文本 proto 文件。添加类似以下的标志声明:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }
其中:
package
与标志名称结合使用时,可提供唯一键。在 Java 中,将package
设置为foo.bar
会生成名为foo.bar.Flags
的自动生成的类。在 C++ 中,标志访问器方法名为foo::bar::"flagname"
。同一声明文件中的标志属于同一软件包,但多个声明文件可以为同一软件包贡献标志。container
定义了一系列代码,这些代码会作为二进制文件一起构建和交付。有效容器包括system
、vendor
、system_ext
、product
、name.of.apex
和name.of.apk
。name
包含仅包含小写字母、下划线和数字的标志名称。namespace
包含用于贡献的命名空间。您必须与指定的 Google 审核人员合作来确定您的命名空间。如果您使用功能启动标志来维护您自己的 AOSP 镜像的稳定性,则可以随意使用命名空间。description
包含对被标记功能或变更的简要说明。bug
是与新代码贡献相关联的 bug 编号。您必须与指定的 Google 审核员合作,确定您的bug
。如果您使用功能启动标志来维护您自己的 AOSP 镜像的稳定性,则可以使用 bug 跟踪编号或<none>
。
保存文件并退出编辑器。
设置 build
声明标志后,设置 build,以便它可以生成用于访问标志值的库代码。
在
Android.bp
build 文件中,添加类似于以下内容的aconfig_declarations
部分:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
其中:
name
包含声明的名称,该名称仅包含小写字母、下划线和数字。package
包含声明中使用的同一软件包名称。srcs
包含声明该标志的 aconfig 文件的名称。
在同一文件中,创建一个类似于以下内容的
cc_aconfig_library
目标:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
其中:
name
包含仅包含小写字母、下划线和数字的库名称。aconfig_declarations
包含声明中使用的同一name
。
cc_aconfig_library
构建目标会调用 C 或 C++ Codegen,后者会在构建时使用生成的代码创建一个库。CC aconfig 库与 CC 库目标类似,但包含
vendor_available
、product_available
、host_supported
和vndk
等选项。如果依赖于此cc_aconfig_library
的 build 目标需要特定类型的变体,您可能还需要在 CC aconfig 库目标中添加相应的设置。例如,如果父级 build 目标将vendor_available
设置为true
,您可能还需要在此cc_aconfig_library
目标中将vendor_available
设置为true
。添加此构建目标后,您的代码可以访问此库。您可以使用
static_lib
或shared_lib
语法添加此库。请注意,如果您想将此库添加为static_lib
,请在server_configurable_flags
上添加shared_lib
依赖项。第 3 步展示了如何将生成的代码标志库添加到libexample_cpp_lib
。创建一个使用 aconfig 标志的目标,如以下示例所示:
cc_library
:cc_library { name: "libexample_cpp_lib", srcs: ["src/example_cpp_lib.cc"], double_loadable: true, cflags: [ "-Wall", "-Werror", "-Wno-unused-function", "-Wno-unused-parameter", ], header_libs: [ "jni_headers", ], shared_libs: [ "server_configurable_flags", ], static_libs: [ "aconfig_demo_flags_c_lib", ], export_include_dirs: ["src/include"], }
其中:
shared_libs
包含 aconfig 标志所需的额外依赖项。static_libs
是 build 根据第 2 步中的cc_aconfig_library
name
字段创建的库的名称。通过使用静态库名称创建cc_library
条目,您现在可以在代码中使用 aconfig 标志。
为 Rust 声明 aconfig 标志
如需为 Rust 声明 aconfig 标志,请执行以下操作:
在新代码的目录中,创建一个扩展名为
.aconfig
的文件,例如my_new_aconfig_flag_declarations.aconfig
。aconfig 文件是遵循标准架构的文本 proto 文件。添加类似以下的标志声明:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }
其中:
package
与标志名称结合使用时,可提供唯一键。在 Java 中,将package
设置为foo.bar
会生成名为foo.bar.Flags
的自动生成的类。在 C++ 中,标志访问器方法名为foo::bar::"flagname"
。同一声明文件中的标志属于同一软件包,但多个声明文件可以为同一软件包贡献标志。container
定义了一系列代码,这些代码会作为二进制文件一起构建和交付。有效容器包括system
、vendor
、system_ext
、product
、name.of.apex
和name.of.apk
。name
包含仅包含小写字母、下划线和数字的标志名称。namespace
包含用于贡献的命名空间。您必须与指定的 Google 审核人员合作来确定您的命名空间。如果您使用功能启动标志来维护您自己的 AOSP 镜像的稳定性,则可以随意使用命名空间。description
包含对被标记功能或变更的简要说明。bug
是与新代码贡献相关联的 bug 编号。您必须与指定的 Google 审核员合作,确定您的bug
。如果您使用功能启动标志来维护您自己的 AOSP 镜像的稳定性,则可以使用 bug 跟踪编号或<none>
。
保存文件并退出编辑器。
设置 build
声明标志后,请设置 build,以便其生成用于访问标志值的库代码。
在
Android.bp
build 文件中,添加类似于以下内容的aconfig_declarations
部分:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
其中:
name
包含声明的名称,该名称仅包含小写字母、下划线和数字。package
包含声明中使用的同一软件包名称。srcs
包含声明该标志的 aconfig 文件的名称。
创建一个类似于下例的
rust_aconfig_library
目标。此目标会在构建时调用 Rust Codegen 并使用生成的代码创建 Rust 库。rust_aconfig_library { name: "libaconfig_demo_flags_rust", crate_name: "aconfig_demo_flags_rust", aconfig_declarations: "aconfig_demo_flags", }
其中:
name
包含仅包含小写字母、下划线和数字的声明名称。crate_name
包含声明中使用的同一软件包名称。aconfig_declarations
包含声明中使用的name
。
进行此更改后,您的代码可以依赖于此 Rust 库。
在同一文件中,创建一个类似于以下内容的
rust_library
条目:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }
此示例允许您的源代码 build 目标
libexample_demo_flags_rust
包含代码生成的标志库。保存文件并退出编辑器。