Flagi kompilacji to stałe, które nie mogą być zmieniane w czasie wykonywania. Te flagi są używane w sytuacjach, gdy nie można użyć flag aconfig, na przykład:
- Masz wstępnie skompilowany lub wstępnie utworzony fragment kodu, który chcesz opcjonalnie uwzględnić w kompilacji.
- Chcesz wprowadzić zmiany w systemie budowania.
- 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 staną się dostępne w systemie.
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
. 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ą przezRELEASE_
. Dozwolone są tylko wielkie litery i podkreślenia.namespace
zawiera przestrzeń nazw dla wkładów. Aby określić swoją przestrzeń nazw, musisz współpracować z powierzonym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego mirroru AOSP, możesz dowolnie korzystać z przestrzeni nazw.value
to początkowy typ i wartość flagi. Typ może byćbool_value
lubstring_value
. Jeśli typ tostring_value
, wartość musi być ujęta w cudzysłowy. Jeśli nie podasz żadnej wartości, będzie ona pusta. Wartości logiczne są reprezentowane jakotrue
lub pusty ciąg znaków w przypadku wartości fałsz.workflow
może byćLAUNCH
lubPREBUILT
. UżywajLAUNCH
w przypadku flag logicznych, które przechodzą zfalse
natrue
, podobnie jak flagi wdrażania funkcji. UżyjPREBUILT
w przypadku flag, które ustawiają wersję, zwykle w przypadku wersji wstępnie utworzonej.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, której wartości użyć, użyj wszystkich 4 typów kontenerów, jak 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 zapytanie dotyczy wartości 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 parametru to true
, moduł libaconfig_storage_read_api_cc
jest dynamicznie powiązany 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 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 tekstowego com.android.nfcservices
RELEASE_PACKAGE_NFC_STACK.textproto
w pliku wartości flag dla konfiguracji programistycznej trunk_staging
.