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