Cómo declarar y usar una marca de compilación

Las marcas de compilación son constantes de tiempo de compilación y no se pueden cambiar durante el tiempo de ejecución. Estas marcas se usan en circunstancias en las que las marcas de aconfig no se pueden utilizar, por ejemplo, en los siguientes casos:

  • Tienes código precompilado que quieres incluir de forma opcional en una compilación.
  • Quieres realizar cambios en el sistema de compilación en sí.
  • Quieres colocar marcas alrededor de dependencias para administrar el tamaño del código.
  • Quieres administrar el lanzamiento de una función, pero necesitas verificar el valor de la marca antes de que el sistema ponga a disposición las marcas de aconfig.

Cómo declarar una marca de compilación

Las marcas de compilación son archivos textproto declarados. Para declarar una marca de compilación, haz lo siguiente:

  1. Navega a WORKING_DIRECTORY/build/release/flag_declarations/.
  2. Crea un archivo llamado RELEASE_MY_FLAG_NAME.textproto.
  3. Edita el archivo y agrega una entrada similar a la siguiente:

    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"
    

    En la que:

    • name contiene el nombre de la marca precedido por RELEASE_. Solo se permiten letras en mayúscula y guiones bajos.
    • namespace contiene el espacio de nombres para las contribuciones. Para determinar tu espacio de nombres, debes trabajar con tu revisor de Google designado. Si utilizas marcas de lanzamiento de funciones para mantener la estabilidad de tu propia duplicación de AOSP, puedes usar el espacio de nombres como lo desees.
    • value es el valor y tipo inicial de la marca. El tipo puede ser bool_value o string_value. Si el tipo es string_value, la marca debe estar entre comillas. Si no se especifica, el valor es una cadena vacía. Los valores booleanos se representan como true, o bien con la cadena vacía correspondiente a "false".
    • workflow es LAUNCH o PREBUILT. Usa LAUNCH para las marcas booleanas que avanzan de false a true, similares a las marcas de lanzamiento de funciones. Usa PREBUILT para las marcas que configuran una versión, en general de una compilación previa.
    • containers es el tipo de código que estás escribiendo, como "proveedor" para el código del proveedor o "producto" para el del producto. Si no sabes qué valor usar, utiliza los cuatro tipos de contenedores, como se mostró en el ejemplo anterior.

Cómo usar una marca de compilación en un archivo de Soong

En el archivo y módulo de compilación en los que quieres consultar el valor de la marca, usa un condicional para hacerlo. Por ejemplo, en el siguiente fragmento, se consulta el valor de la marca RELEASE__READ_FROM_NEW_STORAGE:

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: [],
  }),
}

Si el valor de esta marca es true, el módulo libaconfig_storage_read_api_cc se vincula de manera dinámica al módulo cc_defaults.

Si el valor de esta marca es false, no ocurre nada (default: [],).

Cómo usar una marca de compilación en un archivo de Make

En el archivo de Make, una marca de compilación es una variable de Make de solo lectura. El siguiente archivo de Make de ejemplo accede a una marca de compilación llamada 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

La declaración de esta marca tiene un campo workflow configurado en PREBUILT en RELEASE_PACKAGE_NFC_STACK.textproto y un valor de cadena de com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto, el archivo de valores de la marca para la configuración de desarrollo de trunk_staging.