Puedes usar marcas de aconfig en código Java, C, C++ y Rust. El sistema de compilación de AOSP inicia una herramienta llamada aconfig que se usa para generar una biblioteca de métodos específica del lenguaje que puedes usar para acceder al valor de cada marca. Antes de generar la biblioteca, debes declarar marcas y agregarlas a la compilación.
Declara una marca de aconfig para Java
Para declarar una marca aconfig para Java, haz lo siguiente:
En un directorio donde exista el código nuevo, crea un archivo con la extensión
.aconfig
, por ejemplo,my_new_aconfig_flag_declarations.aconfig
. Un archivo aconfig es un archivo proto de texto que sigue un esquema estándar.Agrega una declaración de marca similar a la siguiente:
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>" }
donde:
package
, cuando se combina con el nombre de la marca, proporciona una clave única. En Java, configurarpackage
comofoo.bar
da como resultado una clase autogenerada llamadafoo.bar.Flags
. En C++, los métodos de acceso de marcas se llamaríanfoo::bar::"flagname"
. Las marcas en el mismo archivo de declaración pertenecen al mismo paquete, pero varios archivos de declaración pueden contribuir con marcas al mismo paquete.container
define una colección de código que se compila y envía juntas como un objeto binario. Los contenedores válidos sonsystem
,vendor
,system_ext
,product
,name.of.apex
yname.of.apk
.name
contiene el nombre de la marca que solo contiene letras minúsculas, guiones bajos y números.namespace
contiene el espacio de nombres de las contribuciones. Debes trabajar con el revisor de Google asignado para determinar tu espacio de nombres. Si usas marcas de lanzamiento de funciones para mantener la estabilidad de tu propio espejo de AOSP, puedes usar el espacio de nombres como quieras.description
contiene una breve descripción del componente o el cambio que se marcó.bug
es el número de error asociado con la nueva contribución de código. Debes trabajar con el revisor de Google asignado para determinar tubug
. Si usas marcas de lanzamiento de funciones para mantener la estabilidad de tu propio espejo de AOSP, puedes usar tu número de seguimiento de errores o<none>
.
Guarda el archivo y sal del editor.
Cómo configurar la compilación
Después de declarar tu marca, configura la compilación para que pueda generar el código de la biblioteca que se usa para acceder al valor de la marca.
En el archivo de compilación
Android.bp
, agrega una secciónaconfig_declarations
similar a la siguiente:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
donde:
name
contiene el nombre de la declaración que solo contiene letras minúsculas, guiones bajos y números.package
contiene el mismo nombre de paquete que se usa en la declaración.srcs
contiene el nombre del archivo.aconfig
en el que se declara la marca.
Guarda el archivo y sal del editor.
Declara una marca aconfig para C y C++
Si deseas declarar una marca aconfig para C y C++, haz lo siguiente:
En un directorio donde exista el código nuevo, crea un archivo con la extensión
.aconfig
, por ejemplo,my_new_aconfig_flag_declarations.aconfig
. Un archivo aconfig es un archivo proto de texto que sigue un esquema estándar.Agrega una declaración de marca similar a la siguiente:
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>" }
donde:
package
, cuando se combina con el nombre de la marca, proporciona una clave única. En Java, configurarpackage
comofoo.bar
da como resultado una clase autogenerada llamadafoo.bar.Flags
. En C++, los métodos de acceso de marcas se llamaríanfoo::bar::"flagname"
. Las marcas en el mismo archivo de declaración pertenecen al mismo paquete, pero varios archivos de declaración pueden contribuir con marcas al mismo paquete.container
define una colección de código que se compila y envía juntas como un objeto binario. Los contenedores válidos sonsystem
,vendor
,system_ext
,product
,name.of.apex
yname.of.apk
.name
contiene el nombre de la marca que solo contiene letras minúsculas, guiones bajos y números.namespace
contiene el espacio de nombres de las contribuciones. Debes trabajar con el revisor de Google asignado para determinar tu espacio de nombres. Si usas marcas de lanzamiento de funciones para mantener la estabilidad de tu propio espejo de AOSP, puedes usar el espacio de nombres como quieras.description
contiene una breve descripción del componente o el cambio que se marcó.bug
es el número de error asociado con la nueva contribución de código. Debes trabajar con el revisor de Google asignado para determinar tubug
. Si usas marcas de lanzamiento de funciones para mantener la estabilidad de tu propio espejo de AOSP, puedes usar tu número de seguimiento de errores o<none>
.
Guarda el archivo y sal del editor.
Cómo configurar la compilación
Después de declarar tu marca, configura la compilación para que pueda generar el código de la biblioteca que se usa para acceder al valor de la marca.
En el archivo de compilación
Android.bp
, agrega una secciónaconfig_declarations
similar a la siguiente:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
donde:
name
contiene el nombre de la declaración que solo contiene letras minúsculas, guiones bajos y números.package
contiene el mismo nombre de paquete que se usa en la declaración.srcs
contiene el nombre del archivo aconfig en el que se declara la marca.
En el mismo archivo, crea un destino
cc_aconfig_library
similar al siguiente:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
donde:
name
contiene el nombre de la biblioteca que solo contiene letras minúsculas, guiones bajos y números.aconfig_declarations
contiene el mismoname
que se usa en la declaración.
El destino de compilación
cc_aconfig_library
invoca Codegen C o C++, que crea una biblioteca con el código generado durante el tiempo de compilación.La biblioteca aconfig de CC es similar a un destino de biblioteca de CC, pero tiene opciones como
vendor_available
,product_available
,host_supported
yvndk
. Si el objetivo de compilación que depende de estecc_aconfig_library
requiere un tipo de variantes determinado, es posible que también debas agregar el parámetro de configuración correspondiente en el objetivo de la biblioteca de aconfig de CC. Por ejemplo, si el destino de compilación superior tienevendor_available
configurado comotrue
, también te recomendamos que configuresvendor_available
comotrue
en este destinocc_aconfig_library
.Después de agregar este destino de compilación, tu código podrá acceder a esta biblioteca. Puedes incluir esta biblioteca con la sintaxis
static_lib
oshared_lib
. Ten en cuenta que, si quieres agregar esta biblioteca comostatic_lib
, debes agregar una dependenciashared_lib
enserver_configurable_flags
. En el paso 3, se muestra cómo incluir la biblioteca de marcas generada por código enlibexample_cpp_lib
.Crea un destino que use las marcas aconfig, como el siguiente ejemplo de
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"], }
donde:
shared_libs
incluye dependencias adicionales necesarias para las marcas de aconfig.static_libs
es el nombre de la biblioteca que crea la compilación según el campocc_aconfig_library
name
en el paso 2. Si creas una entradacc_library
con el nombre de la biblioteca estática, ahora puedes usar las marcas de aconfig en tu código.
Cómo declarar una marca de aconfig para Rust
Para declarar una marca de aconfig para Rust, haz lo siguiente:
En un directorio donde exista el código nuevo, crea un archivo con la extensión
.aconfig
, por ejemplo,my_new_aconfig_flag_declarations.aconfig
. Un archivo aconfig es un archivo proto de texto que sigue un esquema estándar.Agrega una declaración de marca similar a la siguiente:
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>" }
donde:
package
, cuando se combina con el nombre de la marca, proporciona una clave única. En Java, configurarpackage
comofoo.bar
da como resultado una clase autogenerada llamadafoo.bar.Flags
. En C++, los métodos de acceso de marcas se llamaríanfoo::bar::"flagname"
. Las marcas en el mismo archivo de declaración pertenecen al mismo paquete, pero varios archivos de declaración pueden contribuir con marcas al mismo paquete.container
define una colección de código que se compila y envía juntas como un objeto binario. Los contenedores válidos sonsystem
,vendor
,system_ext
,product
,name.of.apex
yname.of.apk
.name
contiene el nombre de la marca que solo contiene letras minúsculas, guiones bajos y números.namespace
contiene el espacio de nombres de las contribuciones. Debes trabajar con el revisor de Google asignado para determinar tu espacio de nombres. Si usas marcas de lanzamiento de funciones para mantener la estabilidad de tu propio espejo de AOSP, puedes usar el espacio de nombres como quieras.description
contiene una breve descripción del componente o el cambio que se marcó.bug
es el número de error asociado con la nueva contribución de código. Debes trabajar con el revisor de Google asignado para determinar tubug
. Si usas marcas de lanzamiento de funciones para mantener la estabilidad de tu propio espejo de AOSP, puedes usar tu número de seguimiento de errores o<none>
.
Guarda el archivo y sal del editor.
Cómo configurar la compilación
Después de declarar tu marca, configura la compilación para que pueda generar el código de la biblioteca que se usa para acceder al valor de la marca.
En tu archivo de compilación
Android.bp
, agrega una secciónaconfig_declarations
similar a la siguiente:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
donde:
name
contiene el nombre de la declaración que solo contiene letras minúsculas, guiones bajos y números.package
contiene el mismo nombre de paquete que se usa en la declaración.srcs
contiene el nombre del archivo aconfig en el que se declara la marca.
Crea un destino
rust_aconfig_library
similar al siguiente ejemplo. Este objetivo invoca Rust Codegen y crea una biblioteca de Rust con el código generado durante el tiempo de compilación.rust_aconfig_library { name: "libaconfig_demo_flags_rust", crate_name: "aconfig_demo_flags_rust", aconfig_declarations: "aconfig_demo_flags", }
donde:
name
contiene el nombre de la declaración que solo contiene letras minúsculas, guiones bajos y números.crate_name
contiene el mismo nombre de paquete que se usa en la declaración.aconfig_declarations
contiene el mismoname
que se usa en la declaración.
Con este cambio, tu código puede depender de esta biblioteca de Rust.
En el mismo archivo, crea una entrada
rust_library
similar a la siguiente:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }
Esta muestra permite que los destinos de compilación de código fuente
libexample_demo_flags_rust
incluyan la biblioteca de marcas generadas por código.Guarda el archivo y sal del editor.