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:
- Prowadź do:
WORKING_DIRECTORY/build/release/flag_declarations/ - Utwórz plik o nazwie
RELEASE_MY_FLAG_NAME.textproto. 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:
namezawiera nazwę flagi poprzedzoną znakiemRELEASE_. Dozwolone są tylko wielkie litery i podkreślenia.namespacezawiera 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.valueto początkowy typ i wartość flagi. Typ może mieć wartośćbool_valuelubstring_value. Jeśli typ tostring_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 jakotruelub pusty ciąg znaków w przypadku wartości fałsz.workflowtoLAUNCHlubPREBUILT. Używaj symboluLAUNCHw przypadku flag logicznych, które przechodzą ze stanufalsedotrue, podobnie jak flagi wprowadzania funkcji. Używaj symboluPREBUILTw przypadku flag, które ustawiają wersję, zwykle wstępnie utworzoną.containersrodzaj 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.