VNDK-Snapshot-Design

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.

Abbildung 1. Nur System-Upgrade

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:

Abbildung 2. VNDK-Snapshot-Architektur

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, wobei 28 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.