Вы можете использовать флаги aconfig в коде Java, C, C++ и Rust. Система сборки AOSP запускает инструмент aconfig, используемый для генерации библиотеки методов, специфичных для конкретного языка, которые можно использовать для доступа к значению каждого флага. Перед тем, как вы сможете сгенерировать библиотеку, вы должны объявить флаги и добавить их в сборку.
Объявите флаг aconfig для Java
Чтобы объявить флаг aconfig для Java:
В каталоге, где находится новый код, создайте файл с расширением
.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
— это номер ошибки, связанный с новым вкладом кода. Вы должны работать с назначенным рецензентом Google, чтобы определить вашуbug
. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала AOSP, вы можете использовать свой номер отслеживания ошибок или использовать<none>
.
-
Сохраните файл и выйдите из редактора.
Настройте сборку
После объявления флага настройте сборку так, чтобы она могла генерировать код библиотеки, используемый для доступа к значению флага.
В файле сборки
Android.bp
добавьте раздел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
, в котором объявлен флаг.
-
Сохраните файл и выйдите из редактора.
Объявите флаг aconfig для C и C++
Чтобы объявить флаг aconfig для C и C++:
В каталоге, где находится новый код, создайте файл с расширением
.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
— это номер ошибки, связанный с новым вкладом кода. Вы должны работать с назначенным рецензентом Google, чтобы определить вашуbug
. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала AOSP, вы можете использовать свой номер отслеживания ошибок или использовать<none>
.
-
Сохраните файл и выйдите из редактора.
Настройте сборку
После объявления флага настройте сборку так, чтобы она могла генерировать код библиотеки, используемый для доступа к значению флага.
В файле сборки
Android.bp
добавьте раздел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
, требуются определенные типы вариантов, вам также может потребоваться добавить соответствующую настройку в целевой библиотеке CC aconfig. Например, если родительская цель сборки имеетvendor_available
, установленный наtrue
, вам также может потребоваться установитьvendor_available
наtrue
в этой целевойcc_aconfig_library
.После добавления этой цели сборки ваш код может получить доступ к этой библиотеке. Вы можете включить эту библиотеку, используя синтаксис
static_lib
илиshared_lib
. Обратите внимание, если вы хотите добавить эту библиотеку какstatic_lib
, добавьте зависимостьshared_lib
отserver_configurable_flags
. Шаг 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
— это имя библиотеки, которая создается сборкой в соответствии с полемname
cc_aconfig_library
на шаге 2. Создав записьcc_library
с именем статической библиотеки, вы теперь можете использовать флаги aconfig в своем коде.
-
Объявите флаг aconfig для Rust
Чтобы объявить флаг aconfig для Rust:
В каталоге, где находится новый код, создайте файл с расширением
.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
— это номер ошибки, связанный с новым вкладом кода. Вы должны работать с назначенным рецензентом Google, чтобы определить вашуbug
. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала AOSP, вы можете использовать свой номер отслеживания ошибок или использовать<none>
.
-
Сохраните файл и выйдите из редактора.
Настройте сборку
После объявления флага настройте сборку так, чтобы она могла генерировать код библиотеки, используемый для доступа к значению флага.
В файле сборки
Android.bp
добавьте раздел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", ] }
Этот пример позволяет вашим исходным кодам сборки целей
libexample_demo_flags_rust
включать сгенерированную кодом библиотеку флагов.Сохраните файл и выйдите из редактора.