Membuat Snapshot VNDK

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

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

Membangun snapshot

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

Membangun parameter

Nama target build adalah vndk . Konfigurasi target build ditunjukkan di bawah ini.

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 lengkungan target Gambar Sistem Generik (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.

Membangun perintah

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

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

Server build Android menggunakan skrip build.sh untuk membangun semua varian arch yang didukung dengan perintah berikut.

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

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

Membangun secara lokal

Selama pengembangan, Anda dapat membuat snapshot VNDK dari pohon sumber lokal dengan perintah berikut.

  • Untuk membangun semua lengkungan yang didukung sekaligus, jalankan skrip build berikut ( build.sh ).
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • Untuk membangun 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 bawah $DIST_DIR .

File cuplikan

Cuplikan VNDK menyertakan file berikut.

  • Varian vendor dari pustaka bersama VNDK-core dan VNDK-SP.
    • Lib bersama LL-NDK tidak diperlukan karena kompatibel ke belakang.
    • Untuk target 64 bit, TARGET_ARCH dan TARGET_2ND_ARCH dibuat dan disertakan.
  • Daftar pustaka VNDK-core, VNDK-SP, LL-NDK, dan VNDK-private ada di [vndkcore|vndksp|llndk|vndkprivate].libraries.txt .
  • File lisensi.
  • module_paths.txt . Merekam jalur modul untuk semua pustaka VNDK, yang diperlukan untuk memeriksa apakah proyek GPL memiliki sumber yang dirilis di hierarki sumber Android tertentu.

Untuk file ZIP snapshot VNDK yang diberikan, android-vndk-$(TARGET_ARCH).zip , pustaka bawaan VNDK dikelompokkan dalam direktori terpisah bernama arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) menurut bitness ABI. Misalnya, untuk android-vndk-arm64.zip , lib 64-bit ditempatkan di bawah arch-arm64-armv8-a dan lib 32-bit ditempatkan di bawah arch-arm-armv8-a . Contoh di bawah ini menunjukkan struktur direktori untuk file ZIP snapshot arm64 ( TARGET_ARCH=arm64 ) VNDK ( android-vndk-arm64.zip ).

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

Membangun untuk snapshot vendor

Android 11 mendukung snapshot vendor , yang memungkinkan Anda membuat vendor.img terlepas dari versi Android di pohon sumber. Cuplikan VNDK default berisi file pustaka bersama ( .so ) yang dapat diinstal ke perangkat dan kemudian ditautkan dari biner C++ vendor dalam waktu proses. Untuk membuat snapshot VNDK itu, Anda memerlukan artefak tambahan seperti file header dan flag yang diekspor.

Untuk menghasilkan artefak tersebut (bersama dengan snapshot VNDK) dari pohon sumber lokal, gunakan perintah berikut.

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

Perintah ini membuat android-vndk-$(TARGET_ARCH).zip di bawah $DIST_DIR . Contoh di bawah ini adalah file ZIP snapshot VNDK arm64 dengan artefak build. File yang dicetak tebal adalah file yang baru ditambahkan ke snapshot VNDK normal (ditunjukkan pada Gambar 1) dan menyertakan file JSON (yang menyimpan cflags dari setiap perpustakaan) 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

Mengunggah snapshot VNDK

Snapshot VNDK diperiksa di pohon sumber di bawah /prebuilts/vndk/v VER , di mana VER sama dengan versi snapshot VNDK (yang mengikuti versi SDK dari rilis Android yang sesuai). Misalnya, snapshot Android 8.1 VNDK memiliki versi 27.

Menggunakan skrip update.py

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

  1. Di /prebuilts/vndk/v VER , menggunakan repo start untuk membuat cabang Git baru.
  2. Mengambil dan membuka ritsleting artefak build snapshot VNDK.
  3. Jalankan gen_buildfiles.py untuk membuat file build secara otomatis ( Android.bp ).
  4. Jalankan check_gpl_license.py untuk memverifikasi pustaka bawaan yang dilisensikan di bawah Lisensi Publik Umum (GPL) memiliki sumber yang dirilis di pohon sumber saat ini.
  5. Menggunakan git commit untuk melakukan perubahan baru.

Menggunakan snapshot VNDK yang dibuat secara lokal

Anda juga dapat menggunakan snapshot VNDK yang dibuat secara lokal. Saat opsi --local ditentukan, skrip update.py mengambil artefak build snapshot VNDK dari $DIST_DIR lokal (bukan dari server build Android) dan melewati pemeriksaan lisensi GPL dan langkah git commit . Untuk menginstal snapshot VNDK yang dibuat secara lokal, navigasikan ke direktori tujuan dan gunakan skrip update.py .

Sintaksis:

python update.py VER --local

Contoh perintah untuk memperbarui snapshot Android 8.1 VNDK dengan artefak build lokal:

python update.py 27 --local

Contoh struktur direktori dari snapshot VNDK yang dibuat 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 .

Memasang snapshot VNDK

Citra sistem menginstal pustaka snapshot VNDK pada waktu pembuatan 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 membangun modul vendor saat ini dan instal hanya modul snapshot yang diperlukan untuk modul vendor.
  • Opsi 2: PRODUCT_EXTRA_VNDK_VERSIONS . Instal modul snapshot VNDK terlepas dari modul vendor saat ini. Ini menginstal snapshot VNDK bawaan yang tercantum di PRODUCT_EXTRA_VNDK_VERSIONS tanpa menautkannya ke modul lain mana pun pada waktu pembuatan.

Menyetel BOARD_VNDK_VERSION

BOARD_VNDK_VERSION menunjukkan versi VNDK yang harus dibuat oleh 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, terjadi kesalahan build.

Mendefinisikan BOARD_VNDK_VERSION juga memungkinkan modul VNDK untuk diinstal. Modul vendor tertaut dengan versi snapshot VNDK yang ditentukan dalam BOARD_VNDK_VERSION pada waktu pembuatan (ini tidak membuat modul VNDK saat ini di sumber sistem). Saat mengunduh hierarki sumber lengkap dari repositori, baik sistem maupun sumber vendor didasarkan pada rilis Android yang sama.

Menyetel PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS mencantumkan versi VNDK tambahan yang akan dipasang. Biasanya cukup memiliki satu snapshot VNDK untuk partisi vendor saat ini. 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 citra sistem. Dengan menyetel 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 pembangunan akan mencari snapshot bawaan dari daftar versi di direktori prebuilts/vndk . Jika sistem build menemukan semua snapshot yang terdaftar, sistem akan menginstal file snapshot tersebut ke setiap VNDK APEX ( out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.v VER . Versi yang hilang menghasilkan kesalahan build.

Modul VNDK tidak terhubung dengan modul vendor pada waktu pembuatan 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 mendefinisikan versi VNDK untuk modul VNDK saat ini di sumber sistem. Nilai diatur secara otomatis:

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

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

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

Ringkasan pengaturan versi VNDK

Tabel di bawah ini merangkum pengaturan versi VNDK.

Penjual
Membangun
Papan
Versi: kapan
SDK
Melepaskan
Platform
Versi: kapan
Versi: kapan
Properti
Instal Direktori
Modul VNDK saat ini current Sebelum CODE_NAME CODE_NAME /system/apex/com.android.vndk.v CODE_NAME
Setelah SDK_VER SDK_VER /system/apex/com.android.vndk.v SDK_VER
Modul snapshot bawaan VNDK_VER
untuk snapshot
Sebelum atau sesudah CODE_NAME
atau SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.v VNDK_VER
  • Versi Papan ( BOARD_VNDK_VERSION ). Versi VNDK yang harus dibuat oleh modul vendor. Setel ke current jika modul vendor dapat terhubung dengan modul sistem saat ini.
  • Versi Platform ( PLATFORM_VNDK_VERSION ). Versi VNDK yang sedang dibangun oleh modul sistem saat ini. Dibangun hanya ketika BOARD_VNDK_VERSION sama dengan arus.
  • Properti Versi ( ro.vndk.version ). Properti yang menentukan versi VNDK yang harus dijalankan oleh binari dan lib di vendor.img. Disimpan di vendor.img di /vendor/default.prop .