W tej sekcji opisaliśmy system i matrycę zgodności urządzeń oraz schemat tej ostatniej. Informacje o regułach dopasowania znajdziesz w artykule Reguły dopasowania.
Macierz zgodności frameworka (FCM)
Macierz zgodności frameworku (FCM) opisuje wymagania frameworku na urządzeniu, na którym jest on uruchamiany. Matryca zgodności frameworku składa się z matrycy zgodności systemu, matrycy zgodności produktu i matrycy zgodności system_ext. Manifest urządzenia musi spełniać wymagania FCM (wymagania są egzekwowane w czasie kompilacji, w czasie działania i w VTS).
System_ext FCM i product FCM to uzupełnienia FCM dla poszczególnych urządzeń (zainstalowane na partycji systemowej).
- FCM urządzenia powinien odzwierciedlać wymagania modułów na partycji systemowej.
- W przypadku systemu system_ext FCM należy uwzględnić wymagania dotyczące poszczególnych modułów na partycji system_ext.
- FCM produktu powinien odzwierciedlać wymagania dotyczące modułów w partycji produktu.
Wszystkie pliki FCM powinny być zgodne z modyfikacjami frameworku w partycjach system, product i system_ext wprowadzonymi przez OEM. Jeśli na przykład aplikacja zainstalowana w partycji produktu używa rozszerzenia dostawcy interfejsu HAL, wymagania dotyczące interfejsu HAL należy zadeklarować w FCM produktu.
Przykładowy plik z macierzą zgodności systemów:
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <compatibility-matrix version="1.0" type="framework" level="3"> <hal> <name>android.hardware.camera</name> <version>1.0</version> <version>3.1-4</version> <interface> <name>ICameraProvider</name> <instance>default</instance> <regex-instance>[a-z_]+/[0-9]+</regex-instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <version>1.0</version> <interface> <name>INfc</name> <instance>default</instance> </interface> </hal> <hal optional="true"> <name>android.hardware.graphics.composer</name> <version>2.1</version> <interface> <name>IComposer</name> <instance>default</instance> </interface> </hal> <hal format="aidl" optional="true"> <name>android.hardware.light</name> <version>1-2</version> <interface> <name>ILights</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>GL</name> <version>1.1</version> <version>3.0</version> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <kernel version="3.18.51"> <!-- common configs --> </kernel> <kernel version="3.18.51"> <!-- arm specific configs --> <condition> <config> <key>CONFIG_ARM</key> <value type="tristate">y</value> </config> <condition> <config> <key>CONFIG_A</key> <value type="string"></value> </config> <config> <key>CONFIG_B</key> <value type="tristate">y</value> </config> </kernel> <kernel version="4.1.22"> <!-- common configs --> <config> <key>CONFIG_A</key> <value type="string">foo</value> </config> <config> <key>CONFIG_B2</key> <value type="int">1024</value> </config> </kernel> <sepolicy> <kernel-sepolicy-version>30</kernel-sepolicy-version> <sepolicy-version>25.0</sepolicy-version> <sepolicy-version>26.0-3</sepolicy-version> </sepolicy> <avb> <vbmeta-version>2.1</vbmeta-version> </avb> <xmlfile format="dtd"> <name>media_profile</name> <version>1.0</version> <path>/system/etc/media_profile_V1_0.dtd</path> </xmlfile> </compatibility-matrix>
Więcej informacji znajdziesz w artykule Cykl życia usługi Firebase Messaging.
Tabela zgodności produktów
Plik FCM produktu to plik matrycy zgodności systemu w partycji produktu. Obiekt VINTF łączy FCM produktu z FCM w systemie i partycjach system_ext w czasie wykonywania.
Przykładowy plik FCM produktu:
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <compatibility-matrix version="1.0" type="framework"> <hal> <name>vendor.foo.camera</name> <version>1.0</version> <interface> <name>IBetterCamera</name> <instance>default</instance> </interface> </hal> </compatibility-matrix>
Tabela zgodności System_ext
System_ext FCM to plik macierzy zgodności frameworku w partycji system_ext. Obiekt VINTF łączy system_ext FCM z FCM w systemie i partycjach produktów w czasie wykonywania. Przykładowy plik system_ext FCM znajdziesz w macierz zgodności produktów.
Matryca zgodności urządzeń (DCM)
Matryca zgodności urządzenia opisuje zestaw wymagań, które urządzenie oczekuje od platformy (wymagania egzekwowane podczas uruchamiania i w ramach aktualizacji OTA).
Przykładowy plik DCM:
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <compatibility-matrix version="1.0" type="device"> <hal> <name>android.hidl.manager</name> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <version>1.0</version> <interface> <name>IMemory</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.allocator</name> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.framework.sensor</name> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </compatibility-matrix>
Schemat macierzy zgodności
W tej sekcji opisano znaczenie tych tagów XML. Niektóre tagi „required” mogą nie występować w pliku źródłowym w drzewie źródłowym Androida i być zapisane przez assemble_vintf
w czasie kompilacji. W odpowiednich plikach na urządzeniu muszą znajdować się tagi „Wymagane”.
?xml
- Opcjonalnie. Udostępnia ona informacje tylko dla parsowania XML.
compatibility-matrix.version
- Wymagane. Metawersja tej tabeli zgodności. Opisuje elementy oczekiwane w macierzy zgodności. Niezwiązane z wersją pliku XML.
compatibility-matrix.type
- Wymagane. Typ tej tabeli zgodności:
"device"
: tabela zgodności urządzeń."framework"
: tabela zgodności platformy.
manifest.level
- Wymagane w ramach tabeli zgodności. W Androidzie 12 i nowszych dozwolone w plikach macierzy zgodności frameworka w partycjach product i system_ext.
Określa wersję macierzy zgodności platformy (wersja FCM) tego pliku. Nie deklaruj tego w ramce matrycy zgodności systemu (np.
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE
). compatibility-matrix.hal
- Opcjonalne i można je powtórzyć. Wyświetla jeden interfejs HAL (HIDL lub natywny), który musi być obecny zgodnie z wymaganiami właściciela macierzy zgodności (platformy lub urządzenia). Wpisy HAL są rozróżniane za pomocą elementu
<name>
. Może istnieć kilka wpisów HAL o tej samej nazwie (co oznacza warunek „i”). compatibility-matrix.hal.format
- Opcjonalnie. Możliwe wartości:
"hidl"
: interfejsy HIDL HAL. Jest to ustawienie domyślne."aidl"
: interfejsy AIDL HAL. Dozwolone tylko w przypadku metawersji 2.0 w macierz zgodności."native"
: natywne HAL.
compatibility-matrix.hal.optional
(Android 15 lub starszy)
Atrybut - jest opcjonalny i domyślnie ma wartość fałsz. Określa, czy ten interfejs HAL jest opcjonalny dla właściciela macierzy zgodności (platformy lub urządzenia). Jeśli wpis
<hal>
jest oznaczony jako opcjonalny, oznacza to, że właściciel może korzystać z tego interfejsu API, jeśli jest obecny, ale nie jest to wymagane. - Ostrzeżenie: ten atrybut został wycofany w Androidzie 15 i nie ma już żadnego wpływu. Jeśli wymagane jest zainstalowanie jakichkolwiek HAL-i, należy to uwzględnić w testach.
compatibility-matrix.hal.name
- Wymagane. Pełna nazwa pakietu tego HAL. Przykłady:
android.hardware.camera
(HIDL lub AIDL HAL)GLES
(natywne HAL, wymagana tylko nazwa)
compatibility-matrix.hal.version
-
Lista zakresów wersji (patrz zgodność HAL), która określa, których wersji oczekuje właściciel macierzy zgodności (platformy lub urządzenia).
W przypadku interfejsów HIDL i własnych interfejsów HAL wymagane, mogą się powtarzać bez duplikatów. Format:MAJOR.MINOR_MIN-MINOR_MAX
MAJOR.MINOR
(odpowiednik:MAJOR.MINOR-MINOR
)
W przypadku interfejsów AIDL HAL nie można ich używać na urządzeniach z Androidem 11 lub starszym. Opcjonalnie na urządzeniach z późniejszymi wersjami. Jeśli jest określony, format jest jeden z tych:VERSION_MIN-VERSION_MAX
VERSION
(odpowiednik:VERSION-VERSION
)
1
. compatibility-matrix.hal.interface
- Opcjonalnie, można powtórzyć. Lista wymaganych interfejsów tego HAL.
compatibility-matrix.hal.interface.name
- Wymagane. Nazwa interfejsu.
compatibility-matrix.hal.interface.instance
- Opcjonalnie, można powtórzyć. Lista wymaganych wystąpień tego interfejsu.
compatibility-matrix.hal.interface.regex-instance
- Opcjonalnie, można powtórzyć. Lista wymaganych wzorów nazw instancji w tym interfejsie. Użyj formatu rozszerzonego wyrażenia regularnego.
compatibility-matrix.kernel
- Opcjonalnie, można powtórzyć. Określ listę konfiguracji jądra, których wymaga framework w przypadku każdej wersji jądra.
Może istnieć wiele<kernel>
z tą samą wartością<version>
, co oznacza relację „i”. Każda wartość<kernel>
to „fragment” wymagań, które są włączone tylko wtedy, gdy spełnione są warunki<conditions>
. compatibility-matrix.kernel.version
- Wymagane. Wersja jądra. Format:
VERSION.MAJOR_REVISION.MINOR_REVISION
. Wersja i główna wersja muszą być identyczne. Wersja podrzędna określa minimalną wersję LTS jądra, której oczekuje platforma. compatibility-matrix.kernel.condition
- Opcjonalnie. Nie może ona występować w przypadku pierwszego
<kernel>
w każdej wersji. Określa listę warunków. Gdy warunki zostaną spełnione, wymagania podane w tym fragmencie<kernel>
zostaną włączone. compatibility-matrix.kernel.config
- Opcjonalnie, można powtórzyć. Zawiera listę
CONFIG
elementów, które muszą być dopasowane do tej wersji jądra. Każdy elementCONFIG
to para klucz-wartość; elementy konfiguracji są rozróżniane za pomocą klucza. compatibility-matrix.kernel.config.key
- Wymagane. Nazwa klucza elementu
CONFIG
. Zaczyna się odCONFIG_
. compatibility-matrix.kernel.config.value
- Wymagane. Wartość elementu
CONFIG
. Format zależy od typu:string
. Cudzysłowy są pomijane.int
. Akceptowane są wartości dziesiętne i szesnastkowe (muszą zaczynać się od0x
lub0X)
). Interpretowana jako 64-bitowa liczba całkowita. Przepełnienie powoduje obcięcie. (Parser akceptuje wartości od -264 + 1 do 264 - 1, 65. bit jest obcinany; szczegółowe informacje znajdziesz na stronie man strtoull).range
. Format to[int]-[int]
, np.10-20
. Dozwolone są wartości szesnastkowe, które muszą się zaczynać od0x
lub0X
. Oba zakresy muszą być 64-bitowymi liczbami całkowitymi bez znaku.tristate
. Prawidłowe wartości toy
,m
in
.
compatibility-matrix.kernel.config.value.type
- Wymagane. Typ wartości elementu
CONFIG
:string
int
range
tristate
compatibility-matrix.sepolicy
- Wymagane. Zawiera wszystkie wpisy związane z sepolicy. Używany tylko przez macierz zgodności frameworka.
compatibility-matrix.sepolicy.sepolicy-version
- Wymagane, można powtórzyć. Opisuje wymagania dotyczące wersji sepolicy.
Odpowiada
manifest.sepolicy.version
. Każda instancja elementu definiuje zakres wersji polityki bezpieczeństwa. compatibility-matrix.sepolicy.kernel-sepolicy-version
- Wymagane. Określa wersję
policydb
, z którą współpracuje framework. compatibility-matrix.avb.vbmeta-version
- Opcjonalny; używany tylko przez matrycę zgodności frameworka. Określa wersję AVB użytą do podpisania
system.img
. Wycofane w Androidzie 10. compatibility-matrix.vendor-ndk
- Opcjonalny; używany tylko przez tablicę zgodności urządzeń. Określa wymagania dotyczące snapshotu dostawcy VNDK. Jeśli brakuje, nie ma wymagań dotyczących VNDK w obrazie systemu.
compatibility-matrix.vendor-ndk.version
- Wymagane. Dodatnia liczba całkowita określająca wersję VNDK wymaganą przez obraz dostawcy.
compatibility-matrix.vendor-ndk.library
- Opcjonalnie, można powtórzyć. Deklaruje zestaw bibliotek VNDK wymaganych przez obraz dostawcy. Ta sama semantyka co
manifest.vendor-ndk.library
. compatibility-matrix.system-sdk.version
- Opcjonalne, można powtórzyć; używane tylko przez tablicę zgodności urządzeń. Określa wymagania dotyczące aplikacji dostawców w wersjach pakietu SDK systemu. Jeśli go brakuje, nie ma wymagań dotyczących System SDK w przypadku obrazu systemu.