Übersicht über das Vendor Native Development Kit (VNDK).

Das Vendor Native Development Kit (VNDK) ist eine Reihe von Bibliotheken, die von anderen Bibliotheken oder Binärdateien in der Hersteller- oder Produktpartition zur Laufzeit für dlopen verwendet werden.

Warum VNDK?

AOSP ermöglicht nur Framework-Updates, bei denen die Systempartition auf die neueste Framework-Version aktualisiert werden kann, während die Herstellerpartition unverändert bleibt. Obwohl die Binärdateien in jeder Partition zu unterschiedlichen Zeitpunkten erstellt wurden, müssen sie miteinander zusammenarbeiten können.

Nur-Framework-Updates beinhalten die folgenden Herausforderungen:

  • Abhängigkeit zwischen Framework-Modulen und Anbietermodulen . Vor Android 8.0 konnten Module in der Hersteller- und Systempartition miteinander verknüpft werden. Allerdings führten Abhängigkeiten von Anbietermodulen zu unerwünschten Einschränkungen bei der Entwicklung von Framework-Modulen.
  • Erweiterungen für AOSP-Bibliotheken . Android erfordert, dass alle Android-Geräte CTS bestehen, wenn die Systempartition durch ein standardmäßiges Generic System Image (GSI) ersetzt wird. Da Anbieter jedoch AOSP-Bibliotheken erweitern, um die Leistung zu steigern oder zusätzliche Funktionen für ihre HIDL-Implementierungen hinzuzufügen, kann das Flashen der Systempartition mit einem Standard-GSI die HIDL-Implementierung eines Anbieters beschädigen. Richtlinien zum Verhindern solcher Brüche finden Sie unter VNDK-Erweiterungen .

Um diese Herausforderungen zu bewältigen, enthält Android mehrere Funktionen wie VNDK (in diesem Abschnitt beschrieben), HIDL , Hwbinder, Device Tree Overlay und Sepolicy Overlay.

VNDK-spezifische Bedingungen

VNDK-bezogene Dokumente verwenden die folgende Terminologie:
  • Module beziehen sich entweder auf gemeinsam genutzte Bibliotheken oder auf ausführbare Dateien. Module machen Abhängigkeiten zur Buildzeit.
  • Prozesse sind Betriebssystemaufgaben, die aus ausführbaren Dateien hervorgehen. Prozesse erzeugen Laufzeitabhängigkeiten.
  • Framework -qualifizierte Begriffe beziehen sich auf die system :
    • Ausführbare Framework-Dateien beziehen sich auf ausführbare Dateien in /system/bin oder /system/xbin .
    • Gemeinsam genutzte Framework-Bibliotheken beziehen sich auf gemeinsam genutzte Bibliotheken unter /system/lib[64] .
    • Framework-Module beziehen sich sowohl auf gemeinsam genutzte Framework-Bibliotheken als auch auf ausführbare Framework-Dateien.
    • Framework-Prozesse sind Prozesse, die aus ausführbaren Framework-Dateien wie /system/bin/app_process hervorgehen.
  • Anbieterqualifizierte Begriffe beziehen sich auf vendor :
    • Ausführbare Dateien des Anbieters beziehen sich auf ausführbare Dateien in /vendor/bin
    • Gemeinsam genutzte Bibliotheken des Anbieters beziehen sich auf gemeinsam genutzte Bibliotheken unter /vendor/lib[64] .
    • Anbietermodule beziehen sich sowohl auf ausführbare Dateien des Anbieters als auch auf gemeinsam genutzte Bibliotheken des Anbieters.
    • Vendor-Prozesse sind Prozesse, die aus ausführbaren Vendor-Dateien hervorgegangen sind, z. B. /vendor/bin/android.hardware.camera.provider@2.4-service .

VNDK-Konzepte

In einer idealen Welt mit Android 8.0 und höher laden Framework-Prozesse keine gemeinsam genutzten Bibliotheken des Anbieters, alle Anbieterprozesse laden nur gemeinsam genutzte Bibliotheken des Anbieters (und einen Teil der gemeinsam genutzten Framework-Bibliotheken) und die Kommunikation zwischen Framework-Prozessen und Anbieterprozessen wird durch HIDL und Hardware gesteuert Bindemittel.

In einer solchen Welt besteht die Möglichkeit, dass stabile, öffentliche APIs aus gemeinsam genutzten Framework-Bibliotheken für Entwickler von Anbietermodulen möglicherweise nicht ausreichen (obwohl sich APIs zwischen Android-Versionen ändern können), was erfordert, dass einige Teile der gemeinsam genutzten Framework-Bibliotheken für Anbieterprozesse zugänglich sein müssen. Da zudem Leistungsanforderungen zu Kompromissen führen können, müssen einige reaktionszeitkritische HALs unterschiedlich behandelt werden.

In den folgenden Abschnitten wird detailliert beschrieben, wie VNDK mit gemeinsam genutzten Framework-Bibliotheken für Anbieter und Same-Process-HALs (SP-HALs) umgeht.

Gemeinsam genutzte Framework-Bibliotheken für Anbieter

In diesem Abschnitt werden die Kriterien für die Klassifizierung gemeinsam genutzter Bibliotheken beschrieben, auf die Anbieterprozesse zugreifen können. Es gibt zwei Ansätze zur Unterstützung von Anbietermodulen über mehrere Android-Versionen hinweg:

  1. Stabilisieren Sie die ABIs/APIs der gemeinsam genutzten Framework-Bibliotheken . Neue Framework-Module und alte Anbietermodule können dieselbe gemeinsam genutzte Bibliothek verwenden, um den Speicherbedarf und die Speichergröße zu reduzieren. Eine einzigartige gemeinsam genutzte Bibliothek vermeidet außerdem mehrere Probleme beim doppelten Laden. Allerdings sind die Entwicklungskosten für die Aufrechterhaltung stabiler ABIs/APIs hoch und es ist unrealistisch, alle ABIs/APIs zu stabilisieren, die von jeder gemeinsam genutzten Framework-Bibliothek exportiert werden.
  2. Kopieren Sie alte gemeinsam genutzte Framework-Bibliotheken . Kommt mit der starken Einschränkung gegenüber Seitenkanälen, definiert als alle Mechanismen zur Kommunikation zwischen Framework-Modulen und Anbietermodulen, einschließlich (aber nicht beschränkt auf) Binder, Socket, Pipe, gemeinsam genutzter Speicher, gemeinsam genutzte Dateien und Systemeigenschaften. Es darf keine Kommunikation stattfinden, es sei denn, das Kommunikationsprotokoll ist eingefroren und stabil (z. B. HIDL über hwbinder). Das doppelte Laden gemeinsam genutzter Bibliotheken kann ebenfalls zu Problemen führen. Wenn beispielsweise ein von der neuen Bibliothek erstelltes Objekt an die Funktionen der alten Bibliothek übergeben wird, kann ein Fehler auftreten, da diese Bibliotheken das Objekt möglicherweise unterschiedlich interpretieren.

Abhängig von den Eigenschaften der gemeinsam genutzten Bibliotheken werden unterschiedliche Ansätze verwendet. Daher werden gemeinsam genutzte Framework-Bibliotheken in drei Unterkategorien eingeteilt:

  • LL-NDK-Bibliotheken sind Framework-Shared-Bibliotheken , die als stabil gelten. Ihre Entwickler sind bestrebt, die Stabilität ihrer API/ABI aufrechtzuerhalten.
    • LL-NDK umfasst die folgenden Bibliotheken: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so , libneuralnetworks.so , libsync.so , libvndksupport.so und libvulkan.so ,
  • Berechtigte VNDK-Bibliotheken (VNDK) sind gemeinsam genutzte Framework-Bibliotheken , die sicher zweimal kopiert werden können. Framework-Module und Anbietermodule können mit ihren eigenen Kopien verknüpft werden. Eine gemeinsam genutzte Framework-Bibliothek kann nur dann eine berechtigte VNDK-Bibliothek werden, wenn sie die folgenden Kriterien erfüllt:
    • Es sendet/empfängt keine IPCs an/von dem Framework.
    • Es hat nichts mit der virtuellen ART-Maschine zu tun.
    • Es liest/schreibt keine Dateien/Partitionen mit instabilen Dateiformaten.
    • Es gibt keine spezielle Softwarelizenz, die rechtliche Überprüfungen erfordert.
    • Der Codeeigentümer hat keine Einwände gegen die Verwendung durch Anbieter.
  • Nur-Framework-Bibliotheken (FWK-ONLY) sind gemeinsam genutzte Framework-Bibliotheken , die nicht zu den oben genannten Kategorien gehören. Diese Bibliotheken:
    • Werden als interne Implementierungsdetails des Frameworks betrachtet.
    • Der Zugriff durch Herstellermodule ist nicht gestattet.
    • Sie verfügen über instabile ABIs/APIs und keine API/ABI-Kompatibilitätsgarantien.
    • Werden nicht kopiert.

Gleichprozess-HAL (SP-HAL)

Same-Process HAL ( SP-HAL ) ist ein Satz vorgegebener HALs, die als gemeinsam genutzte Vendor Libraries implementiert und in Framework Processes geladen werden. SP-HALs werden durch einen Linker-Namespace isoliert (steuert die Bibliotheken und Symbole, die für die gemeinsam genutzten Bibliotheken sichtbar sind). SP-HALs dürfen nur von LL-NDK und VNDK-SP abhängen.

VNDK-SP ist eine vordefinierte Teilmenge berechtigter VNDK-Bibliotheken. VNDK-SP-Bibliotheken werden sorgfältig überprüft, um sicherzustellen, dass das doppelte Laden von VNDK-SP-Bibliotheken in Framework-Prozesse keine Probleme verursacht. Sowohl SP-HALs als auch VNDK-SPs werden von Google definiert.

Die folgenden Bibliotheken sind zugelassene SP-HALs:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP-Bibliotheken geben vndk: { support_system_process: true } in ihren Android.bp-Dateien an. Wenn auch vndk: {private:true} angegeben ist, heißen diese Bibliotheken VNDK-SP-Private und sind für SP-HALS unsichtbar.

Bei den folgenden handelt es sich um reine Framework-Bibliotheken mit RS-Ausnahmen (FWK-ONLY-RS) :

  • libft2.so (Renderscript)
  • libmediandk.so (Renderscript)

VNDK-Versionierung

Die gemeinsam genutzten VNDK-Bibliotheken sind versioniert:

  • Die Systemeigenschaft ro.vndk.version wird automatisch zu /vendor/default.prop hinzugefügt.
  • Die gemeinsam genutzten Bibliotheken VNDK und VNDK-SP werden als VNDK-Apex com.android.vndk.v${ro.vndk.version} installiert und in /apex/com.android.vndk.v${ro.vndk.version} gemountet.

Der Wert von ro.vndk.version wird durch den folgenden Algorithmus ausgewählt:

  • Wenn BOARD_VNDK_VERSION nicht gleich current ist, verwenden Sie BOARD_VNDK_VERSION .
  • Wenn BOARD_VNDK_VERSION gleich current ist:
    • Wenn PLATFORM_VERSION_CODENAME REL ist, verwenden Sie PLATFORM_SDK_VERSION (z. B. 28 ).
    • Andernfalls verwenden Sie PLATFORM_VERSION_CODENAME (z. B. P ).

Vendor Test Suite (VTS)

Die Android Vendor Test Suite (VTS) erfordert eine nicht leere ro.vndk.version Eigenschaft. Sowohl neu gestartete Geräte als auch Upgrade-Geräte müssen ro.vndk.version definieren. Einige VNDK-Testfälle (z. B. VtsVndkFilesTest und VtsVndkDependencyTest ) verlassen sich auf die Eigenschaft ro.vndk.version , um die passenden geeigneten Datensätze der VNDK-Bibliotheken zu laden.