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:
- Otwórz
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ą ciągiemRELEASE_. Dozwolone są tylko wielkie litery i podkreślenia.namespacezawiera 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.valueto początkowy typ i wartość flagi. Typ może byćbool_valuelubstring_value. Jeśli typ tostring_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 jakotruelub pusty ciąg znaków w przypadku wartości false.workflowtoLAUNCHlubPREBUILT. UżyjLAUNCHw przypadku flag logicznych, które przechodzą ze stanufalsedotrue, podobnie jak flagi uruchamiania funkcji. UżyjPREBUILTw przypadku flag, które ustawiają wersję, zwykle wstępnie utworzoną.containersto 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.