VNDK-Snapshots generieren

Ein VNDK-Snapshot besteht aus einer Reihe von VNDK-Core- und VNDK-SP-Bibliotheken für eine Android-Version. Sie können nur die Systempartition aktualisieren, wenn die system.img den entsprechenden VNDK-Snapshot enthält, der von der vendor.img benötigt wird.

Offizielle VNDK-Snapshots werden automatisch auf dem Android-Build-Server erstellt und in /prebuilts/vndk des Android-Quellbaums eingecheckt. Für Entwicklungszwecke können Sie VNDK-Snapshots lokal erstellen. VNDK-Snapshots werden für TARGET_ARCH-Varianten von arm, arm64, x86 und x86_64 unterstützt.

Snapshots erstellen

Der Android-Buildserver generiert Build-Artefakte und VNDK-Snapshot-Dateien mit den folgenden Build-Parametern und Build-Befehlen.

Build-Parameter

Der Name des Build-Ziels lautet vndk. Die Konfiguration des Buildziels ist unten dargestellt.

TARGET_PRODUCT TARGET_ARCH TARGET_ARCH_VARIANT
aosp_arm arm armv7-a-neon
aosp_arm64 arm64 armv8-a
aosp_x86 x86 x86
aosp_x86_64 x86_64 x86_64
  • TARGET_PRODUCT=aosp_$(TARGET_ARCH)
  • TARGET_BUILD_VARIANT=user
  • TARGET_ARCH entspricht den Zielarchitekturen des generischen System-Images (GSI) (arm, arm64, x86, x86_64).
  • TARGET_ARCH_VARIANT. Für Snapshot v28 (Android 9) und höher sind die oben aufgeführten gängigen Konfigurationen enthalten.

Build-Befehle

Für offizielle Snapshots enthält Android 9 und höher ein Beispielziel (vndk) in vndk.mk, das einen VNDK-Snapshot erstellt und in $DIST_DIR ausgibt. Die ZIP-Datei des Snapshots hat das Format android-vndk-$(TARGET_ARCH).zip. Beispiel:

lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]

Der Android-Buildserver verwendet das Script build.sh, um alle unterstützten Arch-Varianten mit dem folgenden Befehl zu erstellen.

DIST_DIR=dist_dir development/vndk/snapshot/build.sh

Der VNDK-Snapshot für eine Android-Version wird aus dem Release-Branch dieser Version generiert.

Lokal erstellen

Während der Entwicklung können Sie VNDK-Snapshots mit den folgenden Befehlen aus einem lokalen Quellbaum erstellen.

  • Wenn Sie alle unterstützten Architekturen gleichzeitig erstellen möchten, führen Sie das folgende Build-Script (build.sh) aus.
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
  • Führen Sie die folgenden Befehle aus, um eine bestimmte TARGET_ARCH zu erstellen.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist

Die entsprechende android-vndk-$(TARGET_ARCH).zip-Datei wird unter $DIST_DIR erstellt.

Snapshot-Dateien

Ein VNDK-Snapshot enthält die folgenden Dateien.

  • Anbietervariante der VNDK-Core- und VNDK-SP-Freigabebibliotheken.
    • LL-NDK-gemeinsam genutzte Bibliotheken sind nicht erforderlich, da sie abwärtskompatibel sind.
    • Für 64-Bit-Ziele werden sowohl TARGET_ARCH- als auch TARGET_2ND_ARCH-Bibliotheken erstellt und eingeschlossen.
  • Eine Liste der VNDK-Core-, VNDK-SP-, LL-NDK- und VNDK-Private-Bibliotheken finden Sie unter [vndkcore|vndksp|llndk|vndkprivate].libraries.txt.
  • Lizenzdateien
  • module_paths.txt: Protokolliert die Modulpfade für alle VNDK-Bibliotheken. Dies ist erforderlich, um zu prüfen, ob GPL-Projekte Quellen in einem bestimmten Android-Quellbaum veröffentlicht haben.

Für eine bestimmte VNDK-Snapshot-ZIP-Datei, android-vndk-$(TARGET_ARCH).zip, sind die vorgefertigten VNDK-Bibliotheken nach der ABI-Bitanzahl in separaten Verzeichnissen mit dem Namen arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) gruppiert. Bei android-vndk-arm64.zip werden die 64-Bit-Bibliotheken beispielsweise unter arch-arm64-armv8-a und die 32-Bit-Bibliotheken unter arch-arm-armv8-a abgelegt. Das folgende Beispiel zeigt die Verzeichnisstruktur für eine VNDK-Snapshot-ZIP-Datei (android-vndk-arm64.zip) für ARM64 (TARGET_ARCH=arm64).

VNDK-Snapshot-Verzeichnisstruktur
Abbildung 1. VNDK-Snapshot-Verzeichnisstruktur (Beispiel)

Für Anbieter-Snapshots erstellen

Android 11 unterstützt Snapshots von Anbietern, mit denen Sie vendor.img unabhängig von der Android-Version im Stammverzeichnis erstellen können. Ein standardmäßiger VNDK-Snapshot enthält die Dateien der freigegebenen Bibliothek (.so), die auf Geräten installiert und dann zur Laufzeit über die C++-Binärdateien des Anbieters verknüpft werden können. Wenn Sie mit diesem VNDK-Snapshot erstellen möchten, benötigen Sie zusätzliche Artefakte wie Headerdateien und exportierte Flags.

Verwenden Sie den folgenden Befehl, um solche Artefakte (zusammen mit dem VNDK-Snapshot) aus einem lokalen Quellbaum zu generieren.

VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh

Mit diesem Befehl werden android-vndk-$(TARGET_ARCH).zip-Dateien unter $DIST_DIR erstellt. Das folgende Beispiel ist eine arm64-VNDK-Snapshot-ZIP-Datei mit Build-Artefakten. Die fett formatierten Dateien sind dem normalen VNDK-Snapshot (siehe Abbildung 1) neu hinzugefügte Dateien. Dazu gehören JSON-Dateien (mit cflags jeder Bibliothek) und alle exportierten Headerdateien.

android-vndk-arm64.zip
├── arch-arm64-armv8-a
│   └── shared
│       ├── vndk-core  -> *.so files, *.json files
│       └── vndk-sp    -> *.so files, *.json files
├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)
├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files

VNDK-Snapshots hochladen

VNDK-Snapshots werden im Stammbaum unter /prebuilts/vndk/vVER geprüft. Dabei entspricht VER der Version des VNDK-Snapshots, die der SDK-Version der entsprechenden Android-Version folgt. Der VNDK-Snapshot für Android 8.1 hat beispielsweise die Version 27.

Skript „update.py“ verwenden

Das update.py-Script (/development/vndk/snapshot/update.py) automatisiert das Hinzufügen eines vorkonfigurierten VNDK-Snapshots zum Quellbaum. Es erkennt automatisch Build-Artefakte und füllt die zugehörigen Eigenschaften im generierten Android.bp entsprechend aus. Dieses Script führt die folgenden Aufgaben aus:

  1. In /prebuilts/vndk/vVER wird repo start verwendet, um einen neuen Git-Branch zu erstellen.
  2. Ruft VNDK-Snapshot-Build-Artefakte ab und entpackt sie.
  3. Führt gen_buildfiles.py aus, um die Builddateien (Android.bp) automatisch zu generieren.
  4. Führt check_gpl_license.py aus, um zu prüfen, ob die vorkonfigurierten Bibliotheken, die gemäß der General Public License (GPL) lizenziert sind, im aktuellen Quellbaum veröffentlicht wurden.
  5. Verwendet git commit, um neue Änderungen zu übernehmen.

Lokal erstellte VNDK-Snapshots verwenden

Sie können auch lokal erstellte VNDK-Snapshots verwenden. Wenn die Option --local angegeben ist, ruft das update.py-Script VNDK-Snapshot-Build-Artefakte aus dem angegebenen lokalen Verzeichnis (anstelle des Android-Build-Servers) ab, das die android-vndk-$(TARGET_ARCH).zip-Dateien enthält, die aus dem development/vndk/snapshot/build.sh generiert wurden. Mit der Option --local überspringt das update.py-Script die GPL-Lizenzprüfung und die Schritte git commit.

Syntax:

python update.py VER --local local_path

Beispielbefehl zum Aktualisieren des Android 8.1-VNDK-Snapshots mit lokalen Build-Artefakten in /path/to/local/dir:

python update.py 27 --local /path/to/local/dir

Beispiel für die Verzeichnisstruktur eines lokal erstellten VNDK-Snapshots:

prebuilts/vndk
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (prebuilt libs)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   └── Android.bp         -> (VNDK modules with cflags)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   ├── x86                    -> (same as above)
│   ├── common
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (license file modules)
│   └── Android.bp             -> (*.libraries.30.txt modules)
└── (other VNDK versions)      -> (same as above)
Lokale Build-Artefakte werden automatisch hinzugefügt, wenn sie mit VNDK_SNAPSHOT_BUILD_ARTIFACTS=true erstellt wurden.

VNDK-Snapshots installieren

Das System-Image installiert VNDK-Snapshot-Bibliotheken zur Buildzeit anhand der Informationen in BOARD_VNDK_VERSION, PRODUCT_EXTRA_VNDK_VERSIONS und ro.vndk.version. Mit einer der folgenden Optionen können Sie festlegen, welche VNDK-Snapshots aus den vorkonfigurierten VNDK-Snapshot-Verzeichnissen (z. B. /prebuilts/vndk/v29 oder /prebuilts/vndk/v30) installiert werden.

  • Option 1:BOARD_VNDK_VERSION. Verwenden Sie die Snapshot-Module zum Erstellen der aktuellen Anbietermodule und installieren Sie nur die Snapshot-Module, die für die Anbietermodule erforderlich sind.
  • Option 2:PRODUCT_EXTRA_VNDK_VERSIONS. Installieren Sie die VNDK-Snapshot-Module unabhängig von den aktuellen Anbietermodulen. Dadurch werden die in PRODUCT_EXTRA_VNDK_VERSIONS aufgeführten vorkompilierten VNDK-Snapshots installiert, ohne dass sie zur Buildzeit mit anderen Modulen verknüpft werden.

BOARD_VNDK_VERSION festlegen

BOARD_VNDK_VERSION zeigt die VNDK-Version an, die für das Erstellen aktueller Anbietermodule erforderlich ist. Wenn unter BOARD_VNDK_VERSION im Verzeichnis /prebuilts/vndk eine VNDK-Snapshot-Version verfügbar ist, wird der in BOARD_VNDK_VERSION angegebene VNDK-Snapshot installiert. Wenn der VNDK-Snapshot nicht im Verzeichnis verfügbar ist, tritt ein Buildfehler auf.

Wenn Sie BOARD_VNDK_VERSION definieren, können auch die VNDK-Module installiert werden. Anbietermodule werden bei der Buildzeit mit der in BOARD_VNDK_VERSION definierten VNDK-Snapshot-Version verknüpft. Dadurch werden keine aktuellen VNDK-Module in der Systemquelle erstellt. Wenn Sie den vollständigen Quellbaum aus einem Repository herunterladen, basieren sowohl die System- als auch die Anbieterquellen auf derselben Android-Release.

PRODUCT_EXTRA_VNDK_VERSIONS festlegen

PRODUCT_EXTRA_VNDK_VERSIONS enthält die zusätzlichen VNDK-Versionen, die installiert werden sollen. Normalerweise reicht ein VNDK-Snapshot für die aktuelle Anbieterpartition aus. In einigen Fällen müssen Sie jedoch möglicherweise mehrere Snapshots in einem System-Image aufnehmen. Beispielsweise hat das GSI mehrere Snapshots, um mehrere Anbieterversionen mit einem System-Image zu unterstützen. Wenn Sie PRODUCT_EXTRA_VNDK_VERSIONS festlegen, können Sie die VNDK-Snapshot-Module zusätzlich zur VNDK-Version in BOARD_VNDK_VERSION installieren.

Wenn PRODUCT_EXTRA_VNDK_VERSIONS eine bestimmte Liste von Versionen enthält, sucht das Build-System im Verzeichnis prebuilts/vndk nach vorkonfigurierten Snapshots der Versionsliste. Wenn das Build-System alle aufgeführten Snapshots findet, werden diese Snapshot-Dateien in jeder VNDK-APEX (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER) installiert. Fehlende Versionen führen zu einem Buildfehler.

Die VNDK-Module werden bei der Buildzeit nicht mit den Anbietermodulen verknüpft, können aber zur Laufzeit verwendet werden, wenn die Anbietermodule in der Anbieterpartition eine der installierten VNDK-Versionen erfordern. PRODUCT_EXTRA_VNDK_VERSIONS ist nur gültig, wenn BOARD_VNDK_VERSION definiert ist.

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION definiert die VNDK-Version für aktuelle VNDK-Module in der Systemquelle. Der Wert wird automatisch festgelegt:

  • Vor der Veröffentlichung ist die PLATFORM_VNDK_VERSION auf PLATFORM_VERSION_CODENAME festgelegt.
  • Bei der Veröffentlichung wird PLATFORM_SDK_VERSION in PLATFORM_VNDK_VERSION kopiert.

Nach der Veröffentlichung der Android-Version werden die aktuellen VNDK-Bibliotheken in VNDK APEX (/system/apex/com.android.vndk.vVER) installiert. Dabei ist VER die in PLATFORM_VNDK_VERSION gespeicherte Version.

Wenn BOARD_VNDK_VERSION auf current festgelegt ist, wird PLATFORM_VNDK_VERSION in ro.vndk.version gespeichert. Andernfalls wird BOARD_VNDK_VERSION in ro.vndk.version gespeichert. PLATFORM_VNDK_VERSION wird bei Android-Releases auf die SDK-Version festgelegt. Vor der Veröffentlichung wird für PLATFORM_VNDK_VERSION der alphanumerische Android-Codename verwendet.

Zusammenfassung der VNDK-Versionen

In der Tabelle sind die Einstellungen für die VNDK-Version zusammengefasst.

Anbieter
Build
Board
-Version
SDK
-Release
Plattform
Version
Version
-Property
Installationsverzeichnis
Aktuelle VNDK-Module current Vorher CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
Nachher SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
Vordefinierte Snapshot-Module VNDK_VER
für Snapshot
Vorher oder nachher CODE_NAME
oder SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • Boardversion (BOARD_VNDK_VERSION): VNDK-Version, die für das Erstellen von Anbietermodulen erforderlich ist. Legen Sie current fest, wenn Anbietermodule mit aktuellen Systemmodulen verknüpft werden können.
  • Plattformversion (PLATFORM_VNDK_VERSION): VNDK-Version, mit der die aktuellen Systemmodule erstellt werden. Wird nur erstellt, wenn BOARD_VNDK_VERSION dem aktuellen Wert entspricht.
  • Version Property (ro.vndk.version): Property, die die VNDK-Version angibt, die für die Ausführung der Binärdateien und Bibliotheken in vendor.img erforderlich ist. In der vendor.img unter /vendor/default.prop gespeichert.