VNDK-Snapshot-Design

VNDK-Snapshots können von einem System-Image verwendet werden, um Anbieter-Images die richtigen VNDK-Bibliotheken zur Verfügung zu stellen, auch wenn System- und Anbieter-Images aus verschiedenen 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 die erforderlichen ABIs für die Module im Anbieter-Image bereitstellt. Innerhalb derselben VNDK-Version müssen die VNDK-Bibliotheken jedoch ABI-stabil sein.

Das VNDK-Snapshot-Design umfasst Methoden zum Erstellen der Vorabversionen eines VNDK-Snapshots aus dem aktuellen System-Image und zum Installieren dieser vorgefertigten ‑Libs in der Systempartition einer neueren Android-Version.

VNDK-Bibliotheken

HIDL-HALs, die in Android 8.0 eingeführt wurden, ermöglichen separate Upgrades für System- und Anbieterpartitionen. VNDK definiert Bibliothekssätze (VNDK-Core, VNDK-SP und LL-NDK), mit denen Anbietercode verknüpft werden kann. Außerdem wird Anbietern die Verwendung von Bibliotheken blockiert, die nicht zu einem VNDK-Satz gehören. Das Anbieter-Image kann also erstellt und ausgeführt werden, wenn dem Anbieter-Image die richtigen VNDK-Sets aus dem System-Image bereitgestellt werden.

VNDK-Core

Die VNDK-Core-Bibliotheken werden in /system/lib[64]/vndk-${VER} installiert und sind nur für Anbieterprozesse mit der API-Ebene ${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 Namespacebeschränkung für jeden Prozess sind die VNDK-Core-Bibliotheken vor doppeltem Laden geschützt.

Wenn Sie eine Bibliothek in VNDK-Core einbinden möchten, fügen Sie Android.bp Folgendes hinzu:

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

VNDK-SP

VNDK-SP-Bibliotheken werden in /system/lib[64]/vndk-sp-${VER} installiert und sind für Anbieter- und Systemprozesse verfügbar (über die SP-HAL-Bibliotheken, die in der Anbieterpartition installiert sind). VNDK-SP-Bibliotheken können doppelt geladen werden.

Wenn Sie eine Bibliothek in VNDK-SP einbinden möchten, fügen Sie Android.bp Folgendes hinzu:

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

LL-NDK

LL-NDK-Bibliotheken werden in /system/lib[64] installiert. Anbietermodule können LL-NDK-Stub-Bibliotheken verwenden, um auf vordefinierte 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 des LL-NDK müssen im VNDK-Snapshot keine LL-NDK-Bibliotheken für alte Anbieter-Images enthalten sein.

VNDK-Snapshots

Android 8.1 enthielt VNDK-Bibliotheken, die aus dem Quellcode erstellt wurden. Bei neueren Android-Versionen muss jedoch jede VNDK-Version als Snapshot erfasst und als Pre-Build bereitgestellt werden, damit eine Verknüpfung mit einem älteren Anbieter-Image möglich ist.

Ab Android 9 enthalten neue Android-Versionen mindestens einen Snapshot der VNDK-Core- und VNDK-SP-Verzeichnisse für ältere Versionen im Android-Quellcode. Bei der Build-Erstellung werden die erforderlichen Snapshots in /system/lib[64]/vndk-${VER} und /system/lib[64]/vndk-sp-${VER} installiert (Verzeichnisse, die von der Anbieterpartition verwendet werden können). Dabei ist ${VER} die Stringvariable, die den Versionsnamen des VNDK-Snapshots darstellt.

Da sich die VNDK-Snapshot-Bibliotheken für jede VNDK-Version unterscheiden können, enthält der VNDK-Snapshot auch die Linker-Namespacekonfigurationen, die als etc/ld.config.${VER}.txt, /etc/llndk.libraries.${VER}.txt und /etc/vndksp.libraries.${VER}.txt installiert werden.

Beispiel: System- und Anbieter-Images aktualisieren

Kein Snapshot erforderlich; Build ohne zusätzliche Konfigurationen für VNDK-Snapshots.

Beispiel: Nur System-Image aktualisieren

Muss die VNDK-Snapshot- und Linker-Namespace-Konfigurationsdateien für das Anbieter-Image im System-Image enthalten. Die Konfigurationsdateien des Linker-Namespace sind automatisch so konfiguriert, dass in /system/lib[64]/vndk-${VER} und /system/lib[64]/vndk-sp-${VER} nach VNDK-Bibliotheken gesucht wird.

Abbildung 1. Nur System aktualisieren

Beispiel: System-Image-Upgrade, geringfügige Änderung des Anbieter-Images

Das Erstellen eines Anbieter-Images auf Grundlage eines VNDK-Snapshots wird noch nicht unterstützt. Sie müssen das Anbieter-Image daher separat mit dem ursprünglichen Quellcode erstellen und dann das System-Image wie im vorherigen Beispiel beschrieben aktualisieren.

VNDK-Snapshot-Architektur

Damit ein Android 9-System-Image mit einem Android 8.1-Anbieter-Image kompatibel ist, muss der VNDK-Snapshot, der dem Android 8.1-Anbieter-Image entspricht, mit dem Android 9-System-Image bereitgestellt werden, wie unten dargestellt:

Abbildung 2. VNDK-Snapshot-Architektur

Das VNDK-Snapshot-Design umfasst die folgenden Methoden:

  • Snapshot für VNDK-Core- und VNDK-SP-Bibliotheken generieren Android 9 enthält ein Script, mit dem Sie einen Snapshot der aktuellen VNDK-Build erstellen können. Dieses Script bündelt alle Bibliotheken in /system/lib[64]/vndk-28 und /system/lib[64]/vndk-sp-28, die mit der aktuellen Quelle als VNDK-Snapshot erstellt wurden. Dabei ist 28 die VNDK-Version von Android 9. Der Snapshot enthält auch die Konfigurationsdateien für den Linker-Namespace /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.
  • Vorab erstellte VNDK-Core- und VNDK-SP-Bibliotheken aus einem Snapshot installieren In Android 9 enthält ein VNDK-Snapshot eine Reihe vorgefertigter VNDK-Core-Bibliotheken und VNDK-SP-Bibliotheken sowie Konfigurationsdateien für den Linker-Namespace. Wenn Sie eine Liste der zu installierenden VNDK-Snapshot-Versionen angeben, werden beim Build die VNDK-Snapshot-Bibliotheken im Verzeichnis /system/lib[64]/vndk-${VER} und die /system/lib[64]/vndk-sp-${VER}-Verzeichnisse sowie die Namespace-Konfigurationsdateien des Linker für diese VNDK-Snapshots im Verzeichnis /etc installiert.

VNDK-Versionierung

Jede Android-Version hat nur einen VNDK-Snapshot und die SDK-Version wird als VNDK-Version verwendet. Das bedeutet, dass die VNDK-Version eine Ganzzahl ist, z. B. 27 für Android 8.1. Die VNDK-Version ist festgelegt, wenn die Android-Version veröffentlicht wird. Die von der Anbieterpartition verwendete VNDK-Version wird automatisch im Attribut ro.vndk.version gespeichert, das zur Laufzeit gelesen werden kann. Diese Version wird dann verwendet, um die VNDK-Version des Anbieters für einige Bibliotheken und die VNDK-Snapshot-Version für die Namespacekonfiguration zu identifizieren.

VNDK-Bibliotheken erstellen

Mit dem Befehl make vndk werden Bibliotheken mit vndk: { enabled: true, … } erstellt, einschließlich Abhängigkeiten und Namespace-Konfigurationsdateien. Wenn BOARD_VNDK_VERSION := current festgelegt ist, werden diese Bibliotheken mit dem Befehl make erstellt.

Da bei diesem Build die VNDK-Bibliotheken nicht aus dem Snapshot installiert werden, sind die installierten VNDK-Bibliotheken nicht ABI-stabil. Wenn jedoch eine Android-Version veröffentlicht wird, ist das ABI für die aktuelle VNDK-Version festgelegt. Derzeit gilt jede ABI-Unterbrechung als Buildfehler. Daher darf das ABI für VNDK-Bibliotheken durch Patches für die Android-Version nicht geändert werden.