Deklarowanie i używanie flagi kompilacji

Flagi kompilacji to stałe wartości czasu kompilacji, których nie można zmienić w czasie działania programu. Te flagi są używane w sytuacjach, w których nie można używać flag konfiguracyjnych, np.

  • Masz wstępnie skompilowany lub gotowy fragment kodu, który chcesz opcjonalnie uwzględnić w kompilacji.
  • Chcesz wprowadzić zmiany w samym systemie kompilacji.
  • Chcesz umieścić flagi wokół zależności, aby zarządzać rozmiarem kodu.
  • Chcesz zarządzać wprowadzeniem funkcji, ale musisz sprawdzić wartość flagi, zanim system udostępni flagi aconfig.

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. Edytuj plik i 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ą znakiem RELEASE_. Dozwolone są tylko wielkie litery i podkreślenia.
    • namespace zawiera przestrzeń nazw dla wpłat. Aby określić przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego klona AOSP, możesz używać przestrzeni nazw w dowolny sposób.
    • value to początkowy typ i wartość flagi. Typ może mieć wartość bool_value lub string_value. Jeśli typ to string_value, wartość musi być ujęta w cudzysłów. Jeśli nie zostanie określona, wartością będzie pusty ciąg. Wartości logiczne są reprezentowane jako true lub pusty ciąg znaków w przypadku wartości fałsz.
    • workflow to LAUNCH lub PREBUILT. Używaj symbolu LAUNCH w przypadku flag logicznych, które przechodzą ze stanu false do true, podobnie jak flagi wprowadzania funkcji. Używaj symbolu PREBUILT w przypadku flag, które ustawiają wersję, zwykle wstępnie utworzoną.
    • containers rodzaj kodu, który piszesz, np. „vendor” w przypadku kodu sprzedawcy lub „product” w przypadku kodu produktu. Jeśli nie masz pewności, jakiej wartości użyć, użyj wszystkich 4 typów kontenerów, jak pokazano w poprzednim przykładzie.

Używanie flagi kompilacji w pliku Soong

W pliku kompilacji i module, w którym chcesz wysłać zapytanie o wartość flagi, użyj instrukcji warunkowej, aby rozgałęzić się na podstawie wartości flagi. Na przykład w tym fragmencie kodu sprawdzana jest wartość 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 flagi to true, moduł libaconfig_storage_read_api_cc jest dynamicznie połączony 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 pliku makefile uzyskuje się 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 PREBUILT w pliku RELEASE_PACKAGE_NFC_STACK.textproto i wartość ciągu znaków com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto w pliku wartości flag dla konfiguracji deweloperskiej trunk_staging.