Флаги aconfig можно использовать в коде Java, C, C++ и Rust. Система сборки AOSP запускает инструмент aconfig, используемый для генерации библиотеки методов, специфичных для каждого языка, которые можно использовать для доступа к значению каждого флага. Прежде чем генерировать библиотеку, необходимо объявить флаги и добавить их в сборку.
Объявить флаг aconfig для Java
Чтобы объявить флаг aconfig для Java:
В директории, где находится новый код, создайте файл с расширением
.aconfig, например,my_new_aconfig_flag_declarations.aconfig. Файл aconfig — это текстовый протокольный файл, соответствующий стандартной схеме.Добавьте объявление флага, аналогичное следующему:
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, вы можете использовать namespace по своему усмотрению.descriptionсодержит краткое описание отмеченной функции или изменения.bug— это номер ошибки, связанный с новым внесенным кодом. Для определенияbugвам необходимо сотрудничать с назначенным рецензентом Google. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала 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 — это текстовый протокольный файл, соответствующий стандартной схеме.Добавьте объявление флага, аналогичное следующему:
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, вы можете использовать namespace по своему усмотрению.descriptionсодержит краткое описание отмеченной функции или изменения.bug— это номер ошибки, связанный с новым внесенным кодом. Для определенияbugвам необходимо сотрудничать с назначенным рецензентом Google. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала 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++, который создает библиотеку с сгенерированным кодом во время сборки.Библиотека 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 — это текстовый протокольный файл, соответствующий стандартной схеме.Добавьте объявление флага, аналогичное следующему:
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, вы можете использовать namespace по своему усмотрению.descriptionсодержит краткое описание отмеченной функции или изменения.bug— это номер ошибки, связанный с новым внесенным кодом. Для определенияbugвам необходимо сотрудничать с назначенным рецензентом Google. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала 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включать сгенерированную библиотеку флагов.Сохраните файл и закройте редактор.