Progettazione di istantanee VNDK

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 del sistema e del fornitore sono create da versioni diverse di Android. Per creare uno snapshot VNDK è necessario acquisire le librerie VNDK come snapshot e contrassegnarle con un numero di versione. L'immagine del fornitore può collegarsi a una versione VNDK specifica che fornisce gli ABI richiesti per i moduli nell'immagine del fornitore. Tuttavia, all'interno della stessa versione VNDK, le librerie VNDK devono essere ABI-stabili .

La progettazione dello snapshot VNDK include metodi per generare le pre-costruzioni di uno snapshot VNDK dall'immagine del sistema corrente e installare tali librerie pre-costruite nella partizione di sistema di una versione Android più recente.

Informazioni sulle librerie VNDK

HIDL-HAL , introdotti in Android 8.0, consente 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 che non si trovano in un set VNDK. Di conseguenza, l'immagine del fornitore può essere creata ed eseguita se all'immagine del fornitore vengono forniti i set VNDK corretti sull'immagine del sistema.

Nucleo VNDK

Il set 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 non possono utilizzare queste librerie e devono invece utilizzare le librerie installate in /system/lib[64] . A causa della rigida restrizione dello spazio dei nomi per ciascun processo, le librerie VNDK-core sono al sicuro dal doppio caricamento.

Per includere una libreria in VNDK-core, aggiungi quanto segue ad Android.bp :

vendor_available: true,
vndk: {
    enabled: true,
},

VNDK-SP

Le librerie VNDK-SP sono 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 a doppio caricamento.

Per includere una libreria in VNDK-SP, aggiungi quanto segue ad 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 del fornitore possono utilizzare le 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 stabili ABI per consentire alle vecchie versioni dei moduli del fornitore di utilizzare le nuove versioni delle librerie LL-NDK. A causa delle caratteristiche di stabilità ABI di LL-NDK, non è necessario che lo snapshot VNDK includa le librerie LL-NDK per le immagini dei vecchi fornitori.

Informazioni sugli snapshot VNDK

Android 8.1 includeva librerie VNDK create dal codice sorgente . Tuttavia, per le versioni successive di Android, ciascuna versione VNDK deve essere acquisita come istantanea e fornita come precompilazione per consentire 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. In fase di creazione, gli snapshot richiesti verranno installati in /system/lib[64]/vndk-${VER} e /system/lib[64]/vndk-sp-${VER} (directory che possono essere utilizzate dal fornitore partizione), dove ${VER} è la variabile stringa che rappresenta il nome della versione dello snapshot VNDK.

Poiché le librerie di snapshot VNDK possono differire per ciascuna versione di 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: aggiornamento delle immagini del sistema e del fornitore

Non è richiesta alcuna istantanea; costruire senza configurazioni aggiuntive per gli snapshot VNDK.

Esempio: aggiornamento solo dell'immagine del 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 vengono configurati automaticamente per cercare le librerie VNDK in /system/lib[64]/vndk-${VER} e /system/lib[64]/vndk-sp-${VER} .

Figura 1. Solo sistema di aggiornamento

Esempio: aggiornamento dell'immagine del sistema, modifica minore dell'immagine del fornitore

La creazione di un'immagine del fornitore rispetto a uno snapshot VNDK non è ancora supportata, pertanto è necessario creare l'immagine del fornitore separatamente con il codice sorgente originale, quindi aggiornare l'immagine del sistema come descritto nell'esempio precedente.

Architettura degli snapshot VNDK

Per rendere un'immagine del sistema Android 9 compatibile con un'immagine del fornitore Android 8.1, lo snapshot VNDK che corrisponde all'immagine del fornitore Android 8.1 deve essere fornito con l'immagine del sistema Android 9, come mostrato di seguito:

Figura 2. Architettura degli snapshot VNDK

La progettazione dello snapshot VNDK include i seguenti metodi:

  • Generazione di uno snapshot per le librerie VNDK-core e VNDK-SP . Android 9 include uno script che puoi utilizzare per creare un'istantanea dell'attuale build VNDK. Questo script raggruppa tutte le librerie in /system/lib[64]/vndk-28 e /system/lib[64]/vndk-sp-28 che sono state create con l'origine corrente come snapshot VNDK, dove 28 è 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 predefinite da uno snapshot . In Android 9, uno snapshot VNDK ha un set di librerie VNDK-core predefinite e un set di librerie VNDK-SP, nonché file di configurazione dello spazio dei nomi del linker. Quando fornisci un elenco di versioni di snapshot VNDK da installare, in fase di compilazione, l'immagine di sistema installa le librerie di snapshot VNDK su /system/lib[64]/vndk-${VER} e /system/lib[64]/vndk-sp-${VER} directory /system/lib[64]/vndk-sp-${VER} e file di configurazione dello spazio dei nomi del linker per gli snapshot VNDK nella directory /etc .

Controllo delle versioni VNDK

Ogni versione Android ha un solo snapshot VNDK e la versione 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 corretta quando viene rilasciata la versione Android. La versione VNDK utilizzata dalla partizione del fornitore viene archiviata automaticamente nella proprietà ro.vndk.version , che può essere letta in fase di runtime. Questa versione viene quindi utilizzata per identificare la versione VNDK del fornitore per alcune librerie e identificare la versione dello snapshot VNDK per la configurazione dello spazio dei nomi.

Creazione di 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 BOARD_VNDK_VERSION := current è impostato, queste librerie vengono create con il comando make .

Poiché questa build non installa le librerie VNDK dallo snapshot, le librerie VNDK installate non sono stabili ABI. Tuttavia, quando viene rilasciata una versione Android, l'ABI per la versione VNDK corrente viene fissata. A questo punto, qualsiasi interruzione dell'ABI è un errore di compilazione, quindi le patch alla versione Android non devono modificare l'ABI per le librerie VNDK.