Вы можете использовать флаги 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, вы можете использовать пространство имен по своему усмотрению.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, вы можете использовать пространство имен по своему усмотрению.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
содержит имя файла конфигурации, в котором объявлен флаг.
-
В том же файле создайте целевой объект
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, который создает библиотеку с сгенерированным кодом во время сборки.Библиотека aconfig CC аналогична целевой библиотеке CC, но имеет такие параметры,
vendor_available
,product_available
,host_supported
иvndk
. Если цель сборки, зависящая от этойcc_aconfig_library
требует определенного типа вариантов, вам также может потребоваться добавить соответствующий параметр в цель библиотеки aconfig CC. Например, если для родительского целевого объекта сборки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
включает дополнительные зависимости, необходимые для флагов конфигурации. -
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, вы можете использовать пространство имен по своему усмотрению.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
содержит имя файла конфигурации, в котором объявлен флаг.
-
Создайте цель
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
включать библиотеку флагов, сгенерированную кодом.Сохраните файл и выйдите из редактора.