Generieren von VNDK-Snapshots

Ein VNDK-Snapshot ist ein Satz 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 die Varianten arm, arm64, x86 und x86_64 TARGET_ARCH unterstützt.

Schnappschüsse erstellen

Der Android-Build-Server generiert Build-Artefakte und VNDK-Snapshot-Dateien mithilfe der folgenden Build-Parameter und Build-Befehle.

Build-Parameter

Der Name des Build-Ziels ist vndk . Die Build-Zielkonfiguration 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 ist dasselbe wie Generic System Image (GSI) -Zielbögen ( 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.

Befehle erstellen

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

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

Der Android-Build-Server verwendet das Skript 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-Zweig dieser Version generiert.

Bauen vor Ort

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

  • Um alle unterstützten Archs auf einmal zu erstellen, führen Sie das folgende Build-Skript ( build.sh ) aus.
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • Um ein bestimmtes TARGET_ARCH zu erstellen, führen Sie die folgenden Befehle aus.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist
    

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

Snapshot-Dateien

Ein VNDK-Snapshot enthält die folgenden Dateien.

  • Herstellervariante der gemeinsam genutzten VNDK-Core- und VNDK-SP-Bibliotheken.
    • Gemeinsam genutzte LL-NDK-Bibliotheken werden nicht benötigt, da sie abwärtskompatibel sind.
    • Für 64-Bit-Ziele werden sowohl die Bibliotheken TARGET_ARCH als auch TARGET_2ND_ARCH erstellt und eingebunden.
  • Die 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 . Zeichnet die Modulpfade für alle VNDK-Bibliotheken auf. Dies wird benötigt, um zu überprüfen, ob GPL-Projekte über in einem bestimmten Android-Quellbaum veröffentlichte Quellen verfügen.

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

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

Erstellen für Anbieter-Snapshots

Android 11 unterstützt Hersteller-Snapshots , mit denen Sie vendor.img unabhängig von der Android-Version im Quellbaum erstellen können. Ein standardmäßiger VNDK-Snapshot enthält die gemeinsam genutzten Bibliotheksdateien ( .so ), die auf Geräten installiert und dann zur Laufzeit von C++-Binärdateien des Anbieters verknüpft werden können. Um diesen VNDK-Snapshot zu erstellen, benötigen Sie zusätzliche Artefakte wie Header-Dateien und exportierte Flags.

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

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

Dieser Befehl erstellt android-vndk-$(TARGET_ARCH).zip Dateien unter $DIST_DIR . Das folgende Beispiel ist eine arm64-VNDK-Snapshot-ZIP-Datei mit Build-Artefakten. Die fett gedruckten Dateien sind neu hinzugefügte Dateien zum normalen VNDK-Snapshot (dargestellt in Abbildung 1) und umfassen JSON-Dateien (in denen cflags jeder Bibliothek gespeichert sind) und alle exportierten Header-Dateien.

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

Hochladen von VNDK-Snapshots

VNDK-Snapshots werden im Quellbaum unter /prebuilts/vndk/v VER überprüft, wobei VER der Version des VNDK-Snapshots entspricht (die der SDK-Version der entsprechenden Android-Version folgt). Der Android 8.1 VNDK-Snapshot hat beispielsweise Version 27.

Verwenden des update.py-Skripts

Das update.py Skript ( /development/vndk/snapshot/update.py ) automatisiert den Prozess des Hinzufügens eines vorgefertigten VNDK-Snapshots zum Quellbaum. Es erkennt automatisch Build-Artefakte und füllt die zugehörigen Eigenschaften entsprechend in die generierte Android.bp ein. Dieses Skript führt die folgenden Aufgaben aus:

  1. Verwendet in /prebuilts/vndk/v VER repo start , um einen neuen Git-Zweig zu erstellen.
  2. Ruft VNDK-Snapshot-Build-Artefakte ab und entpackt sie.
  3. Führt gen_buildfiles.py aus, um die Build-Dateien ( Android.bp ) automatisch zu generieren.
  4. Führt check_gpl_license.py aus, um zu überprüfen, ob für die vorgefertigten Bibliotheken, die unter der General Public License (GPL) lizenziert sind, Quellen im aktuellen Quellbaum veröffentlicht sind.
  5. Verwendet git commit um neue Änderungen zu übernehmen.

Verwendung lokal erstellter VNDK-Snapshots

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

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

Beispielverzeichnisstruktur 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 Artefakte mit VNDK_SNAPSHOT_BUILD_ARTIFACTS=true erstellt wurden.

VNDK-Snapshots installieren

Das Systemabbild installiert VNDK-Snapshot-Bibliotheken zur Erstellungszeit unter Verwendung der Informationen in BOARD_VNDK_VERSION , PRODUCT_EXTRA_VNDK_VERSIONS und ro.vndk.version . Mit einer der folgenden Optionen können Sie steuern, welche VNDK-Snapshots aus den vorgefertigten 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 vorgefertigten VNDK-Snapshots installiert, die in PRODUCT_EXTRA_VNDK_VERSIONS aufgeführt sind, ohne sie zur Erstellungszeit mit anderen Modulen zu verknüpfen.

Festlegen von BOARD_VNDK_VERSION

BOARD_VNDK_VERSION zeigt die VNDK-Version an, für deren Erstellung aktuelle Herstellermodule erforderlich sind. Wenn BOARD_VNDK_VERSION über eine verfügbare VNDK-Snapshot-Version im Verzeichnis /prebuilts/vndk verfügt, wird der in BOARD_VNDK_VERSION angegebene VNDK-Snapshot installiert. Wenn der VNDK-Snapshot im Verzeichnis nicht verfügbar ist, tritt ein Build-Fehler auf.

Durch die Definition BOARD_VNDK_VERSION können auch die VNDK-Module installiert werden. Herstellermodule werden zur Erstellungszeit mit der in BOARD_VNDK_VERSION definierten VNDK-Snapshot-Version verknüpft (dadurch werden keine aktuellen VNDK-Module in der Systemquelle erstellt). Beim Herunterladen des vollständigen Quellbaums aus einem Repository basieren sowohl die System- als auch die Herstellerquellen auf derselben Android-Version.

Festlegen von PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS listet die zusätzlichen VNDK-Versionen auf, die installiert werden sollen. Normalerweise reicht es aus, einen VNDK-Snapshot für die aktuelle Herstellerpartition zu haben. In einigen Fällen müssen Sie jedoch möglicherweise mehrere Snapshots in ein Systemabbild einbinden. Beispielsweise verfügt das GSI über mehrere Snapshots, um mehrere Herstellerversionen mit einem System-Image zu unterstützen. Durch Festlegen PRODUCT_EXTRA_VNDK_VERSIONS können Sie die VNDK-Snapshot-Module zusätzlich zur VNDK-Version in BOARD_VNDK_VERSION installieren.

Wenn PRODUCT_EXTRA_VNDK_VERSIONS über eine bestimmte Versionsliste verfügt, sucht das Build-System im Verzeichnis prebuilts/vndk nach vorgefertigten Snapshots der Versionsliste. Wenn das Build-System alle aufgelisteten Snapshots findet, installiert es diese Snapshot-Dateien auf jedem VNDK APEX ( out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.v VER . Fehlende Versionen erzeugen einen Build-Fehler.

Die VNDK-Module werden zur 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 eingestellt:

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

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

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

Zusammenfassung der VNDK-Versionseinstellungen

Die folgende Tabelle fasst die VNDK-Versionseinstellungen zusammen.

Verkäufer
Bauen
Planke
Ausführung
SDK
Freigeben
Plattform
Ausführung
Ausführung
Eigentum
Verzeichnis installieren
Aktuelle VNDK-Module current Vor CODE_NAME CODE_NAME /system/apex/com.android.vndk.v CODE_NAME
Nach SDK_VER SDK_VER /system/apex/com.android.vndk.v SDK_VER
Vorgefertigte Snapshot-Module VNDK_VER
für Schnappschuss
Vorher oder nachher CODE_NAME
oder SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.v VNDK_VER
  • Board-Version ( BOARD_VNDK_VERSION ). VNDK-Version, die Anbietermodule zum Erstellen benötigen. Auf current setzen, wenn Herstellermodule mit aktuellen Systemmodulen verknüpft werden können.
  • Plattformversion ( PLATFORM_VNDK_VERSION ). VNDK-Version, die aktuelle Systemmodule erstellen. Wird nur erstellt, wenn BOARD_VNDK_VERSION gleich aktuell ist.
  • Versionseigenschaft ( ro.vndk.version ). Eigenschaft, die die VNDK-Version angibt, die die Binärdateien und Bibliotheken in Vendor.img zum Ausführen benötigen. Gespeichert in der vendor.img unter /vendor/default.prop .