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 no se pueden usar las marcas aconfig, como

  • Tienes un código precompilado o ya compilado que quieres incluir de forma opcional en una compilación.
  • Quieres hacer cambios en el sistema de compilación.
  • Quieres colocar marcas alrededor de las dependencias para administrar el tamaño del código.
  • Quieres administrar el lanzamiento de una función, pero debes 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 se declaran en los archivos textproto. Para declarar una marca de compilación, haz lo siguiente:

  1. Navegar 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"
    

    donde:

    • name contiene el nombre de la marca precedido por RELEASE_. Solo se permiten letras mayúsculas y guiones bajos.
    • namespace contiene el espacio de nombres para las contribuciones. Debes trabajar con el revisor de Google asignado para determinar tu espacio de nombres. Si usas marcas de lanzamiento de funciones para mantener la estabilidad de tu propio espejo de AOSP, puedes usar el espacio de nombres como quieras.
    • value es el tipo y el valor inicial de la marca. El tipo puede ser bool_value o string_value. Si el tipo es string_value, el valor debe estar entre comillas. Si no se especifica, el valor es una string vacía. Los valores booleanos se representan como true o como la string vacía para falso.
    • workflow es LAUNCH o PREBUILT. Usa LAUNCH para las marcas booleanas que avanzan de false a true, de manera similar a las marcas de lanzamiento de funciones. Usa PREBUILT para marcas que establezcan una versión, generalmente de una compilación previa.
    • containers: Es el tipo de código que escribes, como “proveedor” para el código de un proveedor o “producto” para el código de producto. Si no estás seguro del valor que debes usar, usa los cuatro tipos de contenedores como se muestra en el ejemplo anterior.

Usa una marca de compilación en un archivo Soong

En el archivo de compilación y el módulo en el que deseas consultar el valor de la marca, usa una condición para bifurcarse en el valor de la marca. 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 forma dinámica al módulo cc_defaults.

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

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

En el archivo make, una marca de compilación es una variable de make de solo lectura. En la siguiente muestra de archivo makefile, se 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 establecido en PREBUILT en RELEASE_PACKAGE_NFC_STACK.textproto y un valor de cadena de com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto en el archivo de valores de marca para la configuración de desarrollo de trunk_staging.