Dichiarare e utilizzare un flag di compilazione

I flag di build sono costanti di build e non possono essere modificati durante l'esecuzione. Questi flag vengono utilizzati in circostanze in cui non è possibile utilizzare i flag di aconfig, ad esempio

  • Hai un pezzo di codice precompilato o predefinito che vuoi includere facoltativamente in una build.
  • Vuoi apportare modifiche al sistema di compilazione stesso.
  • Vuoi inserire flag intorno alle dipendenze per gestire le dimensioni del codice.
  • Vuoi gestire il lancio di una funzionalità, ma devi controllare il valore del flag prima che i flag di Aconfig vengano resi disponibili dal sistema.

Dichiarare un flag di build

I flag di build vengono dichiarati nei file textproto. Per dichiarare un flag di build:

  1. Vai a WORKING_DIRECTORY/build/release/flag_declarations/
  2. Crea un file denominato RELEASE_MY_FLAG_NAME.textproto.
  3. Modifica il file e aggiungi una voce simile alla seguente:

    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"
    

    Dove:

    • name contiene il nome del flag preceduto da RELEASE_. Sono consentite solo lettere maiuscole e trattini bassi.
    • namespace contiene lo spazio dei nomi per i contributi. Devi collaborare con il revisore Google assegnato per determinare il tuo spazio dei nomi. Se utilizzi flag di lancio delle funzionalità per mantenere la stabilità del tuo mirror AOSP, puoi utilizzare lo spazio dei nomi come preferisci.
    • value è il tipo e il valore iniziali per il flag. Il tipo può essere bool_value o string_value. Se il tipo è string_value, il valore deve essere tra virgolette. Se non specificato, il valore è una stringa vuota. I valori booleani sono rappresentati come true o come stringa vuota per il valore false.
    • workflow è LAUNCH o PREBUILT. Utilizza LAUNCH per i flag booleani che passano da false a true, in modo simile ai flag di lancio delle funzionalità. Utilizza PREBUILT per i flag che impostano una versione, in genere di un prebuilt.
    • containers il tipo di codice che stai scrivendo, ad esempio "vendor" per il codice fornitore o "product" per il codice prodotto. In caso di dubbi sul valore da utilizzare, utilizza tutti e quattro i tipi di contenitori come mostrato nell'esempio precedente.

Utilizzare un flag di build in un file Soong

Nel file di build e nel modulo in cui vuoi eseguire query sul valore del flag, utilizza un'istruzione condizionale per creare un ramo in base al valore del flag. Ad esempio, nel seguente snippet viene eseguita una query sul valore del flag 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: [],
  }),
}

Se il valore di questo flag è true, il modulo libaconfig_storage_read_api_cc è collegato dinamicamente al modulo cc_defaults.

Se il valore di questo flag è false, non succede nulla (default: [],).

Utilizzare un flag di build in un makefile

Nel file make, un flag di compilazione è una variabile make di sola lettura. Il seguente esempio di makefile accede a un flag di compilazione chiamato 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 dichiarazione di questo flag ha un campo workflow impostato su PREBUILT in RELEASE_PACKAGE_NFC_STACK.textproto e un valore stringa di com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto nel file dei valori dei flag per la configurazione di sviluppo trunk_staging.