Deklarowanie i używanie flagi kompilacji

Flagi kompilacji są stałymi czasowymi kompilacji i nie można ich zmieniać w czasie działania. Te flagi są używane w sytuacjach, gdy nie można użyć flag aconfig, na przykład:

  • Masz gotowy fragment kodu, który chcesz opcjonalnie dołączyć do kompilacji.
  • Chcesz wprowadzić zmiany w samym systemie.
  • 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 zostaną udostępnione przez system.

Zadeklaruj flagę 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ą znakiem RELEASE_. Dozwolone są tylko wielkie litery i podkreślenia.
    • namespace zawiera przestrzeń nazw darowizn. Aby ustalić swoją przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, by zachować stabilność własnego lustra AOSP, przestrzeni nazw możesz używać w dowolny sposób.
    • value to początkowy typ i wartość flagi. Możliwe wartości to bool_value lub string_value. Jeśli typ to string_value, wartość musi być w cudzysłowie. Jeśli jej nie określisz, wartością jest pusty ciąg znaków. Wartości logiczne są reprezentowane jako true lub pusty ciąg znaków dla wartości false.
    • workflow to LAUNCH lub PREBUILT. Używaj LAUNCH w przypadku flag z wartościami logicznymi przechodzącymi z false do true, podobnie jak w przypadku flag uruchamiania funkcji. Używaj PREBUILT w przypadku flag, które ustawiają wersję, zwykle w ramach wstępnie skompilowanych wersji.
    • 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, jakiej wartości użyć, we wszystkich 4 typach kontenerów, jak pokazano 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 wysyła się 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 połą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 make 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 i wartość ciągu znaków com.android.nfcservices RELEASE_PACKAGE_NFC_STACK.textproto w pliku wartości flag dla konfiguracji programistycznej trunk_staging.

.