Deklarowanie i używanie flagi kompilacji

Flagi kompilacji to stałe, które nie mogą być zmieniane w czasie wykonywania. Te flagi są używane w sytuacjach, gdy nie można użyć flag aconfig, na przykład:

  • Masz wstępnie skompilowany lub wstępnie utworzony fragment kodu, który chcesz opcjonalnie uwzględnić w kompilacji.
  • Chcesz wprowadzić zmiany w systemie budowania.
  • Chcesz dodać flagi do zależności, aby zarządzać rozmiarem kodu.
  • Chcesz zarządzać wdrażaniem funkcji, ale musisz sprawdzić wartość flagi, zanim flagi aconfig staną się dostępne w systemie.

Deklarowanie flagi kompilacji

Flagi kompilacji są deklarowane w plikach textproto. Aby zadeklarować flagę kompilacji:

  1. Prowadź do: WORKING_DIRECTORY/build/release/flag_declarations/
  2. Utwórz plik o nazwie RELEASE_MY_FLAG_NAME.textproto.
  3. W pliku dodaj wpis podobny do tego:

    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"
    

    Gdzie:

    • name zawiera nazwę flagi poprzedzoną przez RELEASE_. Dozwolone są tylko wielkie litery i podkreślenia.
    • namespace zawiera przestrzeń nazw dla wkładów. Aby określić swoją przestrzeń nazw, musisz współpracować z powierzonym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego mirroru AOSP, możesz dowolnie korzystać z przestrzeni nazw.
    • value to początkowy typ i wartość flagi. Typ może być bool_value lub string_value. Jeśli typ to string_value, wartość musi być ujęta w cudzysłowy. Jeśli nie podasz żadnej wartości, będzie ona pusta. Wartości logiczne są reprezentowane jako true lub pusty ciąg znaków w przypadku wartości fałsz.
    • workflow może być LAUNCH lub PREBUILT. Używaj LAUNCH w przypadku flag logicznych, które przechodzą z false na true, podobnie jak flagi wdrażania funkcji. Użyj PREBUILT w przypadku flag, które ustawiają wersję, zwykle w przypadku wersji wstępnie utworzonej.
    • containers typ kodu, który piszesz, np. „vendor” (dostawca) w przypadku kodu dostawcy lub „product” (produkt) w przypadku kodu produktu. Jeśli nie masz pewności, której wartości użyć, użyj wszystkich 4 typów kontenerów, jak w poprzednim przykładzie.

Używanie flagi kompilacji w pliku Soong

W pliku kompilacji i module, w których chcesz wysłać zapytanie o wartość flagi, użyj instrukcji warunkowej, aby utworzyć gałąź na podstawie tej wartości. Na przykład w tym fragmencie kodu zapytanie dotyczy wartości flagi 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: [],
  }),
}

Jeśli wartość tego parametru to true, moduł libaconfig_storage_read_api_cc jest dynamicznie powiązany z modułem cc_defaults.

Jeśli wartość tego oznaczenia to false, nic się nie dzieje (default: [],).

Używanie flagi kompilacji w pliku makefile

W pliku make flaga kompilacji jest zmienną make tylko do odczytu. W tym przykładzie makefile uzyskuje dostęp do flagi kompilacji o nazwie 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

Deklaracja tej flagi ma pole workflow ustawione na PREBUILTRELEASE_PACKAGE_NFC_STACK.textproto i wartość ciągu tekstowego com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto w pliku wartości flag dla konfiguracji programistycznej trunk_staging.