Dwie pary macierzy zgodności i plików manifestu powinny być uzgodnione w celu sprawdzenia, czy platforma i implementacja dostawcy mogą ze sobą współdziałać. Weryfikacja kończy się powodzeniem, gdy macierz zgodności platformy jest zgodny z plikiem manifestu urządzenia, a także między plikiem manifestu platformy a tabelą zgodności urządzenia.
Ta weryfikacja jest przeprowadzana w czasie kompilacji, generowania pakietu aktualizacji OTA, uruchamiania i testów zgodności VTS.
W następnych sekcjach znajdziesz szczegółowe informacje o regułach dopasowywania używanych przez różne komponenty.
Dopasowania wersji w ramach macierzy zgodności
Aby dopasować plik manifestu urządzenia do macierzy zgodności frameworka, wersja FCM określona przez manifest.target-level
musi być dokładnie taka sama jak wersja FCM określona przez compatibility-matrix.level
. W przeciwnym razie nie ma dopasowania.
Gdy libvintf
jest używane do wysyłania żądania dotyczącego macierzy zgodności platformy, zawsze jest to zgodne z oczekiwaniami, ponieważ libvintf
otwiera plik manifestu urządzenia, pobiera wersję FCM do wysyłania i zwraca macierz zgodności platformy w wersji FCM do wysyłania (oraz niektóre opcjonalne HAL-e z macierzy zgodności w wyższych wersjach FCM).
Mecze HAL
Reguła dopasowania HAL identyfikuje wersje elementów hal
w pliku manifestu, które są uznawane za obsługiwane przez właściciela odpowiedniej matrycy zgodności.
HIDL i natywne interfejsy HAL
Poniżej znajdziesz reguły dopasowania HIDL i natywnych HAL.
- Wiele elementów
<hal>
jest ocenianych w ramach jednej relacji ORAZ. - Elementy
<hal>
mogą mieć atrybuty<hal optional="true">
, aby oznaczyć je jako opcjonalne. - Wiele elementów
<version>
w tym samym<hal>
jest połączonych relacją LUB. Jeśli określisz co najmniej 2, musisz zaimplementować tylko jedną z nich. (zobacz przykład DRM poniżej). - Gdy wymagany jest element
<hal>
, elementy<instance>
i<regex-instance>
w tym samym elemencie<hal>
są oceniane za pomocą pojedynczej relacji AND. (patrz poniżej przykład dotyczący <ahref="#drm">DRM)</ahref="#drm">
Przykład: pomyślne dopasowanie HAL do modułu
W przypadku interfejsu HAL w wersji 2.5 reguła dopasowania wygląda tak:
Matrix | Odpowiedni plik manifestu |
---|---|
2.5 |
2,5–2,∞. W macierz zgodności 2.5 to skrót od 2.5-5 . |
2.5-7 |
2.5–2.∞. Oznacza to:
2.5-7 . |
Przykład: pomyślne dopasowanie HAL do modułu DRM
Tablica zgodności platformy zawiera te informacje o wersji DRM HAL:
<hal> <name>android.hardware.drm <version>1.0</version> <version>3.1-2</version> <interface> <name>IDrmFactory</name> <instance>default</instance> <instance>specific</instance> </interface> </hal> <hal> <name>android.hardware.drm <version>2.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> <regex-instance>[a-z]+/[0-9]+</regex-instance> </interface> </hal>
Dostawca musi wdrożyć JEDNĄ z tych opcji:
android.hardware.drm@1.x::IDrmFactory/default // where x >= 0 android.hardware.drm@1.x::IDrmFactory/specific // where x >= 0LUB
android.hardware.drm@3.y::IDrmFactory/default // where y >= 1 android.hardware.drm@3.y::IDrmFactory/specific // where y >= 1
Muszą też być spełnione wszystkie te warunki:
android.hardware.drm@2.z::ICryptoFactory/default // where z >= 0 android.hardware.drm@2.z::ICryptoFactory/${INSTANCE} // where z >= 0 and ${INSTANCE} matches [a-z]+/[0-9]+ // e.g. legacy/0
Listy HAL AIDL
Wszystkie wersje Androida nowsze niż 11 (z wyjątkiem Androida 11) obsługują wersje interfejsów AIDL HAL w VINTF.
Reguły dopasowywania w przypadku interfejsów HAL AIDL są podobne do reguł HIDL i natywnych interfejsów HAL, z tym że nie ma wersji głównych, a każdy instancja interfejsu HAL ma dokładnie jedną wersję (1
, jeśli wersja nie jest określona).
- Wiele elementów
<hal>
jest ocenianych za pomocą pojedynczego związku ORAZ. - Elementy
<hal>
mogą mieć atrybuty<hal optional="true">
, aby oznaczyć je jako opcjonalne. - Jeśli w jednym elemencie
<hal>
jest wymagana pojedyncza relacja ORAZ, wiele elementów<instance>
i<regex-instance>
w obrębie tego samego elementu<hal>
jest oceniane. (patrz poniżej przykład <ahref="#vibrator">wibratora).</ahref="#vibrator">
Przykład: pomyślne dopasowanie HAL do modułu
W przypadku HAL w wersji 5 reguła dopasowania wygląda tak:
Matrix | Pasujący plik manifestu |
---|---|
5 |
5–∞. W macierz zgodności 5 jest skrótem dla
5-5 . |
5-7 |
5-∞. Oznacza:
5-7 . |
Przykład: pomyślne dopasowanie HAL do wielu modułów
W ramach tej tabeli zgodności podano następujące informacje o wersjach interfejsów API:
<hal> <name>android.hardware.vibrator <version>1-2</version> <interface> <name>IVibrator</name> <instance>default</instance> <instance>specific</instance> </interface> </hal> <hal> <name>android.hardware.camera <version>5</version> <interface> <name>ICamera</name> <instance>default</instance> <regex-instance>[a-z]+/[0-9]+</regex-instance> </interface> </hal>
Dostawca musi wdrożyć wszystkie te przypadki:
android.hardware.vibrator.IVibrator/default // version >= 1 android.hardware.vibrator.IVibrator/specific // version >= 1 android.hardware.camera.ICamera/default // version >= 5 android.hardware.camera.ICamera/${INSTANCE} // with version >= 5, where ${INSTANCE} matches [a-z]+/[0-9]+ // e.g. legacy/0
Mecze jądra
W sekcji <kernel>
w ramach matrycy zgodności frameworku opisane są wymagania frameworku dotyczące jądra Linuksa na urządzeniu. Te informacje mają być dopasowywane do informacji dotyczących jądra, które są przekazywane przez obiekt VINTF urządzenia.
Dopasuj gałęzie jądra
Każdy przyrostek gałęzi jądra (np. 5.4-r
) jest mapowany na unikalną wersję FCM jądra (np. 5). Mapowanie jest takie samo jak mapowanie liter wersji (np. R) i wersji FCM (np. 5).
Testy VTS wymuszają, aby urządzenie wyraźnie określało wersję jądra FCM w pliku manifestu urządzenia (/vendor/etc/vintf/manifest.xml
), jeśli jest spełniony co najmniej jeden z tych warunków:
-
Wersja FCM jądra różni się od docelowej wersji FCM. Na przykład wspomniane urządzenie ma docelową wersję FCM 4, a wersja jądra FCM to 5 (sufiks gałęzi jądra:
r
). -
Wersja FCM jądra jest większa lub równa 5 (suffiks gałęzi jądra:
r
).
Testy VTS wymagają, aby w przypadku podania wersji FCM jądra była ona większa lub równa docelowej wersji FCM w pliku manifestu urządzenia.
Przykład: określenie gałęzi jądra
Jeśli urządzenie ma docelową wersję FCM 4 (wydana w Androidzie 10), ale używa jądra z gałęzi 4.19-r
, w pliku manifestu urządzenia należy określić:
<manifest version="2.0" type="device" target-level="4"> <kernel target-level="5" /> </manifest>
Obiekt VINTF sprawdza zgodność jądra z wymaganiami w gałęzi jądra 4.19-r
, która jest określona w wersji 5 FCM. Te wymagania są tworzone na podstawie
kernel/configs/r/android-4.19
w drzewie źródłowym Androida.
Przykład: określenie gałęzi jądra dla GKI
Jeśli urządzenie korzysta z Generic Kernel Image (GKI), a ciąg znaków wersji jądra z /proc/version
ma postać:
5.4.42-android12-0-00544-ged21d463f856
Następnie obiekt VINTF pobiera wersję Androida z wersji jądra i na jej podstawie określa wersję FCM jądra. W tym przykładzie android12
oznacza FCM jądra w wersji 6 (udostępnianej w Androidzie 12).
Szczegółowe informacje o parsowaniu ciągu wersji jądra znajdziesz w artykule Obsługa wersji GKI.
Dopasuj wersje jądra
Macierz może zawierać kilka sekcji <kernel>
, z których każda ma inny atrybut version
w formacie:
${ver}.${major_rev}.${kernel_minor_rev}
Obiekt VINTF uwzględnia tylko sekcję <kernel>
z FCM z odpowiednią wersją FCM z tymi samymi wartościami ${ver}
i ${major_rev}
co jądro urządzenia (tzn.
version="${ver}.${major_rev}.${matrix_minor_rev}")
; inne sekcje są ignorowane. Dodatkowo drobna poprawka w jądrze musi być wartością z macierzy zgodności (${kernel_minor_rev} >=
${matrix_minor_rev}
). Jeśli żadna sekcja <kernel>
nie spełnia tych wymagań, oznacza to brak zgodności.
Przykład: wybieranie wymagań dotyczących dopasowywania
Rozważmy hipotetyczny przypadek, w którym pliki FCM w /system/etc/vintf
deklarują następujące wymagania (tagi nagłówka i stopki są pominięte):
<!-- compatibility_matrix.3.xml --> <kernel version="4.4.107" level="3"/> <!-- See kernel/configs/p/android-4.4/ for 4.4-p requirements --> <kernel version="4.9.84" level="3"/> <!-- See kernel/configs/p/android-4.9/ for 4.9-p requirements --> <kernel version="4.14.42" level="3"/> <!-- See kernel/configs/p/android-4.14/ for 4.14-p requirements --> <!-- compatibility_matrix.4.xml --> <kernel version="4.9.165" level="4"/> <!-- See kernel/configs/q/android-4.9/ for 4.9-q requirements --> <kernel version="4.14.105" level="4"/> <!-- See kernel/configs/q/android-4.14/ for 4.14-q requirements --> <kernel version="4.19.42" level="4"/> <!-- See kernel/configs/q/android-4.19/ for 4.19-q requirements --> <!-- compatibility_matrix.5.xml --> <kernel version="4.14.180" level="5"/> <!-- See kernel/configs/r/android-4.14/ for 4.14-r requirements --> <kernel version="4.19.123" level="5"/> <!-- See kernel/configs/r/android-4.19/ for 4.19-r requirements --> <kernel version="5.4.41" level="5"/> <!-- See kernel/configs/r/android-5.4/ for 5.4-r requirements -->
Docelowa wersja FCM, wersja FCM jądra i wersja jądra razem określają wymagania dotyczące jądra z FCM:
Docelowa wersja FCM | Wersja FCM jądra | Wersja jądra | Dopasuj do |
---|---|---|---|
3 (K) | nie określono | 4.4.106 | Brak dopasowania (niezgodność wersji podrzędnej) |
3 (K) | nie określono | 4.4.107 | 4.4-p |
3 (K) | nie określono | 4.19.42 | 4.19-q (patrz uwaga poniżej) |
3 (K) | nie określono | 5.4.41 | 5.4-r (patrz uwaga poniżej) |
3 (K) | 3 (K) | 4.4.107 | 4.4-p |
3 (K) | 3 (K) | 4.19.42 | Brak dopasowania (brak gałęzi jądra 4.19-p ) |
3 (K) | 4 (Q) | 4.19.42 | 4.19-q |
4 (Q) | nie określono | 4.4.107 | Brak dopasowania (brak gałęzi jądra 4.4-q ) |
4 (Q) | nie określono | 4.9.165 | 4.9-q |
4 (Q) | nie określono | 5.4.41 | 5.4-r (zobacz uwagę poniżej) |
4 (Q) | 4 (Q) | 4.9.165 | 4.9-q |
4 (Q) | 4 (K) | 5.4.41 | Brak dopasowania (brak gałęzi jądra 5.4-q ) |
4 (K) | 5 (R) | 4.14.105 | 4.14-r |
4 (Q) | 5 (R) | 5.4.41 | 5.4-r |
5 (R) | nie określono | każdy | VTS nie działa (musisz określić wersję FCM rdzenia dla docelowej wersji FCM 5) |
5 (R) | 4 (Q) | każdy | VTS nie działa (wersja FCM jądra jest starsza niż docelowa wersja FCM) |
5 (R) | 5 (R) | 4.14.180 | 4.14-r |
Dopasuj konfiguracje jądra
Jeśli sekcja <kernel>
jest zgodna, proces jest kontynuowany, próbując dopasować elementy config
do /proc/config.gz
. W przypadku każdego elementu konfiguracji w tablicy zgodności sprawdza wartość /proc/config.gz
, aby sprawdzić, czy konfiguracja jest obecna. Jeśli element konfiguracji ma wartość n
w tablicy zgodności w sekcji dopasowania <kernel>
, nie może być obecny w sekcji /proc/config.gz
. Na koniec: element konfiguracji, który nie znajduje się w tablicy zgodności, może się w niej znajdować lub nie./proc/config.gz
Przykład: dopasowywanie konfiguracji jądra
<value type="string">bar</value>
pasuje do"bar"
. Cudzysłówy są pomijane w tabeli zgodności, ale występują w pliku/proc/config.gz
.<value type="int">4096</value>
pasuje do4096
,0x1000
lub0X1000
.<value type="int">0x1000</value>
pasuje do wartości4096
,0x1000
lub0X1000
.<value type="int">0X1000</value>
pasuje do4096
,0x1000
lub0X1000
.<value type="tristate">y</value>
pasuje doy
.<value type="tristate">m</value>
pasuje dom
.<value type="tristate">n</value>
oznacza, że element konfiguracji NIE może istnieć w elementach/proc/config.gz
.<value type="range">1-0x3</value>
odpowiada1
,2
lub3
albo ich szesnastkowemu odpowiednikowi.
Przykład: udane dopasowanie jądra
Matryca zgodności systemu z platformą FCM w wersji 1 zawiera te informacje o jądrze:
<kernel version="4.14.42"> <config> <key>CONFIG_TRI</key> <value type="tristate">y</value> </config> <config> <key>CONFIG_NOEXIST</key> <value type="tristate">n</value> </config> <config> <key>CONFIG_DEC</key> <value type="int">4096</value> </config> <config> <key>CONFIG_HEX</key> <value type="int">0XDEAD</value> </config> <config> <key>CONFIG_STR</key> <value type="string">str</value> </config> <config> <key>CONFIG_EMPTY</key> <value type="string"></value> </config> </kernel>
Najpierw dopasowywany jest element gałęzi jądra. Gałąź jądra jest określona w pliku manifestu urządzenia w sekcji manifest.kernel.target-level
. Jeśli nie jest określona, domyślnie jest to manifest.level
. Jeśli gałąź jądra w pliku manifestu urządzenia:
- wynosi 1, przechodzi do następnego kroku i sprawdza wersję jądra.
- jest 2, nie pasuje do macierzy. Obiekty VINTF odczytują wymagania jądra z macierzy w FCM w wersji 2.
Wtedy dopasowywana jest wersja jądra. Jeśli urządzenie w uname()
zgłasza:
- 4.9.84 (brak dopasowania do macierzy, chyba że istnieje oddzielna sekcja jądra z funkcją
<kernel version="4.9.x">
, gdziex <= 84
) - 4.14.41 (brak dopasowania do macierzy, mniejsza niż
version
) - 4.14.42 (dopasowywanie do macierzy)
- 4.14.43 (zgodność z macierzą)
- 4.1.22 (brak dopasowania do macierzy, chyba że istnieje odrębna sekcja jądra z
<kernel version="4.1.x">
, gdziex <= 22
)
Po wybraniu odpowiedniej sekcji <kernel>
oczekujemy, że w przypadku każdego elementu <config>
o wartości innej niż n
odpowiedni wpis będzie obecny w sekcji /proc/config.gz
, a w przypadku każdego elementu <config>
o wartości n
odpowiedni wpis nie będzie obecny w sekcji /proc/config.gz
. Zawartość <value>
powinna dokładnie odpowiadać tekstowi po znaku równości (w tym cudzysłowach) do znaku nowego wiersza lub #
, przy czym odstępy wiodące i zakończone powinny zostać obcięte.
Przykładem dopasowania jest następująca konfiguracja jądra:
# comments don't matter CONFIG_TRI=y # CONFIG_NOEXIST shouldn't exist CONFIG_DEC = 4096 # trailing comments and whitespaces are fine CONFIG_HEX=57005 # 0XDEAD == 57005 CONFIG_STR="str" CONFIG_EMPTY="" # empty string must have quotes CONFIG_EXTRA="extra config items are fine too"
Przykładem nieudanego dopasowania jest ta konfiguracja jądra:
CONFIG_TRI="y" # mismatch: quotes CONFIG_NOEXIST=y # mismatch: CONFIG_NOEXIST exists CONFIG_HEX=0x0 # mismatch; value doesn't match CONFIG_DEC="" # mismatch; type mismatch (expect int) CONFIG_EMPTY=1 # mismatch; expects "" # mismatch: CONFIG_STR is missing
Pasujące zasady SE
Zasady dotyczące wyszukiwania na stronie wymagają tych dopasowań:
<sepolicy-version>
definiuje zamknięty zakres wersji podrzędnych dla każdej wersji głównej. Wersja sepolicy zgłaszana przez urządzenie musi mieścić się w jednym z tych zakresów, aby była zgodna z ramami. Zasady dopasowania są podobne do wersji HAL; dopasowanie występuje, jeśli wersja sepolicy jest większa lub równa wersji minimalnej dla zakresu. Wersja maksymalna ma charakter czysto informacyjny.<kernel-sepolicy-version>
np. wersja policydb. Musi być mniejsza niżsecurity_policyvers()
zgłoszona przez urządzenie.
Przykład: pomyślne dopasowanie do zasad SE
Tablica zgodności platformy zawiera te informacje o sepolicy:
<sepolicy> <kernel-sepolicy-version>30</kernel-sepolicy-version> <sepolicy-version>25.0</sepolicy-version> <sepolicy-version>26.0-3</sepolicy-version> </sepolicy>
Na urządzeniu:
- Wartość zwracana przez funkcję
security_policyvers()
musi być większa niż lub równa 30. W przeciwnym razie się nie uda. Na przykład:- Jeśli urządzenie zwróci wartość 29, nie będzie to pasujące urządzenie.
- Jeśli urządzenie zwróci wartość 31, będzie to oznaczać dopasowanie.
- Wersja zasad SE musi być 25.0-∞ lub 26.0-∞. W przeciwnym razie nie będzie pasować. (Wskazówka „
-3
” po wskazówce „26.0
” ma charakter wyłącznie informacyjny).
Dopasowania wersji AVB
Wersja AVB zawiera wersję GŁÓWNA i PODRZĘDNA w formacie GŁÓWNA.PODRZĘDNA (np. 1.0, 2.1). Szczegółowe informacje znajdziesz w artykule na temat wersji i zgodności. Wersja AVB ma te właściwości systemowe:
ro.boot.vbmeta.avb_version
to wersjalibavb
programu rozruchowegoro.boot.avb_version
to wersjalibavb
w systemie operacyjnym Android (init/fs_mgr
)
Właściwość systemowa pojawia się tylko wtedy, gdy odpowiednia biblioteka libavb została użyta do zweryfikowania metadanych AVB (i zwraca OK). Nie ma go, jeśli wystąpił błąd weryfikacji (lub nie przeprowadzono żadnej weryfikacji).
Dopasowanie zgodności porównuje te elementy:
- sysprop
ro.boot.vbmeta.avb_version
z wartościąavb.vbmeta-version
z tablicy zgodności platformy;ro.boot.vbmeta.avb_version.MAJOR == avb.vbmeta-version.MAJOR
ro.boot.vbmeta.avb_version.MINOR >= avb.vbmeta-version.MINOR
- sysprop
ro.boot.avb_version
zavb.vbmeta-version
z tablicy zgodności platformy.ro.boot.avb_version.MAJOR == avb.vbmeta-version.MAJOR
ro.boot.avb_version.MINOR >= avb.vbmeta-version.MINOR
Bootloader lub system operacyjny Android może zawierać 2 kopie bibliotek libavb
, z których każda ma inną wersję GŁÓWNĄ dla urządzeń z aktualizacją i urządzeń z wersją wstępną. W takim przypadku można udostępnić ten sam niepodpisany obraz systemu, ale końcowe podpisane obrazy systemu są różne (z różnymi wartościamiavb.vbmeta-version
):
Rysunek 1. Dopasowanie wersji AVB (/system to P, wszystkie inne partycje to O).
Rysunek 2. Zgodność wersji AVB (wszystkie partycje to P).
Przykład: pomyślne dopasowanie wersji AVB
W ramach tej matrycy zgodności podano te informacje o AVB:
<avb> <vbmeta-version>2.1</vbmeta-version> </avb>
Na urządzeniu:
ro.boot.avb_version == 1.0 && ro.boot.vbmeta.avb_version == 2.1 mismatch
ro.boot.avb_version == 2.1 && ro.boot.vbmeta.avb_version == 3.0 mismatch
ro.boot.avb_version == 2.1 && ro.boot.vbmeta.avb_version == 2.3 match
ro.boot.avb_version == 2.3 && ro.boot.vbmeta.avb_version == 2.1 match
Dopasowanie wersji AVB podczas OTA
W przypadku urządzeń z Androidem 9 lub starszym, które są aktualizowane do Androida 10, wymagania dotyczące wersji AVB w matrycy zgodności frameworku są dopasowywane do bieżącej wersji AVB na urządzeniu. Jeśli wersja AVB ma uaktualnioną wersję główną podczas aktualizacji OTA (np. z 0.0 do 1.0), kontrola zgodności VINTF w OTA nie odzwierciedla zgodności po OTA.
Aby rozwiązać ten problem, producent OEM może umieścić w pakiecie OTA (compatibility.zip
) fałszywą wersję AVB, aby przejść weryfikację. Aby to zrobić:
- Wybierz te listy CL do drzewa źródłowego Androida 9:
- Określ
BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE
dla urządzenia. Jego wartość powinna być równa wersji AVB przed aktualizacją OTA, czyli wersji AVB urządzenia w momencie jego wprowadzenia na rynek. - Utwórz ponownie pakiet OTA.
Te zmiany powodują automatyczne umieszczenie elementu BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE
jako compatibility-matrix.avb.vbmeta-version
w tych plikach:
/system/compatibility_matrix.xml
(nie jest używany w Androidzie 9) na urządzeniu.system_matrix.xml
wcompatibility.zip
w pakiecie OTA
Te zmiany nie mają wpływu na inne matrycy zgodności frameworków, w tym /system/etc/vintf/compatibility_matrix.xml
. Po aktualizacji OTA do sprawdzania zgodności używana jest nowa wartość w polu /system/etc/vintf/compatibility_matrix.xml
.
Dopasowania wersji VNDK
Tablica zgodności urządzeń deklaruje wymaganą wersję VNDK w zasadzie compatibility-matrix.vendor-ndk.version
. Jeśli tablica zgodności urządzenia nie zawiera tagu <vendor-ndk>
, nie są narzucane żadne wymagania i dlatego są zawsze uznawane za dopasowanie.
Jeśli tablica zgodności urządzeń zawiera tag <vendor-ndk>
, pozycja <vendor-ndk>
z pasującym atrybutem <version>
jest przeszukiwana z zestawu zrzutów dostawcy VNDK podanych przez platformę w pliku manifestu platformy. Jeśli taki wpis nie istnieje, nie ma dopasowania.
Jeśli taki wpis istnieje, zestaw bibliotek wymienionych w macierz zgodności urządzenia musi być podzbiorem zestawu bibliotek określonych w pliku manifestu frameworka. W przeciwnym razie wpis nie jest uznawany za pasujący.
- W szczególnym przypadku, gdy w macierz zgodności urządzenia nie ma wymienionych żadnych bibliotek, wpis jest zawsze uznawany za dopasowanie, ponieważ pusty zbiór jest podzbiorem dowolnego zbioru.
Przykład: pomyślne dopasowanie wersji VNDK
Jeśli tablica zgodności urządzeń zawiera to wymaganie dotyczące VNDK:
<!-- Example Device Compatibility Matrix --> <vendor-ndk> <version>27</version> <library>libjpeg.so</library> <library>libbase.so</library> </vendor-ndk>
W pliku manifestu platformy uwzględniany jest tylko wpis w wersji 27.
<!-- Framework Manifest Example A --> <vendor-ndk> <version>27</version> <library>libjpeg.so</library> <library>libbase.so</library> <library>libfoo.so</library> </vendor-ndk>
Przykład A pasuje, ponieważ VNDK w wersji 27 znajduje się w pliku manifestu platformy, a {libjpeg.so, libbase.so, libfoo.so} ⊇ {libjpeg.so, libbase.so}
.
<!-- Framework Manifest Example B --> <vendor-ndk> <version>26</version> <library>libjpeg.so</library> <library>libbase.so</library> </vendor-ndk> <vendor-ndk> <version>27</version> <library>libbase.so</library> </vendor-ndk>
Przykład B nie jest zgodny. Mimo że w pliku manifestu platformy VNDK znajduje się wersja 27, platforma w tym zrzucie nie obsługuje funkcji libjpeg.so
. Wersja VNDK 26 jest ignorowana.
Jednakowe wersje pakietu SDK systemu
W macierz zgodności urządzeń w elementach compatibility-matrix.system-sdk.version
podano wymaganą wersję System SDK. Dopasowanie występuje tylko wtedy, gdy zbiór jest podzbiorem podanych wersji pakietu System SDK, jak określono w manifest.system-sdk.version
w pliku manifestu frameworku.
- W szczególnym przypadku, gdy w macierzy zgodności urządzeń nie ma wymienionych wersji pakietu SDK systemu, zawsze jest to uznawane za dopasowanie, ponieważ pusty zbiór jest podzbiorem dowolnego zbioru.
Przykład: udane dopasowanie wersji pakietu systemowego pakietu SDK
Jeśli w ramach matrycy zgodności urządzeń podano następujący wymóg dotyczący System SDK:
<!-- Example Device Compatibility Matrix --> <system-sdk> <version>26</version> <version>27</version> </system-sdk>
Następnie framework musi udostępniać pakiet SDK systemu w wersji 26 lub 27.
<!-- Framework Manifest Example A --> <system-sdk> <version>26</version> <version>27</version> </system-sdk>
Przykład A jest zgodny.
<!-- Framework Manifest Example B --> <system-sdk> <version>26</version> <version>27</version> <version>28</version> </system-sdk>
Przykład B to dopasowanie.
<!-- Framework Manifest Example C --> <system-sdk> <version>26</version> </system-sdk>
Przykład C nie pasuje, ponieważ nie podano wersji pakietu System SDK 27.