Déclarer et utiliser un indicateur de compilation

Les indicateurs de compilation sont des constantes de compilation et ne peuvent pas être modifiés au moment de l'exécution. Ces indicateurs sont utilisés dans les cas où les indicateurs de configuration ne peuvent pas être utilisés, par exemple :

  • Vous disposez d'un code précompilé ou prédéfini que vous souhaitez inclure éventuellement dans un build.
  • Vous souhaitez modifier le système de compilation lui-même.
  • Vous souhaitez ajouter des indicateurs autour des dépendances pour gérer la taille du code.
  • Vous souhaitez gérer le lancement d'une fonctionnalité, mais vous devez vérifier la valeur du flag avant que les flags de configuration ne soient mis à la disposition du système.

Déclarer un indicateur de compilation

Les indicateurs de compilation sont déclarés dans des fichiers textproto. Pour déclarer un indicateur de compilation:

  1. Itinéraire vers WORKING_DIRECTORY/build/release/flag_declarations/
  2. Créez un fichier appelé RELEASE_MY_FLAG_NAME.textproto.
  3. Modifiez le fichier et ajoutez une entrée semblable à celle-ci:

    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"
    

    Où :

    • name contient le nom de l'indicateur précédé de RELEASE_. Seuls les caractères en majuscules et les traits de soulignement sont autorisés.
    • namespace contient l'espace de noms des contributions. Vous devez collaborer avec l'examinateur Google qui vous a été attribué pour déterminer votre espace de noms. Si vous utilisez des indicateurs de lancement de fonctionnalités pour assurer la stabilité de votre propre miroir AOSP, vous pouvez utiliser l'espace de noms comme vous le souhaitez.
    • value correspond au type et à la valeur initiaux de l'indicateur. Le type peut être bool_value ou string_value. Si le type est string_value, la valeur doit être placée entre guillemets. Si aucune valeur n'est spécifiée, la valeur est une chaîne vide. Les valeurs booléennes sont représentées par true ou par la chaîne vide pour "false".
    • workflow correspond à LAUNCH ou PREBUILT. Utilisez LAUNCH pour les indicateurs booléens qui passent de false à true, comme les indicateurs de lancement de fonctionnalités. Utilisez PREBUILT pour les indicateurs qui définissent une version, généralement d'un prédéfini.
    • containers le type de code que vous écrivez, par exemple "vendor" pour le code fournisseur ou "product" pour le code produit. En cas de doute sur la valeur à utiliser, utilisez les quatre types de conteneurs, comme indiqué dans l'exemple précédent.

Utiliser un indicateur de compilation dans un fichier Soong

Dans le fichier de compilation et le module dans lesquels vous souhaitez interroger la valeur de l'indicateur, utilisez une instruction conditionnelle pour créer une branche en fonction de la valeur de l'indicateur. Par exemple, dans l'extrait de code suivant, la valeur de l'indicateur RELEASE__READ_FROM_NEW_STORAGE est interrogée:

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 la valeur de cet indicateur est true, le module libaconfig_storage_read_api_cc est lié dynamiquement au module cc_defaults.

Si la valeur de cet indicateur est false, rien ne se passe (default: [],).

Utiliser un indicateur de compilation dans un fichier makefile

Dans le fichier make, un indicateur de compilation est une variable make en lecture seule. L'exemple de fichier makefile suivant accède à un indicateur de compilation appelé 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 déclaration de cet indicateur comporte un champ workflow défini sur PREBUILT dans RELEASE_PACKAGE_NFC_STACK.textproto et une valeur de chaîne de com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto, le fichier de valeurs d'indicateur pour la configuration de développement trunk_staging.