Gli snapshot VNDK possono essere utilizzati da un'immagine di sistema per fornire le librerie VNDK corrette alle immagini del fornitore anche quando le immagini di sistema e del fornitore vengono create da versioni diverse di Android. La creazione di uno snapshot VNDK richiede di acquisire le librerie VNDK come snapshot e di contrassegnarle con un numero di versione. L'immagine del fornitore può essere collegata a una versione specifica di VNDK che fornisce le ABI richieste per i moduli nell'immagine del fornitore. Tuttavia, all'interno della stessa versione VNDK, le librerie VNDK devono essere ABI-stable.
La progettazione degli snapshot VNDK include metodi per generare le pre-build di uno snapshot VNDK dall'immagine di sistema corrente e installare queste librerie precompilate nella partizione di sistema di una versione più recente di Android.
Informazioni sulle librerie VNDK
Le HAL HIDL, introdotte in Android 8.0, consentono aggiornamenti separati per le partizioni di sistema e del fornitore. VNDK definisce insiemi di librerie (VNDK-core, VNDK-SP e LL-NDK) a cui il codice del fornitore può collegarsi e impedisce ai fornitori di utilizzare librerie non presenti in un insieme VNDK. Di conseguenza, l'immagine del fornitore può essere compilata ed eseguita se all'immagine del fornitore vengono forniti gli insiemi VNDK appropriati sull'immagine di sistema.
VNDK-core
L'insieme di librerie VNDK-core è installato in
/system/lib[64]/vndk-${VER}
ed è disponibile
solo per i processi del fornitore con il livello API uguale a
${VER}
. I processi di sistema potrebbero non utilizzare queste librerie e devono invece utilizzare le librerie installate in /system/lib[64]
. A causa della rigida limitazione dello spazio dei nomi per ogni processo, le librerie VNDK-core sono al sicuro dal doppio caricamento.
Per includere una libreria in VNDK-core, aggiungi quanto segue a
Android.bp
:
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
Le librerie VNDK-SP vengono installate in /system/lib[64]/vndk-sp-${VER}
e sono disponibili per i processi del fornitore e i processi di sistema (tramite le librerie SP-HAL
installate nella partizione del fornitore). Le librerie VNDK-SP possono essere caricate in modo duale.
Per includere una libreria in VNDK-SP, aggiungi quanto segue a Android.bp
:
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
Le librerie LL-NDK sono installate in /system/lib[64]
. I moduli dei fornitori possono utilizzare librerie stub LL-NDK per accedere ai simboli preselezionati delle librerie LL-NDK. Le librerie LL-NDK devono essere compatibili con le versioni precedenti e avere ABI stabili per consentire alle versioni precedenti dei moduli del fornitore di utilizzare le nuove versioni delle librerie LL-NDK.
A causa delle caratteristiche ABI-stable di LL-NDK, lo snapshot VNDK non deve includere le librerie LL-NDK per le vecchie immagini del fornitore.
Informazioni sugli snapshot VNDK
Android 8.1 includeva librerie VNDK compilate dal codice sorgente. Tuttavia, per le versioni successive di Android, ogni versione VNDK deve essere acquisita come snapshot e fornita come pre-build per abilitare il collegamento a un'immagine del fornitore precedente.
A partire da Android 9, le nuove versioni di Android includeranno almeno uno snapshot delle directory VNDK-core e VNDK-SP per le versioni precedenti nel codice sorgente di Android. Al momento della compilazione, gli snapshot richiesti verranno installati in /system/lib[64]/vndk-${VER}
e /system/lib[64]/vndk-sp-${VER}
(directory che possono essere utilizzate dalla partizione del fornitore), dove ${VER}
è la variabile di stringa che rappresenta il nome della versione dello snapshot VNDK.
Poiché le librerie di snapshot VNDK possono variare per ogni versione VNDK, lo snapshot VNDK include anche le configurazioni dello spazio dei nomi del linker, installate come etc/ld.config.${VER}.txt
, /etc/llndk.libraries.${VER}.txt
e /etc/vndksp.libraries.${VER}.txt
.
Esempio: esegui l'upgrade delle immagini del sistema e del fornitore
Non è richiesto alcun snapshot; esegui la compilazione senza configurazioni aggiuntive per gli snapshot VNDK.
Esempio: esegui l'upgrade solo dell'immagine di sistema
Deve includere lo snapshot VNDK e i file di configurazione dello spazio dei nomi del linker per
l'immagine del fornitore nell'immagine di sistema. I file di configurazione dello spazio dei nomi del linker
sono configurati automaticamente per cercare le librerie VNDK in
/system/lib[64]/vndk-${VER}
e
/system/lib[64]/vndk-sp-${VER}
.

Esempio: upgrade dell'immagine di sistema, modifica minore dell'immagine del fornitore
La creazione di un'immagine del fornitore in base a uno snapshot VNDK non è ancora supportata, pertanto devi creare l'immagine del fornitore separatamente con il codice sorgente originale, quindi eseguire l'upgrade dell'immagine di sistema come descritto nell'esempio precedente.
Architettura degli snapshot VNDK
Per rendere un'immagine di sistema Android 9 compatibile con un'immagine del fornitore Android 8.1, lo snapshot VNDK corrispondente all'immagine del fornitore Android 8.1 deve essere fornito con l'immagine di sistema Android 9, come mostrato di seguito:

Il design degli snapshot VNDK include i seguenti metodi:
- Generare uno snapshot per le librerie VNDK-core e VNDK-SP. Android 9 include uno script che puoi utilizzare per creare uno snapshot della build VNDK corrente. Questo script raggruppa tutte le librerie in
/system/lib[64]/vndk-28
e/system/lib[64]/vndk-sp-28
compilate con il codice sorgente corrente come snapshot VNDK, dove28
è la versione VNDK di Android 9. Lo snapshot include anche i file di configurazione dello spazio dei nomi del linker/etc/ld.config.28.txt
,/etc/llndk.libraries.28.txt
e/etc/vndksp.libraries.28.txt
. Lo snapshot generato verrà utilizzato con le versioni Android più recenti (superiori ad Android 9). - Installazione delle librerie VNDK-core e VNDK-SP precompilate da uno snapshot. In Android 9, uno snapshot VNDK contiene un insieme di librerie VNDK-core precompilate e un insieme di librerie VNDK-SP, nonché file di configurazione dello spazio dei nomi del linker. Quando fornisci un elenco di versioni degli snapshot VNDK da installare, in fase di compilazione l'immagine di sistema installa le librerie degli snapshot VNDK in
/system/lib[64]/vndk-${VER}
e le directory/system/lib[64]/vndk-sp-${VER}
e i file di configurazione del namespace del linker per gli snapshot VNDK nella directory/etc
.
Versionamento VNDK
Ogni release di Android ha un solo snapshot VNDK e la versione dell'SDK viene utilizzata come versione VNDK (il che significa che la versione VNDK ha un numero intero, ad esempio 27 per Android 8.1). La versione VNDK viene fissata quando viene rilasciata la versione di Android. La versione VNDK utilizzata dalla partizione del fornitore viene memorizzata automaticamente nella proprietà ro.vndk.version
, che può essere letta in fase di esecuzione. Questa versione viene poi utilizzata per identificare la versione VNDK del fornitore per alcune librerie e la versione dello snapshot VNDK per la configurazione dello spazio dei nomi.
Creare librerie VNDK
Il comando make vndk
crea librerie che hanno vndk:
{ enabled: true, … }
, incluse le dipendenze e i file di configurazione dello spazio dei nomi. Se è impostato BOARD_VNDK_VERSION := current
,
queste librerie vengono create con il comando make
.
Poiché questa build non installa le librerie VNDK dallo snapshot, le librerie VNDK installate non sono ABI-stable. Tuttavia, quando viene rilasciata una versione di Android, l'ABI per la versione VNDK corrente viene fissato. A questo punto, qualsiasi interruzione dell'ABI è un errore di compilazione, pertanto le patch alla versione Android non devono modificare l'ABI per le librerie VNDK.