生成 VNDK 快照

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

官方 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腳本透過以下命令建立所有支援的 arch 風格。

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

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

本地建設

在開發過程中,您可以使用下列命令從本機來源樹建立 VNDK 快照。

  • 若要一次建置所有支援的 arch,請執行以下建置腳本 ( 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-core、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腳本會從指定的本機目錄(而不是 Android 建置伺服器)取得 VNDK 快照建置工件,該目錄包含development/vndk/snapshot/build.sh 。使用--local選項, update.py腳本會跳過 GPL 授權檢查和git commit步驟。

句法:

python update.py VER --local local_path

使用/path/to/local/dir中的本機建置工件更新 Android 8.1 VNDK 快照的範例指令:

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

本機建置的 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中指示的 VNDK 快照。如果 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 版本之外,您還可以安裝 VNDK 快照模組。

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

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

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 版本設定。

小販
建造
木板
版本
軟體開發工具包
發布
平台
版本
版本
財產
安裝目錄
目前的 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/default.propvendor.img中。