Você pode usar flags aconfig em códigos Java, C, C++ e Rust. O sistema de build do AOSP inicia uma ferramenta chamada aconfig, usada para gerar uma biblioteca de métodos específica da linguagem que você pode usar para acessar o valor de cada flag. Antes de gerar a biblioteca, declare as flags e as adicione ao build.
Declarar uma flag aconfig em Java
Para declarar uma flag aconfig em Java, siga estas instruções:
Em um diretório onde o novo código já exista, crie um arquivo com a extensão
.aconfig
, por exemplo,my_new_aconfig_flag_declarations.aconfig
. Um arquivo aconfig é um arquivo textproto que segue um esquema padrão.Adicione uma declaração de flag semelhante a esta:
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>" }
Em que:
package
, quando combinado ao nome da flag, fornece uma chave exclusiva. Em Java, definirpackage
comofoo.bar
resulta em uma classe autogerada chamadafoo.bar.Flags
. Em C++, os métodos do acessador seriam chamadosfoo::bar::"flagname"
. As flags no mesmo arquivo de declaração pertencem ao mesmo pacote, mas vários arquivos de declaração podem contribuir com flags para o mesmo pacote.container
define um conjunto de códigos compilados e enviados ao mesmo tempo como um binário.system
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
são contêineres válidos.name
contém o nome da flag apenas com letras minúsculas, sublinhados e números.namespace
contém o namespace para contribuições. Você precisa trabalhar com o avaliador do Google atribuído para determinar seu namespace. Se você estiver usando flags de lançamento de recursos para manter a estabilidade do seu próprio espelho do AOSP, use o namespace como achar melhor.description
contém uma descrição breve do recurso ou da mudança que vai receber uma flag.bug
é o número do bug associado à nova contribuição de código. Você precisa trabalhar com o avaliador do Google atribuído para determinar seubug
. Se você estiver usando flags de lançamento de recursos para manter a estabilidade do seu próprio espelho do AOSP, use seu número de rastreamento de bugs ou<none>
.
Salve o arquivo e saia do editor.
Configurar o build
Depois de declarar sua flag, configure o build para gerar o código de biblioteca usado para acessar o valor da flag.
No seu arquivo de build
Android.bp
, adicione uma seçãoaconfig_declarations
semelhante a esta:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Em que:
name
contém o nome da declaração apenas com letras minúsculas, sublinhados e números.package
contém o mesmo nome de pacote usado na declaração.srcs
contém o nome do arquivo.aconfig
em que a flag foi declarada.
Salve o arquivo e saia do editor.
Declarar uma flag aconfig em C e C++
Para declarar uma flag aconfig em C e C++, siga estas instruções:
Em um diretório onde o novo código já exista, crie um arquivo com a extensão
.aconfig
, por exemplo,my_new_aconfig_flag_declarations.aconfig
. Um arquivo aconfig é um arquivo textproto que segue um esquema padrão.Adicione uma declaração de flag semelhante a esta:
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>" }
Em que:
package
, quando combinado ao nome da flag, fornece uma chave exclusiva. Em Java, definirpackage
comofoo.bar
resulta em uma classe autogerada chamadafoo.bar.Flags
. Em C++, os métodos do acessador seriam chamadosfoo::bar::"flagname"
. As flags no mesmo arquivo de declaração pertencem ao mesmo pacote, mas vários arquivos de declaração podem contribuir com flags para o mesmo pacote.container
define um conjunto de códigos compilados e enviados ao mesmo tempo como um binário.system
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
são contêineres válidos.name
contém o nome da flag apenas com letras minúsculas, sublinhados e números.namespace
contém o namespace para contribuições. Você precisa trabalhar com o avaliador do Google atribuído para determinar seu namespace. Se você estiver usando flags de lançamento de recursos para manter a estabilidade do seu próprio espelho do AOSP, use o namespace como achar melhor.description
contém uma descrição breve do recurso ou da mudança que vai receber uma flag.bug
é o número do bug associado à nova contribuição de código. Você precisa trabalhar com o avaliador do Google atribuído para determinar seubug
. Se você estiver usando flags de lançamento de recursos para manter a estabilidade do seu próprio espelho do AOSP, use seu número de rastreamento de bugs ou<none>
.
Salve o arquivo e saia do editor.
Configurar o build
Depois de declarar sua flag, configure o build para gerar o código de biblioteca usado para acessar o valor da flag.
No seu arquivo de build
Android.bp
, adicione uma seçãoaconfig_declarations
semelhante a esta:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Em que:
name
contém o nome da declaração apenas com letras minúsculas, sublinhados e números.package
contém o mesmo nome de pacote usado na declaração.srcs
contém o nome do arquivo aconfig em que a flag foi declarada.
No mesmo arquivo, crie uma
cc_aconfig_library
de destino semelhante a esta:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
Em que:
name
contém o nome da biblioteca apenas com letras minúsculas, sublinhados e números.aconfig_declarations
contém o mesmoname
usado na declaração.
A
cc_aconfig_library
de destino do build invoca codegen C ou C++, o que cria uma biblioteca com o código gerado no tempo de build.A biblioteca CC aconfig é semelhante a uma biblioteca CC de destino, mas tem opções como
vendor_available
,product_available
,host_supported
evndk
. Se o destino do build que depende dessacc_aconfig_library
exigir determinados tipos de variantes, poderá ser necessário adicionar a configuração correspondente na biblioteca CC aconfig de destino. Por exemplo, sevendor_available
estiver definido comotrue
no destino de build pai, talvez seja interessante definirvendor_available
comotrue
nacc_aconfig_library
de destino.Depois de receber o destino de build, seu código poderá acessar a biblioteca. Inclua essa biblioteca usando sintaxe
static_lib
oushared_lib
. Caso você queira adicionar a biblioteca como umastatic_lib
, adicione uma dependênciashared_lib
nasserver_configurable_flags
. A etapa 3 mostra como incluir a biblioteca de flags gerada por código emlibexample_cpp_lib
.Crie um objeto de destino que use as flags aconfig, como neste exemplo 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"], }
Em que:
shared_libs
inclui dependências extras necessárias para flags aconfig.static_libs
é o nome da biblioteca criada pelo build usando o campocc_aconfig_library
name
na etapa 2. Ao criar uma entradacc_library
com o nome da biblioteca estática, você pode usar as flags aconfig no seu código.
Declarar uma flag aconfig em Rust
Para declarar uma flag aconfig em Rust, siga estas instruções:
Em um diretório onde o novo código já exista, crie um arquivo com a extensão
.aconfig
, por exemplo,my_new_aconfig_flag_declarations.aconfig
. Um arquivo aconfig é um arquivo textproto que segue um esquema padrão.Adicione uma declaração de flag semelhante a esta:
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>" }
Em que:
package
, quando combinado ao nome da flag, fornece uma chave exclusiva. Em Java, definirpackage
comofoo.bar
resulta em uma classe autogerada chamadafoo.bar.Flags
. Em C++, os métodos do acessador seriam chamadosfoo::bar::"flagname"
. As flags no mesmo arquivo de declaração pertencem ao mesmo pacote, mas vários arquivos de declaração podem contribuir com flags para o mesmo pacote.container
define um conjunto de códigos compilados e enviados ao mesmo tempo como um binário.system
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
são contêineres válidos.name
contém o nome da flag apenas com letras minúsculas, sublinhados e números.namespace
contém o namespace para contribuições. Você precisa trabalhar com o avaliador do Google atribuído para determinar seu namespace. Se você estiver usando flags de lançamento de recursos para manter a estabilidade do seu próprio espelho do AOSP, use o namespace como achar melhor.description
contém uma descrição breve do recurso ou da mudança que vai receber uma flag.bug
é o número do bug associado à nova contribuição de código. Você precisa trabalhar com o avaliador do Google atribuído para determinar seubug
. Se você estiver usando flags de lançamento de recursos para manter a estabilidade do seu próprio espelho do AOSP, use seu número de rastreamento de bugs ou<none>
.
Salve o arquivo e saia do editor.
Configurar o build
Depois de declarar sua flag, configure o build para gerar o código de biblioteca usado para acessar o valor da flag.
No seu arquivo de build
Android.bp
, adicione uma seçãoaconfig_declarations
semelhante a esta:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Em que:
name
contém o nome da declaração apenas com letras minúsculas, sublinhados e números.package
contém o mesmo nome de pacote usado na declaração.srcs
contém o nome do arquivo aconfig em que a flag foi declarada.
Crie uma
rust_aconfig_library
de destino semelhante ao exemplo abaixo. Esse destino invoca codegen Rust e cria uma biblioteca Rust com o código gerado durante o tempo de build.rust_aconfig_library { name: "libaconfig_demo_flags_rust", crate_name: "aconfig_demo_flags_rust", aconfig_declarations: "aconfig_demo_flags", }
Em que:
name
contém o nome da declaração apenas com letras minúsculas, sublinhados e números.crate_name
contém o mesmo nome de pacote usado na declaração.aconfig_declarations
contém o mesmoname
usado na declaração.
Com essa mudança, seu código pode depender dessa biblioteca Rust.
No mesmo arquivo, crie uma entrada
rust_library
semelhante a esta:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }
O exemplo permite que seu build de código-fonte tenha como destino
libexample_demo_flags_rust
para incluir a biblioteca de flags gerada por código.Salve o arquivo e saia do editor.