Declarar e usar uma flag de build

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:

  1. Navegue até WORKING_DIRECTORY/build/release/flag_declarations/.
  2. Crie um arquivo chamado RELEASE_MY_FLAG_NAME.textproto.
  3. 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 por RELEASE_. 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 ser bool_value ou string_value. Se o tipo for string_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 como true ou como a string vazia caso o valor seja falso.
    • workflow é LAUNCH ou PREBUILT. Use LAUNCH para flags booleanas que vão de false a true, de forma semelhante às flags de lançamento de recursos. Use PREBUILT 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.