生成 VNDK 快照

VNDK 快照是一組用於 Android 版本的 VNDK 核心和 VNDK-SP 庫。如果system.img包含 vendor.img 所需的相應vendor.img快照,則只能升級系統分區。

官方 VNDK 快照在 Android 構建服務器上自動構建並檢入 Android 源代碼樹的/prebuilts/vndk 。出於開發目的,您可以在本地構建 VNDK 快照。 arm、arm64、x86 和 x86_64 TARGET_ARCH風格支持 VNDK 快照。

構建快照

Android 構建服務器使用以下構建參數和構建命令生成構建工件和 VNDK 快照文件。

構建參數

構建目標名稱是vndk 。構建目標配置如下所示。

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與通用系統映像 (GSI)目標拱門( armarm64x86x86_64 )相同。
  • TARGET_ARCH_VARIANT 。對於快照 v28 (Android 9) 及更高版本,包括上面列出的常用配置。

構建命令

對於官方快照,Android 9 及更高版本在vndk.mk中包含一個示例目標 ( vndk ),用於構建 VNDK 快照並將其輸出到$DIST_DIR 。快照 ZIP 文件使用android-vndk-$(TARGET_ARCH).zip格式。例如:

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

Android 構建服務器使用build.sh腳本通過以下命令構建所有受支持的架構風格。

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

Android 版本的 VNDK 快照是從該版本的發布分支生成的。

本地建設

在開發過程中,您可以使用以下命令從本地源代碼樹構建 VNDK 快照。

  • 要一次構建所有受支持的拱門,請執行以下構建腳本 ( build.sh )。
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • 要構建一個特定的TARGET_ARCH ,請執行以下命令。
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist
    

相應的android-vndk-$(TARGET_ARCH).zip文件在$DIST_DIR下創建。

快照文件

VNDK 快照包括以下文件。

  • VNDK-core 和 VNDK-SP 共享庫的供應商變體。
    • 不需要 LL-NDK 共享庫,因為它們向後兼容。
    • 對於 64 位目標,構建並包含TARGET_ARCHTARGET_2ND_ARCH庫。
  • VNDK 核心、VNDK-SP、LL-NDK 和 VNDK 私有庫的列表位於[vndkcore|vndksp|llndk|vndkprivate].libraries.txt中。
  • 許可證文件。
  • module_paths.txt 。記錄所有 VNDK 庫的模塊路徑,這是檢查 GPL 項目是否在給定 Android 源代碼樹中發布的源代碼所必需的。

對於給定的 VNDK 快照 ZIP 文件android-vndk-$(TARGET_ARCH).zip ,VNDK 預構建庫根據 ABI 位數分組在名為arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT)的單獨目錄中。例如,對於android-vndk-arm64.zip ,64 位庫位於arch-arm64-armv8-a下,32 位庫位於arch-arm-armv8-a下。下面的示例顯示了 arm64 ( TARGET_ARCH=arm64 ) VNDK 快照 ZIP 文件 ( android-vndk-arm64.zip ) 的目錄結構。

VNDK 快照目錄結構
圖 1. VNDK 快照目錄結構(示例)

為供應商快照構建

Android 11 支持供應商快照,這使您能夠構建vendor.img ,而不管源代碼樹上的 Android 版本如何。默認 VNDK 快照包含共享庫文件 ( .so ),這些文件可以安裝到設備上,然後在運行時從供應商 C++ 二進製文件鏈接。要針對該 VNDK 快照進行構建,您需要額外的工件,例如頭文件和導出的標誌。

要從本地源樹生成此類工件(連同 VNDK 快照),請使用以下命令。

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

此命令在$DIST_DIR下創建android-vndk-$(TARGET_ARCH).zip文件。下面的示例是帶有構建工件的 arm64 VNDK 快照 ZIP 文件。粗體文件是普通 VNDK 快照中新添加的文件(如圖 1 所示),包括 JSON 文件(存儲每個庫的cflags )和所有導出的頭文件。

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 快照

VNDK 快照在/prebuilts/vndk/v VER下的源代碼樹中進行檢查,其中VER等於 VNDK 快照的版本(遵循相應 Android 版本的 SDK 版本)。例如,Android 8.1 VNDK 快照的版本為 27。

使用 update.py 腳本

update.py腳本 ( /development/vndk/snapshot/update.py ) 自動執行將預構建的 VNDK 快照添加到源代碼樹的過程。它會自動檢測構建工件並在生成的Android.bp中適當地填充相關屬性。此腳本執行以下任務:

  1. /prebuilts/vndk/v VER中,使用repo start創建新的 Git 分支。
  2. 獲取並解壓縮 VNDK 快照構建工件。
  3. 運行gen_buildfiles.py以自動生成構建文件 ( Android.bp )。
  4. 運行check_gpl_license.py以驗證根據通用公共許可證 (GPL) 許可的預構建庫是否在當前源代碼樹中發布了源代碼。
  5. 使用git commit提交新的更改。

使用本地構建的 VNDK 快照

您還可以使用本地構建的 VNDK 快照。當指定--local選項時, update.py腳本從本地$DIST_DIR (而不是 Android 構建服務器)獲取 VNDK 快照構建工件,並跳過 GPL 許可證檢查和git commit步驟。要安裝本地構建的 VNDK 快照,請導航到目標目錄並使用update.py腳本。

句法:

python update.py VER --local

使用本地構建工件更新 Android 8.1 VNDK 快照的示例命令:

python update.py 27 --local

本地構建的 VNDK 快照的示例目錄結構:

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)
如果工件是使用VNDK_SNAPSHOT_BUILD_ARTIFACTS=true構建的,則會自動添加本地構建工件。

安裝 VNDK 快照

系統映像在構建時使用BOARD_VNDK_VERSIONPRODUCT_EXTRA_VNDK_VERSIONSro.vndk.version中的信息安裝 VNDK 快照庫。您可以使用以下選項之一控制從預構建的 VNDK 快照目錄(例如/prebuilts/vndk/v29/prebuilts/vndk/v30 )安裝哪些 VNDK 快照。

  • 選項 1: BOARD_VNDK_VERSION 。使用快照模塊構建當前供應商模塊並僅安裝供應商模塊所需的快照模塊。
  • 選項 2: PRODUCT_EXTRA_VNDK_VERSIONS 。無論當前供應商模塊如何,都安裝 VNDK 快照模塊。這會安裝PRODUCT_EXTRA_VNDK_VERSIONS中列出的預構建 VNDK 快照,而不會在構建時將它們鏈接到任何其他模塊。

設置 BOARD_VNDK_VERSION

BOARD_VNDK_VERSION顯示當前供應商模塊需要構建的 VNDK 版本。如果BOARD_VNDK_VERSION/prebuilts/vndk目錄中有可用的 VNDK 快照版本,則安裝 BOARD_VNDK_VERSION 中指示的BOARD_VNDK_VERSION快照。如果目錄中沒有 VNDK 快照,則會發生構建錯誤。

定義BOARD_VNDK_VERSION還可以安裝 VNDK 模塊。供應商模塊與構建時在BOARD_VNDK_VERSION中定義的 VNDK 快照版本鏈接(這不會在系統源中構建當前的 VNDK 模塊)。從存儲庫下載完整的源代碼樹時,系統和供應商源代碼都基於相同的 Android 版本。

設置 PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS列出要安裝的額外 VNDK 版本。通常,為當前供應商分區擁有一個 VNDK 快照就足夠了。但是,在某些情況下,您可能需要在一個系統映像中包含多個快照。例如,GSI 有多個快照以支持具有一個系統映像的多個供應商版本。通過設置PRODUCT_EXTRA_VNDK_VERSIONS ,除了 BOARD_VNDK_VERSION 中的 VNDK 版本之外,您還可以安裝BOARD_VNDK_VERSION快照模塊。

如果PRODUCT_EXTRA_VNDK_VERSIONS具有特定的版本列表,則構建系統會在prebuilts/vndk目錄中查找版本列表的預構建快照。如果構建系統找到所有列出的快照,它會將這些快照文件安裝到每個 VNDK APEX ( out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.v VER 。缺少版本會生成構建錯誤。

VNDK 模塊在構建時不與供應商模塊鏈接,但如果供應商分區中的供應商模塊需要已安裝的 VNDK 版本之一,則可以在運行時使用。 PRODUCT_EXTRA_VNDK_VERSIONS僅在定義了BOARD_VNDK_VERSION有效。

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION定義系統源中當前 VNDK 模塊的 VNDK 版本。該值是自動設置的:

  • 在發布之前, PLATFORM_VNDK_VERSION設置為PLATFORM_VERSION_CODENAME
  • 在發佈時, PLATFORM_SDK_VERSION被複製到PLATFORM_VNDK_VERSION

Android 版本發布後,當前的 VNDK 庫安裝到 VNDK APEX ( /system/apex/com.android.vndk.v VER ),其中VER是存儲在PLATFORM_VNDK_VERSION中的版本。

BOARD_VNDK_VERSION設置為current時, PLATFORM_VNDK_VERSION存儲在ro.vndk.version中,否則BOARD_VNDK_VERSION存儲在ro.vndk.version中。 PLATFORM_VNDK_VERSION設置為 Android 發佈時的 SDK 版本;在發布之前,字母數字 Android 代碼名稱用於PLATFORM_VNDK_VERSION

VNDK 版本設置摘要

下表總結了 VNDK 版本設置。

小販
建造
木板
版本
SDK
發布
平台
版本
版本
財產
安裝目錄
當前的 VNDK 模塊currentCODE_NAME CODE_NAME /system/apex/com.android.vndk.v CODE_NAME
SDK_VER SDK_VER /system/apex/com.android.vndk.v SDK_VER
預建快照模塊VNDK_VER
用於快照
之前或之後CODE_NAME
SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.v VNDK_VER
  • 主板版本( BOARD_VNDK_VERSION )。供應商模塊需要構建的 VNDK 版本。如果供應商模塊可以與當前系統模塊鏈接,則設置為current
  • 平台版本( PLATFORM_VNDK_VERSION )。當前系統模塊正在構建的 VNDK 版本。僅在BOARD_VNDK_VERSION等於當前時構建。
  • 版本屬性( ro.vndk.version )。指定 vendor.img 中的二進製文件和庫運行所需的 VNDK 版本的屬性。存儲在vendor.img/vendor/default.prop中。