Le due coppie di matrici e manifest di compatibilità hanno lo scopo riconciliato per verificare che il framework e l'implementazione del fornitore possono lavorare contemporaneamente. Questa verifica ha esito positivo in presenza di una corrispondenza tra la matrice di compatibilità del framework manifest del dispositivo, nonché tra il manifest del framework e il file manifest di compatibilità.
Questa verifica viene eseguita al momento della creazione, al momento dell'aggiornamento OTA di generazione del pacchetto, al momento dell'avvio e nei test di compatibilità VTS.
Le seguenti sezioni descrivono in dettaglio le regole di corrispondenza utilizzate da componenti.
La versione della matrice di compatibilità del framework corrisponde
Per associare il manifest di un dispositivo a una matrice di compatibilità del framework,
la versione FCM di spedizione specificata da manifest.target-level
deve essere esattamente uguale alla versione FCM specificata da
compatibility-matrix.level
. In caso contrario, non c'è corrispondenza.
Quando viene richiesta la matrice di compatibilità del framework con libvintf
, questa corrispondenza è
sempre riuscita perché libvintf
apre il manifest del dispositivo e recupera l'attributo spedizione
FCM Version, e restituisce la matrice di compatibilità del framework in quella versione di FCM di spedizione (più alcune
HAL facoltativi da matrici di compatibilità in versioni FCM successive).
Corrispondenze HAL
La regola di corrispondenza HAL identifica le versioni degli elementi hal
in un
file manifest supportati dal proprietario dell'account di servizio
di compatibilità.
HIDL e HAL nativi
Di seguito sono riportate le regole di corrispondenza per gli HAL HIDL e nativi.
- Più elementi
<hal>
vengono valutati con un singolo AND relazione tra utenti. <hal>
elementi possono avere<hal optional="true">
per contrassegnarli come non è obbligatorio.- Più elementi
<version>
all'interno dello stesso<hal>
hanno una relazione OR. Se vengono specificati due o più, una delle versioni deve essere implementata. (vedi l'esempio di DRM di seguito). - Più elementi
<instance>
e<regex-instance>
elementi all'interno dello stesso<hal>
vengono valutati con una singola relazione AND quando È obbligatorio specificare il campo<hal>
. Vedi l'<ahref="#drm">esempio di DRM riportato di seguito</ahref="#drm">.
Esempio: corrispondenza HAL riuscita per un modulo
Per un HAL alla versione 2.5, la regola di corrispondenza è la seguente:
Matrice | Manifest corrispondente |
---|---|
2.5 |
2,5-2,∞. Nella matrice di compatibilità, 2.5 è l'abbreviazione di
2.5-5 . |
2.5-7 |
2,5-2,∞. Indica quanto segue:
2.5-7 nella sua matrice di compatibilità. |
Esempio: corrispondenza HAL riuscita per il modulo DRM
La matrice di compatibilità del framework dichiara le seguenti informazioni sulla versione per 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>
Un fornitore deve implementare UNA delle seguenti istanze: o
android.hardware.drm@1.x::IDrmFactory/default // where x >= 0 android.hardware.drm@1.x::IDrmFactory/specific // where x >= 0OPPURE
android.hardware.drm@3.y::IDrmFactory/default // where y >= 1 android.hardware.drm@3.y::IDrmFactory/specific // where y >= 1
E deve inoltre implementare tutte le seguenti istanze:
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
HAL AIDL
Tutte le versioni di Android successive ad Android 11 (escluso Android
11) supporta le versioni per gli HAL AIDL in VINTF.
Le regole di corrispondenza per gli HAL AIDL sono simili a quelle degli HAL HIDL e nativi, tranne che
non esistono versioni principali ed esiste esattamente una versione per istanza HAL (1
se
non è specificata).
- Più elementi
<hal>
vengono valutati con un singolo AND relazione tra utenti. <hal>
elementi possono avere<hal optional="true">
per contrassegnarli come non è obbligatorio.- Più elementi
<instance>
e<regex-instance>
elementi all'interno dello stesso<hal>
vengono valutati con una singola relazione AND quando È obbligatorio specificare il campo<hal>
. (Vedi l'<ahref="#vibrator">esempio di vibrazione di seguito).</a href="#vibrator">
Esempio: corrispondenza HAL riuscita per un modulo
Per un HAL alla versione 5, la regola di corrispondenza è la seguente:
Matrice | Manifest corrispondente |
---|---|
5 |
5-∞. Nella matrice di compatibilità, 5 è l'abbreviazione di
5-5 . |
5-7 |
5-∞. Indica quanto segue:
5-7 nella sua matrice di compatibilità. |
Esempio: corrispondenza HAL riuscita per più moduli
La matrice di compatibilità del framework dichiara le seguenti informazioni sulla versione per HAL vibrazione e videocamera:
<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>
Un fornitore deve implementare tutte queste istanze:
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
Corrispondenze kernel
La sezione <kernel>
della matrice di compatibilità del framework
descrive i requisiti del framework del kernel Linux sul dispositivo. Questo
le informazioni devono essere confrontate
informazioni
sul kernel che viene segnalato dall'oggetto VINTF del dispositivo.
Associa i rami del kernel
Ogni suffisso del ramo del kernel (ad esempio, 5.4-r
) è mappato a un
versione FCM del kernel (ad esempio, 5). La mappatura è la stessa delle lettere di rilascio
(ad es. R) e FCM (ad es. 5).
I test VTS prevedono che il dispositivo specifichi esplicitamente la versione del kernel FCM nel
manifest del dispositivo, /vendor/etc/vintf/manifest.xml
, se una delle seguenti condizioni è vera:
-
La versione FCM del kernel è diversa dalla versione FCM di destinazione. Ad esempio,
dispositivo sopra menzionato ha una versione FCM di destinazione 4 e la sua versione FCM del kernel è 5 (kernel
suffisso del ramo
r
). -
La versione FCM del kernel è maggiore o uguale a 5 (suffisso del ramo del kernel
r
).
I test VTS applicano che, se viene specificata la versione FCM del kernel, la versione FCM del kernel sia maggiore o uguale alla versione FCM di destinazione nel file manifest del dispositivo.
Esempio: determinare il ramo del kernel
Se il dispositivo ha la versione 4 di FCM target (rilasciata su Android 10), ma
esegue il kernel dal ramo 4.19-r
, il manifest del dispositivo deve specificare quanto segue:
<manifest version="2.0" type="device" target-level="4"> <kernel target-level="5" /> </manifest>
L'oggetto VINTF verifica la compatibilità del kernel in base ai requisiti sul kernel 4.19-r
ramo, specificato nella versione 5 di FCM. Questi requisiti vengono creati
kernel/configs/r/android-4.19
nell'albero delle origini Android.
Esempio: determinare il ramo del kernel per GKI
Se il dispositivo usa la Generic Kernel Image (GKI) e la stringa di release del kernel da
/proc/version
è il seguente:
5.4.42-android12-0-00544-ged21d463f856
Quindi, l'oggetto VINTF ottiene la release Android dalla release del kernel e la utilizza per determinare
la versione FCM del kernel. In questo esempio, android12
indica la versione 6 del kernel FCM
(rilasciata in Android 12).
Per maggiori dettagli su come viene analizzata la stringa di rilascio del kernel, consulta Controllo delle versioni di GKI.
Associa le versioni del kernel
Una matrice può includere più sezioni <kernel>
, ciascuna con
un altro attributo version
utilizzando il formato:
${ver}.${major_rev}.${kernel_minor_rev}
L'oggetto VINTF prende in considerazione solo la sezione <kernel>
dell'oggetto
FCM con versione FCM corrispondente con lo stesso
${ver}
e ${major_rev}
come kernel del dispositivo (ad es.
version="${ver}.${major_rev}.${matrix_minor_rev}")
; altre sezioni
vengono ignorati. Inoltre, la revisione secondaria del kernel deve essere un valore
dalla matrice di compatibilità (${kernel_minor_rev} >=
${matrix_minor_rev}
;). Se nessuna sezione <kernel>
soddisfa
questi requisiti, la mancata corrispondenza.
Esempio: selezionare i requisiti per la corrispondenza
Considera il seguente caso ipotetico in cui gli FCM in /system/etc/vintf
dichiarano
i seguenti requisiti (i tag di intestazione e piè di pagina vengono omessi):
<!-- 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 -->
La versione FCM di destinazione, la versione FCM del kernel e la versione del kernel insieme selezionano il kernel. requisiti delle FCM:
Versione FCM di destinazione | Versione FCM del kernel | Versione kernel | Corrispondenza con |
---|---|---|---|
3 (R) | non specificato | 4.4.106 | Nessuna corrispondenza (versione secondaria non corrispondente) |
3 (R) | non specificato | 4.4.107 | 4.4-p |
3 (R) | non specificato | 4.19.42 | 4.19-q (vedi nota sotto) |
3 (R) | non specificato | 5.4.41 | 5.4-r (vedi nota sotto) |
3 (R) | 3 (R) | 4.4.107 | 4.4-p |
3 (R) | 3 (R) | 4.19.42 | Nessuna corrispondenza (nessun ramo di kernel 4.19-p ) |
3 (R) | 4 (T) | 4.19.42 | 4.19-q |
4 (T) | non specificato | 4.4.107 | Nessuna corrispondenza (nessun ramo di kernel 4.4-q ) |
4 (T) | non specificato | 4.9.165 | 4.9-q |
4 (T) | non specificato | 5.4.41 | 5.4-r (vedi nota sotto) |
4 (T) | 4 (T) | 4.9.165 | 4.9-q |
4 (T) | 4 (T) | 5.4.41 | Nessuna corrispondenza (nessun ramo di kernel 5.4-q ) |
4 (T) | 5 (D) | 4.14.105 | 4.14-r |
4 (T) | 5 (D) | 5.4.41 | 5.4-r |
5 (D) | non specificato | qualsiasi | VTS non riesce (è necessario specificare la versione FCM del kernel per la versione 5 di FCM di destinazione) |
5 (D) | 4 (T) | qualsiasi | VTS non riesce (versione FCM del kernel < versione FCM di destinazione) |
5 (D) | 5 (D) | 4.14.180 | 4.14-r |
Associa configurazioni kernel
Se la sezione <kernel>
corrisponde, la procedura continua
cercando di far corrispondere config
elementi
/proc/config.gz
. Per ogni elemento di configurazione nella compatibilità
osserva /proc/config.gz
per vedere se la configurazione
presenti. Quando un elemento di configurazione è impostato su n
nella compatibilità
per la sezione <kernel>
corrispondente, deve essere assente
da /proc/config.gz
. Infine, un elemento di configurazione non
potrebbe non essere presente in /proc/config.gz
.
Esempio: abbinare le configurazioni del kernel
<value type="string">bar</value>
corrispondenze"bar"
. Le virgolette sono omesse nella matrice di compatibilità, ma sono presenti a/proc/config.gz
.<value type="int">4096</value>
corrispondenze4096
,0x1000
o0X1000
.<value type="int">0x1000</value>
corrispondenze4096
,0x1000
o0X1000
.<value type="int">0X1000</value>
corrispondenze4096
,0x1000
o0X1000
.<value type="tristate">y</value>
corrispondenzey
.<value type="tristate">m</value>
corrispondenzem
.<value type="tristate">n</value>
indica che la configurazione l'elemento NON deve esistere in/proc/config.gz
.<value type="range">1-0x3</value>
corrispondenze1
,2
o3
o equivalente esadecimale.
Esempio: corrispondenza del kernel riuscita
Una matrice di compatibilità del framework con FCM versione 1 contiene le seguenti informazioni kernel:
<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>
Il ramo del kernel viene abbinato per primo. Il ramo del kernel è specificato nel manifest del dispositivo
in manifest.kernel.target-level
, che per impostazione predefinita è manifest.level
se il primo non è specificato. Se il ramo del kernel nel manifest del dispositivo:
- è 1, procede al passaggio successivo e controlla la versione del kernel.
- è 2, nessuna corrispondenza con la matrice. Gli oggetti VINTF leggono i requisiti del kernel dalla matrice FCM versione 2.
Quindi, viene trovata la versione del kernel. Se un dispositivo in uname()
report:
- 4.9.84 (non esiste una corrispondenza con la matrice a meno che non ci sia una sezione del kernel separata con
<kernel version="4.9.x">
, dovex <= 84
) - 4.14.41 (nessuna corrispondenza con la matrice, minore di
version
) - 4.14.42 (corrispondenza con la matrice)
- 4.14.43 (corrispondenza con la matrice)
- 4.1.22 (nessuna corrispondenza con la matrice a meno che non ci sia una sezione del kernel separata
con
<kernel version="4.1.x">
dovex <= 22
)
Dopo aver selezionato la sezione <kernel>
appropriata, per
ogni elemento <config>
con valore diverso da n
,
si aspetta che la voce corrispondente sia presente in /proc/config.gz
;
per ogni articolo <config>
con valore n
, prevediamo
la voce corrispondente non deve essere presente in /proc/config.gz
. Me
si aspetta che i contenuti di <value>
corrispondano esattamente al testo dopo
il segno di uguale (incluse le virgolette), fino al carattere di nuova riga o
#
, con spazi vuoti iniziali e finali troncati.
La seguente configurazione del kernel è un esempio di corrispondenza corretta:
# 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"
La seguente configurazione del kernel è un esempio di corrispondenza non riuscita:
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
Corrispondenza norma SE
La norma SE richiede le seguenti corrispondenze:
<sepolicy-version>
definisce un intervallo chiuso di minori per ogni versione principale. La versione sepolicy segnalata dal dispositivo Deve rientrare in uno di questi intervalli per essere compatibile con il framework. Corrispondenza sono simili a quelle delle versioni HAL; la corrispondenza è se la versione sepolicy sia superiore o uguale alla versione minima dell'intervallo. La versione massima è puramente informativo.<kernel-sepolicy-version>
ovvero la versione del database dei criteri. Deve essere inferiore al valore disecurity_policyvers()
segnalato dal dispositivo.
Esempio: corrispondenza della norma SE riuscita
La matrice di compatibilità del framework riporta le seguenti informazioni di sicurezza:
<sepolicy> <kernel-sepolicy-version>30</kernel-sepolicy-version> <sepolicy-version>25.0</sepolicy-version> <sepolicy-version>26.0-3</sepolicy-version> </sepolicy>
Sul dispositivo:
- Il valore restituito da
security_policyvers()
deve essere maggiore o uguale a 30. Altrimenti non c'è corrispondenza. Ad esempio:- Se un dispositivo restituisce 29, non corrisponde.
- Se un dispositivo restituisce 31, si tratta di una corrispondenza.
- La versione delle policy SE deve essere una tra 25.0-∞ o 26.0-∞. Altrimenti non si tratta di
corrispondono. ("
-3
" dopo "26.0
" è puramente informativa.)
La versione AVB corrisponde
La versione AVB contiene una versione MAJOR e una versione MINOR, con il formato come MAJOR.MINOR (ad es. 1,0, 2,1). Per maggiori dettagli, consulta Controllo delle versioni e compatibilità. La versione AVB ha le seguenti proprietà di sistema:
ro.boot.vbmeta.avb_version
è la versionelibavb
in bootloaderro.boot.avb_version
è la versionelibavb
in Sistema operativo Android (init/fs_mgr
)
La proprietà di sistema viene visualizzata solo quando è stato utilizzato il valore libavb corrispondente per verificare i metadati AVB (e restituisce OK). Non è presente se si verifica un errore di verifica (o non è stata effettuata alcuna verifica).
Una corrispondenza di compatibilità mette a confronto i seguenti elementi:
- sysprop
ro.boot.vbmeta.avb_version
conavb.vbmeta-version
dalla matrice di compatibilità del framework;- .
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
conavb.vbmeta-version
dalla matrice di compatibilità del framework.ro.boot.avb_version.MAJOR == avb.vbmeta-version.MAJOR
ro.boot.avb_version.MINOR >= avb.vbmeta-version.MINOR
Il bootloader o il sistema operativo Android potrebbe contenere due copie di libavb
librerie, ognuna con una versione MAJOR diversa per l'upgrade dei dispositivi e
dispositivi mobili. In questo caso, può essere condivisa la stessa immagine di sistema non firmata, ma
le immagini di sistema firmate finali sono diverse (con
avb.vbmeta-version
):
Figura 1. La versione AVB corrisponde (/system è P, tutte le altre partizioni sono O).
Figura 2. La versione AVB corrisponde (tutte le partizioni sono P).
Esempio: corrispondenza della versione AVB riuscita
La matrice di compatibilità del framework dichiara le seguenti informazioni AVB:
<avb> <vbmeta-version>2.1</vbmeta-version> </avb>
Sul dispositivo:
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
Abbina la versione AVB durante l'aggiornamento OTA
Per i dispositivi lanciati con Android 9 o versioni precedenti, durante l'aggiornamento a Android 10, AVB i requisiti di versione nella matrice di compatibilità del framework vengono confrontati con l'AVB corrente sul dispositivo. Se la versione AVB ha un upgrade della versione principale durante una OTA (ad esempio, da 0,0 a 1,0), il controllo della compatibilità di VINTF in OTA non riflette la compatibilità dopo l'OTA.
Per limitare il problema, un OEM può inserire una versione AVB falsa nel pacchetto OTA
(compatibility.zip
) per superare il controllo. Per farlo:
- Seleziona le seguenti CL nell'albero di origine di Android 9:
- Definisci
BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE
per il dispositivo. Il suo valore deve corrispondere alla versione AVB prima dell'OTA, ovvero la versione AVB del dispositivo quando è stato avviato. - Ricrea il pacchetto OTA.
Queste modifiche vengono applicate automaticamente
BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE
sotto forma di
compatibility-matrix.avb.vbmeta-version
nei seguenti file:
/system/compatibility_matrix.xml
(non utilizzata in Android 9) sul dispositivosystem_matrix.xml
incompatibility.zip
nel pacchetto OTA
Queste modifiche non influiscono su altre matrici di compatibilità del framework, tra cui
/system/etc/vintf/compatibility_matrix.xml
. Dopo l'OTA, il nuovo valore
Per i controlli di compatibilità viene invece utilizzato /system/etc/vintf/compatibility_matrix.xml
.
La versione VNDK corrisponde
La matrice di compatibilità dei dispositivi dichiara la versione VNDK richiesta in
compatibility-matrix.vendor-ndk.version
. Se il dispositivo
la matrice di compatibilità non ha un tag <vendor-ndk>
, no
se vengono imposti requisiti specifici, viene sempre considerata una corrispondenza.
Se la matrice di compatibilità dei dispositivi ha un <vendor-ndk>
tag, una voce <vendor-ndk>
con un valore
Il campo <version>
viene cercato dall'insieme di snapshot dei fornitori VNDK
fornite dal framework nel file manifest del framework. Se una voce di questo tipo
esistono, non c'è corrispondenza.
Se una voce di questo tipo esiste, l'insieme di librerie enumerato nel dispositivo la matrice di compatibilità deve essere un sottoinsieme dell'insieme di librerie indicato nella il manifest del framework; altrimenti la voce non viene considerata una corrispondenza.
- Come caso speciale, se nel dispositivo non sono enumerate librerie matrice di compatibilità, la voce viene sempre considerata una corrispondenza, perché set è un sottoinsieme di qualsiasi insieme.
Esempio: corrispondenza della versione VNDK riuscita
Se la matrice di compatibilità dei dispositivi indica il seguente requisito per VNDK:
<!-- Example Device Compatibility Matrix --> <vendor-ndk> <version>27</version> <library>libjpeg.so</library> <library>libbase.so</library> </vendor-ndk>
Nel manifest del framework viene presa in considerazione solo la voce con la versione 27.
<!-- Framework Manifest Example A --> <vendor-ndk> <version>27</version> <library>libjpeg.so</library> <library>libbase.so</library> <library>libfoo.so</library> </vendor-ndk>
L'esempio A è una corrispondenza, perché VNDK versione 27 è nel file manifest del framework,
e {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>
L'esempio B non corrisponde. Anche se la versione 27 di VNDK è inclusa nel framework
manifest, libjpeg.so
non è supportato dal framework in quanto
senza dover creare uno snapshot. La versione 26 di VNDK viene ignorata.
La versione dell'SDK di sistema corrisponde
La matrice di compatibilità dei dispositivi dichiara un insieme di SDK di sistema necessari
in compatibility-matrix.system-sdk.version
. C'è un
corrispondono solo se l'insieme è un sottoinsieme di versioni dell'SDK di sistema fornite, come dichiarato
in manifest.system-sdk.version
nel file manifest del framework.
- Come caso speciale, se nel dispositivo non sono enumerate versioni dell'SDK di sistema di compatibilità, viene sempre considerata una corrispondenza, perché set è un sottoinsieme di qualsiasi insieme.
Esempio: corrispondenza della versione dell'SDK di sistema riuscita
Se la matrice di compatibilità dei dispositivi indica il seguente requisito sul sistema SDK:
<!-- Example Device Compatibility Matrix --> <system-sdk> <version>26</version> <version>27</version> </system-sdk>
Quindi, il framework deve fornire per la corrispondenza le versioni 26 e 27 dell'SDK di sistema.
<!-- Framework Manifest Example A --> <system-sdk> <version>26</version> <version>27</version> </system-sdk>
L'esempio A è una corrispondenza.
<!-- Framework Manifest Example B --> <system-sdk> <version>26</version> <version>27</version> <version>28</version> </system-sdk>
L'esempio B è una corrispondenza.
<!-- Framework Manifest Example C --> <system-sdk> <version>26</version> </system-sdk>
L'esempio C non corrisponde perché la versione 27 dell'SDK di sistema non è fornita.