VNDK-Snapshots können von einem System-Image verwendet werden, um Anbieter-Images die richtigen VNDK-Bibliotheken bereitzustellen, selbst wenn System- und Anbieter-Images aus unterschiedlichen Android-Versionen erstellt werden. Zum Erstellen eines VNDK-Snapshots müssen VNDK-Bibliotheken als Snapshot erfasst und mit einer Versionsnummer gekennzeichnet werden. Das Anbieter-Image kann mit einer bestimmten VNDK-Version verknüpft sein, die erforderliche ABIs für die Module im Anbieter-Image bereitstellt. Allerdings müssen die VNDK-Bibliotheken innerhalb derselben VNDK-Version ABI-stabil sein.
Das VNDK-Snapshot-Design umfasst Methoden zum Generieren der vorgefertigten VNDK-Snapshots aus dem aktuellen Systemabbild und zum Installieren dieser vorgefertigten Bibliotheken auf der Systempartition einer neueren Android-Version.
Über VNDK-Bibliotheken
HIDL-HALs , eingeführt in Android 8.0, ermöglichen separate Upgrades für System- und Herstellerpartitionen. VNDK definiert Sätze von Bibliotheken (VNDK-Core, VNDK-SP und LL-NDK), mit denen Anbietercode eine Verknüpfung herstellen kann, und verhindert, dass Anbieter Bibliotheken verwenden, die nicht in einem VNDK-Satz enthalten sind. Infolgedessen kann das Anbieter-Image erstellt und ausgeführt werden, wenn dem Anbieter-Image die richtigen VNDK-Sets auf dem System-Image bereitgestellt werden.
VNDK-Kern
Der VNDK-Kernsatz von Bibliotheken wird in /system/lib[64]/vndk-${VER}
installiert und ist nur für Anbieterprozesse mit der API-Ebene gleich ${VER}
verfügbar. Systemprozesse dürfen diese Bibliotheken nicht verwenden und müssen stattdessen die in /system/lib[64]
installierten Bibliotheken verwenden. Aufgrund der strengen Namespace-Beschränkung für jeden Prozess sind die VNDK-Kernbibliotheken vor doppeltem Laden geschützt.
Um eine Bibliothek in VNDK-core einzuschließen, fügen Sie Folgendes zu Android.bp
hinzu:
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
VNDK-SP-Bibliotheken werden in /system/lib[64]/vndk-sp-${VER}
installiert und stehen Anbieterprozessen und Systemprozessen zur Verfügung (über die in der Anbieterpartition installierten SP-HAL-Bibliotheken). VNDK-SP-Bibliotheken können doppelt geladen werden.
Um eine Bibliothek in VNDK-SP einzubinden, fügen Sie Folgendes zu Android.bp
hinzu:
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
LL-NDK-Bibliotheken werden in /system/lib[64]
installiert. Herstellermodule können LL-NDK-Stub-Bibliotheken verwenden, um auf vorab ausgewählte Symbole von LL-NDK-Bibliotheken zuzugreifen. LL-NDK-Bibliotheken müssen abwärtskompatibel und ABI-stabil sein, damit alte Versionen von Anbietermodulen neue Versionen von LL-NDK-Bibliotheken verwenden können. Aufgrund der ABI-stabilen Eigenschaften von LL-NDK muss der VNDK-Snapshot keine LL-NDK-Bibliotheken für alte Anbieter-Images enthalten.
Über VNDK-Snapshots
Android 8.1 enthielt VNDK-Bibliotheken, die aus dem Quellcode erstellt wurden . Für spätere Android-Versionen muss jedoch jede VNDK-Version als Snapshot erfasst und als Pre-Build bereitgestellt werden, um die Verknüpfung mit einem Image eines älteren Anbieters zu ermöglichen.
Ab Android 9 enthalten neue Android-Versionen mindestens einen Snapshot der VNDK-Core- und VNDK-SP-Verzeichnisse für ältere Versionen im Android-Quellcode. Zur Erstellungszeit werden erforderliche Snapshots in /system/lib[64]/vndk-${VER}
und /system/lib[64]/vndk-sp-${VER}
installiert (Verzeichnisse, die vom Anbieter verwendet werden können). Partition), wobei ${VER}
die Zeichenfolgenvariable ist, die den Versionsnamen des VNDK-Snapshots darstellt.
Da die VNDK-Snapshot-Bibliotheken für jede VNDK-Version unterschiedlich sein können, enthält der VNDK-Snapshot auch die Linker-Namespace-Konfigurationen, installiert als etc/ld.config.${VER}.txt
, /etc/llndk.libraries.${VER}.txt
und /etc/vndksp.libraries.${VER}.txt
.
Beispiel: System- und Anbieter-Images aktualisieren
Kein Snapshot erforderlich; Build ohne zusätzliche Konfigurationen für VNDK-Snapshots.
Beispiel: Nur System-Image aktualisieren
Die VNDK-Snapshot- und Linker-Namespace-Konfigurationsdateien für das Anbieter-Image müssen im System-Image enthalten sein. Die Linker-Namespace-Konfigurationsdateien werden automatisch für die Suche nach VNDK-Bibliotheken in /system/lib[64]/vndk-${VER}
und /system/lib[64]/vndk-sp-${VER}
konfiguriert.
![](https://source.android.com/static/docs/core/architecture/images/vndk_snapshot_system_only.png?authuser=6&hl=de)
Beispiel: Aktualisierung des System-Images, geringfügige Änderung des Anbieter-Images
Das Erstellen eines Anbieter-Images anhand eines VNDK-Snapshots wird noch nicht unterstützt. Daher müssen Sie das Anbieter-Image separat mit seinem ursprünglichen Quellcode erstellen und dann das System-Image wie im vorherigen Beispiel beschrieben aktualisieren.
VNDK-Snapshot-Architektur
Um ein Android 9-System-Image mit einem Android 8.1-Anbieter-Image kompatibel zu machen, muss der VNDK-Snapshot, der mit dem Android 8.1-Anbieter-Image übereinstimmt, mit dem Android 9-System-Image bereitgestellt werden, wie unten gezeigt:
![](https://source.android.com/static/docs/core/architecture/images/vndk_snapshot_arch.png?authuser=6&hl=de)
Das VNDK-Snapshot-Design umfasst die folgenden Methoden:
- Generieren eines Snapshots für VNDK-Core- und VNDK-SP-Bibliotheken . Android 9 enthält ein Skript, mit dem Sie einen Snapshot des aktuellen VNDK-Builds erstellen können. Dieses Skript bündelt alle Bibliotheken in
/system/lib[64]/vndk-28
und/system/lib[64]/vndk-sp-28
, die mit der aktuellen Quelle erstellt wurden, als VNDK-Snapshot, wobei28
die VNDK-Version von ist Android 9. Der Snapshot enthält auch die Linker-Namespace-Konfigurationsdateien/etc/ld.config.28.txt
,/etc/llndk.libraries.28.txt
und/etc/vndksp.libraries.28.txt
. Der generierte Snapshot wird mit neueren Android-Versionen (höher als Android 9) verwendet. - Installieren vorgefertigter VNDK-Core- und VNDK-SP-Bibliotheken aus einem Snapshot . In Android 9 verfügt ein VNDK-Snapshot über eine Reihe vorgefertigter VNDK-Kernbibliotheken und eine Reihe von VNDK-SP-Bibliotheken sowie Linker-Namespace-Konfigurationsdateien. Wenn Sie eine Liste der zu installierenden VNDK-Snapshot-Versionen bereitstellen, installiert das System-Image zur Build-Zeit die VNDK-Snapshot-Bibliotheken in
/system/lib[64]/vndk-${VER}
und/system/lib[64]/vndk-sp-${VER}
-Verzeichnisse und Linker-Namespace-Konfigurationsdateien für diese VNDK-Snapshots im Verzeichnis/etc
.
VNDK-Versionierung
Jede Android-Version verfügt nur über einen VNDK-Snapshot und die SDK-Version wird als VNDK-Version verwendet (was bedeutet, dass die VNDK-Version eine Ganzzahl hat, z. B. 27 für Android 8.1). Die VNDK-Version wird behoben, wenn die Android-Version veröffentlicht wird. Die von der Herstellerpartition verwendete VNDK-Version wird automatisch in der Eigenschaft ro.vndk.version
gespeichert, die zur Laufzeit gelesen werden kann. Diese Version wird dann zur Identifizierung der VNDK-Version des Anbieters für einige Bibliotheken und zur Identifizierung der VNDK-Snapshot-Version für die Namespace-Konfiguration verwendet.
Erstellen von VNDK-Bibliotheken
Der Befehl make vndk
erstellt Bibliotheken mit vndk: { enabled: true, … }
, einschließlich Abhängigkeiten und Namespace-Konfigurationsdateien. Wenn BOARD_VNDK_VERSION := current
gesetzt ist, werden diese Bibliotheken mit dem Befehl make
erstellt.
Da dieser Build die VNDK-Bibliotheken nicht aus dem Snapshot installiert, sind die installierten VNDK-Bibliotheken nicht ABI-stabil. Wenn jedoch eine Android-Version veröffentlicht wird, wird der ABI für die aktuelle VNDK-Version festgelegt. Zu diesem Zeitpunkt stellt jeder ABI-Fehler einen Build-Fehler dar, daher dürfen Patches für die Android-Version die ABI für VNDK-Bibliotheken nicht ändern.