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. Te flagi są używane w sytuacjach, w których nie można użyć flag aconfig, np.

  • masz wstępnie skompilowany lub wstępnie utworzony 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ć uruchomieniem 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. Otwórz 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ą ciągiem RELEASE_. Dozwolone są tylko wielkie litery i podkreślenia.
    • namespace zawiera przestrzeń nazw dla udziałów. Aby określić przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnej kopii AOSP, możesz używać przestrzeni nazw w dowolny sposób.
    • 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 zostanie określona, wartością będzie pusty ciąg znaków. Wartości logiczne są reprezentowane jako true lub pusty ciąg znaków w przypadku wartości false.
    • workflow to LAUNCH lub PREBUILT. Użyj LAUNCH w przypadku flag logicznych, które przechodzą ze stanu false do true, podobnie jak flagi uruchamiania funkcji. Użyj PREBUILT w przypadku flag, które ustawiają wersję, zwykle wstępnie utworzoną.
    • containers to typ kodu, który piszesz, np. „vendor” w przypadku kodu dostawcy 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 warunku, aby rozgałęzić się na wartość flagi. Na przykład w tym fragmencie kodu wysyłane jest zapytanie o 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ść tej flagi to true, moduł libaconfig_storage_read_api_cc jest dynamicznie łączony z modułem cc_defaults.

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

Używanie flagi kompilacji w pliku makefile

W pliku makefile flaga kompilacji jest zmienną make tylko do odczytu. Ten przykładowy plik 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 PREBUILT w RELEASE_PACKAGE_NFC_STACK.textproto oraz wartość ciągu znaków com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto plik wartości flag dla konfiguracji deweloperskiej trunk_staging.