Вы можете использовать флаги 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— это имя библиотеки, которая создается сборкой в соответствии с полемnamecc_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включать сгенерированную кодом библиотеку флагов.Сохраните файл и выйдите из редактора.