As flags de build são constantes do tempo de build e não podem ser mudadas durante a execução. Elas são usadas em circunstâncias em que as flags aconfig não podem ser usadas, como estas:
- Você tem um código pré-compilado ou pré-criado que quer incluir opcionalmente em um build.
- Você quer fazer mudanças no sistema de build em si.
- Você quer adicionar flags em volta de dependências para controlar o tamanho do código.
- Você quer controlar o lançamento de um recurso, mas precisa conferir o valor da flag antes que as flags aconfig sejam disponibilizadas pelo sistema.
Declarar uma flag de build
As flags de build são declaradas em arquivos textproto. Para fazer isso, siga estas etapas:
- Navegue até
WORKING_DIRECTORY/build/release/flag_declarations/
. - Crie um arquivo chamado
RELEASE_MY_FLAG_NAME.textproto
. Edite o arquivo e adicione uma entrada semelhante a esta:
name: "RELEASE_MY_FLAG_NAME" namespace: "android_UNKNOWN" description: "Control if we should read from new storage." workflow: LAUNCH containers: "product" containers: "system" containers: "system_ext" containers: "vendor"
Em que:
name
contém o nome da flag precedido porRELEASE_
. São permitidas apenas letras maiúsculas e sublinhados.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.value
é o tipo inicial e o valor da flag. O tipo pode serbool_value
oustring_value
. Se o tipo forstring_value
, o valor precisará estar entre aspas. Se o tipo não for especificado, o valor será uma string vazia. Valores booleanos são representados comotrue
ou como a string vazia caso o valor seja falso.workflow
éLAUNCH
ouPREBUILT
. UseLAUNCH
para flags booleanas que vão defalse
atrue
, de forma semelhante às flags de lançamento de recursos. UsePREBUILT
para flags que definem uma versão, tipicamente de um código pré-criado.containers
é o tipo de código que você está programando, como "vendor" para o código de fornecedor ou "product" para o código de produto. Se você não sabe qual valor usar, use todos os quatro tipos de contêineres, conforme mostrado no exemplo anterior.
Usar uma flag de build em um arquivo Soong
No arquivo de build e no módulo em que você quer consultar o valor da flag, use um
valor condicional para ramificar o valor da flag. Por exemplo, no snippet abaixo,
o valor RELEASE__READ_FROM_NEW_STORAGE
da flag é consultado:
cc_defaults {
name: "aconfig_lib_cc_shared_link.defaults",
shared_libs: select(release_flag("RELEASE_READ_FROM_NEW_STORAGE"), {
true: ["libaconfig_storage_read_api_cc],
default: [],
}),
}
Se o valor dessa flag for true
, o módulo libaconfig_storage_read_api_cc
será
dinamicamente vinculado ao módulo cc_defaults
.
Se o valor dessa flag for false
, nada (default: [],
) acontecerá.
Usar uma flag de build em um makefile
No makefile, uma flag de build é uma variável make somente leitura. O exemplo
de makefile abaixo acessa uma flag de build chamada RELEASED_PACKAGE_NFC_STCK
:
# NFC and Secure Element packages
PRODUCT_PACKAGES += \
$(RELEASE_PACKAGE_NFC_STACK) \
Tag \
SecureElement \
android.hardware.nfc-service.st \
android.hardware.secure_element@1.0-service.st \
NfcOverlayCoral
A declaração dessa flag tem um campo workflow
definido como PREBUILT
em
RELEASE_PACKAGE_NFC_STACK.textproto
e um valor de string de
com.android.nfcservices
RELEASE_PACKAGE_NFC_STACK.textproto
no arquivo de valores de flags para a configuração de desenvolvimento trunk_staging
.