Você pode usar flags aconfig nos códigos Java, C, C++ e Rust. O sistema de build do AOSP inicializa uma ferramenta chamada aconfig, usada para gerar uma biblioteca de métodos específica do idioma que pode ser usada para acessar o valor de cada flag. Antes de gerar a biblioteca, é necessário declarar flags e adicioná-las ao build.
Declarar uma flag aconfig para Java
Para declarar uma flag aconfig para Java:
Em um diretório em que o novo código existe, crie um arquivo com a extensão
.aconfig
, por exemplo,my_new_aconfig_flag_declarations.aconfig
. Um arquivo aconfig é um arquivo proto de texto 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 com o nome da flag, fornece uma chave exclusiva. Em Java, definirpackage
comofoo.bar
resulta em uma classe gerada automaticamente chamadafoo.bar.Flags
. Em C++, os métodos do acessador de sinalização seriam chamados defoo::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 uma coleção de código que é criada e enviada em conjunto como um binário. Os contêineres válidos sãosystem
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
.name
contém o nome da flag contendo apenas letras minúsculas, sublinhados e números.namespace
contém o namespace para contribuições. Você precisa trabalhar com o revisor 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, poderá usar o namespace como quiser.description
contém uma breve descrição do recurso ou da mudança sinalizada.bug
é o número do bug associado à nova contribuição de código. Trabalhe com o revisor 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 o número de rastreamento de bugs ou<none>
.
Salve o arquivo e saia do editor.
Configurar o build
Depois de declarar a flag, configure o build para que ele possa gerar o código da biblioteca usado para acessar o valor da flag.
No arquivo de build
Android.bp
, adicione uma seçãoaconfig_declarations
semelhante à seguinte: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 que contém apenas 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 é declarada.
Salve o arquivo e saia do editor.
Declarar uma flag aconfig para C e C++
Para declarar uma flag aconfig para C e C++:
Em um diretório em que o novo código existe, crie um arquivo com a extensão
.aconfig
, por exemplo,my_new_aconfig_flag_declarations.aconfig
. Um arquivo aconfig é um arquivo proto de texto 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 com o nome da flag, fornece uma chave exclusiva. Em Java, definirpackage
comofoo.bar
resulta em uma classe gerada automaticamente chamadafoo.bar.Flags
. Em C++, os métodos do acessador de sinalização seriam chamados defoo::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 uma coleção de código que é criada e enviada em conjunto como um binário. Os contêineres válidos sãosystem
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
.name
contém o nome da flag contendo apenas letras minúsculas, sublinhados e números.namespace
contém o namespace para contribuições. Você precisa trabalhar com o revisor 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, poderá usar o namespace como quiser.description
contém uma breve descrição do recurso ou da mudança sinalizada.bug
é o número do bug associado à nova contribuição de código. Trabalhe com o revisor 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 o número de rastreamento de bugs ou<none>
.
Salve o arquivo e saia do editor.
Configurar o build
Depois de declarar a flag, configure o build para que ela possa gerar o código da biblioteca usado para acessar o valor da flag.
No arquivo de build
Android.bp
, adicione uma seçãoaconfig_declarations
semelhante à seguinte: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 que contém apenas 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 é declarada.
No mesmo arquivo, crie um destino
cc_aconfig_library
semelhante ao seguinte:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
Em que:
name
contém o nome da biblioteca que contém apenas letras minúsculas, sublinhados e números.aconfig_declarations
contém o mesmoname
usado na declaração.
O destino de build
cc_aconfig_library
invoca o Codegen C ou C++, que cria uma biblioteca com o código gerado no tempo de build.A biblioteca CC aconfig é semelhante a um destino de biblioteca CC, mas tem opções como
vendor_available
,product_available
,host_supported
evndk
. Se o destino do build que depende dessecc_aconfig_library
exigir determinado tipo de variante, talvez seja necessário adicionar a configuração correspondente no destino da biblioteca aconfig CC. Por exemplo, se o destino de build pai tivervendor_available
definido comotrue
, definavendor_available
comotrue
nesse destinocc_aconfig_library
.Depois de adicionar esse destino de build, o código poderá acessar essa biblioteca. Você pode incluir essa biblioteca usando a sintaxe
static_lib
oushared_lib
. Se você quiser adicionar essa biblioteca como umastatic_lib
, adicione uma dependênciashared_lib
emserver_configurable_flags
. A etapa 3 mostra como incluir a biblioteca de sinalizações geradas por código emlibexample_cpp_lib
.Crie um destino que use as flags aconfig, como o exemplo
cc_library
a seguir: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 de acordo com o camponame
cc_aconfig_library
na etapa 2. Ao criar uma entradacc_library
com o nome da biblioteca estática, agora é possível usar as sinalizações aconfig no código.
Declarar uma flag de aconfig para Rust
Para declarar uma flag aconfig para Rust:
Em um diretório em que o novo código existe, crie um arquivo com a extensão
.aconfig
, por exemplo,my_new_aconfig_flag_declarations.aconfig
. Um arquivo aconfig é um arquivo proto de texto 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 com o nome da flag, fornece uma chave exclusiva. Em Java, definirpackage
comofoo.bar
resulta em uma classe gerada automaticamente chamadafoo.bar.Flags
. Em C++, os métodos do acessador de sinalização seriam chamados defoo::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 uma coleção de código que é criada e enviada em conjunto como um binário. Os contêineres válidos sãosystem
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
.name
contém o nome da flag contendo apenas letras minúsculas, sublinhados e números.namespace
contém o namespace para contribuições. Você precisa trabalhar com o revisor 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, poderá usar o namespace como quiser.description
contém uma breve descrição do recurso ou da mudança sinalizada.bug
é o número do bug associado à nova contribuição de código. Trabalhe com o revisor 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 o número de rastreamento de bugs ou<none>
.
Salve o arquivo e saia do editor.
Configurar o build
Depois de declarar a flag, configure o build para que ele possa gerar o código da biblioteca usado para acessar o valor da flag.
No 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 que contém apenas 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 é declarada.
Crie um destino
rust_aconfig_library
semelhante ao próximo exemplo. Esse destino invoca o Rust Codegen e cria uma biblioteca Rust com o código gerado durante o 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, que contém apenas 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, o código pode depender dessa biblioteca do Rust.
No mesmo arquivo, crie uma entrada
rust_library
semelhante à seguinte:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }
Esse exemplo permite que os destinos de build do código-fonte
libexample_demo_flags_rust
incluam a biblioteca de sinalizações geradas pelo código.Salve o arquivo e saia do editor.