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:
- 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ą znakiemRELEASE_
. 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 tobool_value
lubstring_value
. Jeśli typ tostring_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 jakotrue
lub pusty ciąg znaków dla wartości false.workflow
toLAUNCH
lubPREBUILT
. UżywajLAUNCH
w przypadku flag z wartościami logicznymi przechodzącymi zfalse
dotrue
, podobnie jak w przypadku flag uruchamiania funkcji. UżywajPREBUILT
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
.