Membuat snapshot VNDK

Snapshot VNDK adalah kumpulan library VNDK-core dan VNDK-SP untuk rilis Android. Anda hanya dapat mengupgrade partisi sistem jika system.img menyertakan snapshot VNDK yang sesuai yang diperlukan oleh vendor.img.

Snapshot VNDK resmi dibuat secara otomatis di server build Android dan diperiksa ke /prebuilts/vndk dari hierarki sumber Android. Untuk tujuan pengembangan, Anda dapat mem-build snapshot VNDK secara lokal. Snapshot VNDK didukung untuk ragam TARGET_ARCH arm, arm64, x86, dan x86_64.

Membuat snapshot

Server build Android menghasilkan artefak build dan file snapshot VNDK menggunakan parameter build dan perintah build berikut.

Parameter build

Nama target build adalah vndk. Konfigurasi target build ditampilkan di bawah.

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 sama dengan target arch Generic System Image (GSI) (arm, arm64, x86, x86_64).
  • TARGET_ARCH_VARIANT. Untuk snapshot v28 (Android 9) dan yang lebih tinggi, menyertakan konfigurasi populer yang tercantum di atas.

Perintah build

Untuk snapshot resmi, Android 9 dan yang lebih tinggi menyertakan target sampel (vndk) di vndk.mk yang mem-build dan menghasilkan snapshot VNDK ke $DIST_DIR. File ZIP snapshot menggunakan format android-vndk-$(TARGET_ARCH).zip. Contoh:

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

Server build Android menggunakan skrip build.sh untuk mem-build semua ragam arsitektur yang didukung dengan perintah berikut.

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

Snapshot VNDK untuk versi Android dibuat dari cabang rilis versi tersebut.

Mem-build secara lokal

Selama pengembangan, Anda dapat mem-build snapshot VNDK dari hierarki sumber lokal dengan perintah berikut.

  • Untuk mem-build semua arsitektur yang didukung sekaligus, jalankan skrip build berikut (build.sh).
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
  • Untuk mem-build satu TARGET_ARCH tertentu, jalankan perintah berikut.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist

File android-vndk-$(TARGET_ARCH).zip yang sesuai dibuat di bagian $DIST_DIR.

File snapshot

Snapshot VNDK menyertakan file berikut.

  • Varian vendor library bersama VNDK-core dan VNDK-SP.
    • Library bersama LL-NDK tidak diperlukan karena kompatibel dengan versi sebelumnya.
    • Untuk target 64 bit, library TARGET_ARCH dan TARGET_2ND_ARCH dibuat dan disertakan.
  • Daftar library VNDK-core, VNDK-SP, LL-NDK, dan VNDK-private ada di [vndkcore|vndksp|llndk|vndkprivate].libraries.txt.
  • File lisensi.
  • module_paths.txt. Mencatat jalur modul untuk semua library VNDK, yang diperlukan untuk memeriksa apakah project GPL memiliki sumber yang dirilis dalam hierarki sumber Android tertentu.

Untuk file ZIP snapshot VNDK tertentu, android-vndk-$(TARGET_ARCH).zip, library bawaan VNDK dikelompokkan dalam direktori terpisah yang bernama arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) sesuai dengan bit ABI. Misalnya, untuk android-vndk-arm64.zip, library 64-bit ditempatkan di bagian arch-arm64-armv8-a dan library 32-bit ditempatkan di bagian arch-arm-armv8-a. Contoh di bawah menunjukkan struktur direktori untuk file ZIP snapshot VNDK arm64 (TARGET_ARCH=arm64) (android-vndk-arm64.zip).

Struktur Direktori Snapshot VNDK
Gambar 1. Struktur direktori snapshot VNDK (contoh)

Mem-build untuk snapshot vendor

Android 11 mendukung snapshot vendor, yang memungkinkan Anda mem-build vendor.img, apa pun versi Android di hierarki sumber. Snapshot VNDK default berisi file library bersama (.so) yang dapat diinstal ke perangkat, lalu ditautkan dari biner C++ vendor dalam runtime. Untuk mem-build dengan snapshot VNDK tersebut, Anda memerlukan artefak tambahan seperti file header dan flag yang diekspor.

Untuk membuat artefak tersebut (beserta snapshot VNDK) dari hierarki sumber lokal, gunakan perintah berikut.

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

Perintah ini akan membuat file android-vndk-$(TARGET_ARCH).zip di $DIST_DIR. Contoh di bawah adalah file ZIP snapshot VNDK arm64 dengan artefak build. File yang dicetak tebal adalah file yang baru ditambahkan ke snapshot VNDK normal (ditampilkan pada Gambar 1) dan menyertakan file JSON (yang menyimpan cflags dari setiap library) dan semua file header yang diekspor.

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

Mengupload snapshot VNDK

Snapshot VNDK diperiksa di hierarki sumber di /prebuilts/vndk/vVER, dengan VER sama dengan versi snapshot VNDK (yang mengikuti versi SDK rilis Android yang sesuai). Misalnya, snapshot VNDK Android 8.1 memiliki versi 27.

Menggunakan skrip update.py

Skrip update.py (/development/vndk/snapshot/update.py) mengotomatiskan proses menambahkan snapshot VNDK bawaan ke hierarki sumber. Alat ini otomatis mendeteksi artefak build dan mengisi properti terkait dengan tepat di Android.bp yang dihasilkan. Skrip ini melakukan tugas-tugas berikut:

  1. Di /prebuilts/vndk/vVER, menggunakan repo start untuk membuat cabang Git baru.
  2. Mengambil dan mengekstrak artefak build snapshot VNDK.
  3. Menjalankan gen_buildfiles.py untuk membuat file build secara otomatis (Android.bp).
  4. Menjalankan check_gpl_license.py untuk memverifikasi library bawaan yang dilisensikan berdasarkan General Public License (GPL) memiliki sumber yang dirilis di hierarki sumber saat ini.
  5. Menggunakan git commit untuk melakukan perubahan baru.

Menggunakan snapshot VNDK yang di-build secara lokal

Anda juga dapat menggunakan snapshot VNDK yang di-build secara lokal. Saat opsi --local ditentukan, skrip update.py akan mengambil artefak build snapshot VNDK dari direktori lokal yang ditentukan (bukan server build Android) yang memiliki file android-vndk-$(TARGET_ARCH).zip yang dihasilkan dari development/vndk/snapshot/build.sh. Dengan opsi --local, skrip update.py akan melewati pemeriksaan lisensi GPL dan langkah git commit.

Sintaksis:

python update.py VER --local local_path

Contoh perintah untuk mengupdate snapshot VNDK Android 8.1 dengan artefak build lokal di /path/to/local/dir:

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

Contoh struktur direktori snapshot VNDK yang di-build secara lokal:

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)
Artefak build lokal ditambahkan secara otomatis jika artefak dibuat dengan VNDK_SNAPSHOT_BUILD_ARTIFACTS=true.

Menginstal snapshot VNDK

Image sistem menginstal library snapshot VNDK pada waktu build menggunakan informasi di BOARD_VNDK_VERSION, PRODUCT_EXTRA_VNDK_VERSIONS, dan ro.vndk.version. Anda dapat mengontrol snapshot VNDK mana yang diinstal dari direktori snapshot VNDK bawaan (misalnya, /prebuilts/vndk/v29 atau /prebuilts/vndk/v30) menggunakan salah satu opsi berikut.

  • Opsi 1: BOARD_VNDK_VERSION. Gunakan modul snapshot untuk mem-build modul vendor saat ini dan hanya instal modul snapshot yang diperlukan untuk modul vendor.
  • Opsi 2: PRODUCT_EXTRA_VNDK_VERSIONS. Instal modul snapshot VNDK, terlepas dari modul vendor saat ini. Tindakan ini akan menginstal snapshot VNDK bawaan yang tercantum di PRODUCT_EXTRA_VNDK_VERSIONS tanpa menautkannya ke modul lain pada waktu build.

Menetapkan BOARD_VNDK_VERSION

BOARD_VNDK_VERSION menampilkan versi VNDK yang diperlukan untuk membuat modul vendor saat ini. Jika BOARD_VNDK_VERSION memiliki versi snapshot VNDK yang tersedia di direktori /prebuilts/vndk, snapshot VNDK yang ditunjukkan di BOARD_VNDK_VERSION akan diinstal. Jika snapshot VNDK tidak tersedia di direktori, error build akan terjadi.

Menentukan BOARD_VNDK_VERSION juga memungkinkan modul VNDK diinstal. Modul vendor ditautkan dengan versi snapshot VNDK yang ditentukan di BOARD_VNDK_VERSION pada waktu build (tindakan ini tidak mem-build modul VNDK saat ini di sumber sistem). Saat mendownload hierarki sumber lengkap dari repositori, sumber sistem dan vendor didasarkan pada rilis Android yang sama.

Menetapkan PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS mencantumkan versi VNDK tambahan yang akan diinstal. Biasanya, satu snapshot VNDK untuk partisi vendor saat ini sudah cukup. Namun, dalam beberapa kasus, Anda mungkin perlu menyertakan beberapa snapshot dalam satu image sistem. Misalnya, GSI memiliki beberapa snapshot untuk mendukung beberapa versi vendor dengan satu image sistem. Dengan menetapkan PRODUCT_EXTRA_VNDK_VERSIONS, Anda dapat menginstal modul snapshot VNDK selain versi VNDK di BOARD_VNDK_VERSION.

Jika PRODUCT_EXTRA_VNDK_VERSIONS memiliki daftar versi tertentu, sistem build akan mencari snapshot bawaan dari daftar versi di direktori prebuilts/vndk. Jika sistem build menemukan semua snapshot yang tercantum, sistem akan menginstal file snapshot tersebut ke setiap VNDK APEX (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER. Versi yang tidak ada akan menghasilkan error build.

Modul VNDK tidak ditautkan dengan modul vendor pada waktu build, tetapi dapat digunakan saat runtime jika modul vendor di partisi vendor memerlukan salah satu versi VNDK yang diinstal. PRODUCT_EXTRA_VNDK_VERSIONS hanya valid jika BOARD_VNDK_VERSION ditentukan.

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION menentukan versi VNDK untuk modul VNDK saat ini di sumber sistem. Nilai ditetapkan secara otomatis:

  • Sebelum rilis, PLATFORM_VNDK_VERSION ditetapkan sebagai PLATFORM_VERSION_CODENAME.
  • Saat dirilis, PLATFORM_SDK_VERSION disalin ke PLATFORM_VNDK_VERSION.

Setelah versi Android dirilis, library VNDK saat ini diinstal ke VNDK APEX (/system/apex/com.android.vndk.vVER), dengan VER adalah versi yang disimpan di PLATFORM_VNDK_VERSION.

Jika BOARD_VNDK_VERSION ditetapkan ke current, PLATFORM_VNDK_VERSION akan disimpan di ro.vndk.version, jika tidak, BOARD_VNDK_VERSION akan disimpan di ro.vndk.version. PLATFORM_VNDK_VERSION ditetapkan ke versi SDK saat Android dirilis; sebelum rilis, nama kode Android alfanumerik digunakan untuk PLATFORM_VNDK_VERSION.

Ringkasan setelan versi VNDK

Tabel ini meringkas setelan versi VNDK.

Vendor
Build
Board
Version
Rilis SDK
Versi
Platform
Versi
Properti
Menginstal Direktori
Modul VNDK saat ini current Sebelum CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
Sesudah SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
Modul snapshot bawaan VNDK_VER
untuk snapshot
Sebelum atau Setelah CODE_NAME
atau SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • Board Version (BOARD_VNDK_VERSION). Versi VNDK yang diperlukan modul vendor untuk mem-build. Tetapkan ke current jika modul vendor dapat ditautkan dengan modul sistem saat ini.
  • Versi Platform (PLATFORM_VNDK_VERSION). Versi VNDK yang di-build oleh modul sistem saat ini. Di-build hanya jika BOARD_VNDK_VERSION sama dengan saat ini.
  • Version Property (ro.vndk.version). Properti yang menentukan versi VNDK yang diperlukan biner dan library di vendor.img untuk dijalankan. Disimpan di vendor.img di /vendor/default.prop.