Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Vendor Native Development Kit (VNDK)

Vendor Native Development Kit (VNDK) adalah kumpulan library khusus untuk vendor untuk mengimplementasikan HAL mereka. VNDK dikirimkan dalam system.img dan secara dinamis ditautkan ke kode vendor saat runtime.

Mengapa VNDK?

Android 8.0 dan yang lebih tinggi memungkinkan pembaruan hanya kerangka kerja di mana partisi sistem dapat ditingkatkan ke versi terbaru sementara partisi vendor dibiarkan tidak berubah. Ini menyiratkan bahwa binari yang dibangun pada waktu yang berbeda harus dapat bekerja satu sama lain; VNDK mencakup perubahan API/ABI di seluruh rilis Android.

Pembaruan hanya kerangka kerja mencakup tantangan berikut:

  • Ketergantungan antara modul kerangka dan modul vendor . Sebelum Android 8.0, modul dari kedua sisi dapat terhubung dengan modul dari sisi lain. Namun, dependensi dari modul vendor memberlakukan batasan yang tidak diinginkan untuk pengembangan modul kerangka kerja.
  • Ekstensi ke perpustakaan AOSP . Android 8.0 dan lebih tinggi mengharuskan semua perangkat Android untuk lulus CTS saat partisi sistem diganti dengan Generic System Image (GSI) standar. Namun, karena vendor memperluas pustaka AOSP untuk meningkatkan kinerja atau menambahkan fungsionalitas tambahan untuk implementasi HIDL mereka, mem-flash partisi sistem dengan GSI standar dapat merusak implementasi HIDL vendor. (Untuk panduan mencegah kerusakan tersebut, lihat ekstensi VNDK .)

Untuk mengatasi tantangan ini, Android 8.0 memperkenalkan beberapa teknik seperti VNDK (dijelaskan di bagian ini), HIDL , hwbinder, device tree overlay , dan sepolicy overlay.

Sumber daya VNDK

Bagian ini mencakup sumber daya VNDK berikut:

  • Konsep VNDK (di bawah) menjelaskan kerangka kerja bersama perpustakaan, proses yang sama HAL (SP-HAL), dan terminologi VNDK.
  • Ekstensi VNDK mengklasifikasikan perubahan khusus vendor ke dalam kategori. Misalnya, perpustakaan dengan fungsionalitas yang diperluas di mana modul vendor bergantung harus disalin ke partisi vendor, tetapi perubahan yang tidak kompatibel dengan ABI dilarang.
  • Dukungan Sistem Build VNDK menjelaskan konfigurasi sistem build dan sintaks definisi modul yang terkait dengan VNDK.
  • Alat Definisi VNDK membantu memigrasikan pohon sumber Anda ke Android 8.0 dan yang lebih tinggi.
  • Linker Namespace menyediakan kontrol halus atas tautan pustaka bersama.
  • Direktori, Aturan, dan kebijakan menentukan struktur direktori untuk perangkat yang menjalankan Android 8.0 dan lebih tinggi, aturan VNDK, dan kebijakan terkait.
  • Presentasi Desain VNDK menggambarkan konsep dasar VDNK yang digunakan di Android 8.0 dan yang lebih tinggi.

Konsep VNDK

Di Android 8.0 dan dunia yang lebih tinggi yang ideal, proses kerangka kerja tidak memuat pustaka bersama vendor, semua proses vendor hanya memuat pustaka bersama vendor (dan sebagian dari pustaka bersama kerangka kerja), dan komunikasi antara proses kerangka kerja dan proses vendor diatur oleh HIDL dan perangkat keras bahan pengikat.

Dunia seperti itu mencakup kemungkinan bahwa API publik yang stabil dari pustaka bersama kerangka kerja mungkin tidak cukup untuk pengembang modul vendor (walaupun API dapat berubah di antara rilis Android), yang mengharuskan beberapa bagian pustaka bersama kerangka kerja dapat diakses oleh proses vendor. Selain itu, karena persyaratan kinerja dapat menyebabkan kompromi, beberapa HAL kritis waktu-tanggapan harus diperlakukan secara berbeda.

Bagian berikut merinci bagaimana VNDK menangani pustaka bersama kerangka kerja untuk vendor dan Same-Process HAL (SP-HAL).

Pustaka bersama kerangka kerja untuk vendor

Bagian ini menjelaskan kriteria untuk mengklasifikasikan pustaka bersama yang dapat diakses oleh proses vendor. Ada dua pendekatan untuk mendukung modul vendor di beberapa rilis Android:

  1. Stabilkan ABI/API dari pustaka bersama kerangka kerja . Modul kerangka kerja baru dan modul vendor lama dapat menggunakan pustaka bersama yang sama untuk mengurangi jejak memori dan ukuran penyimpanan. Pustaka bersama yang unik juga menghindari beberapa masalah pemuatan ganda. Namun, biaya pengembangan untuk mempertahankan ABI/API yang stabil tinggi dan tidak realistis untuk menstabilkan semua ABI/API yang diekspor oleh setiap pustaka bersama kerangka kerja.
  2. Salin pustaka bersama kerangka kerja lama . Hadir dengan pembatasan kuat terhadap saluran samping, yang didefinisikan sebagai semua mekanisme untuk berkomunikasi di antara modul kerangka kerja dan modul vendor, termasuk (namun tidak terbatas pada) pengikat, soket, pipa, memori bersama, file bersama, dan properti sistem. Tidak boleh ada komunikasi kecuali protokol komunikasi dibekukan dan stabil (misalnya HIDL melalui hwbinder). Pustaka bersama yang memuat ganda juga dapat menyebabkan masalah; misalnya, jika objek yang dibuat oleh pustaka baru diteruskan ke fungsi dari pustaka lama, kesalahan dapat terjadi karena pustaka ini dapat menginterpretasikan objek secara berbeda.

Pendekatan yang berbeda digunakan tergantung pada karakteristik perpustakaan bersama. Akibatnya, pustaka bersama kerangka kerja diklasifikasikan ke dalam tiga subkategori:

  • Perpustakaan LL-NDK adalah Pustaka Bersama Framework yang dikenal stabil. Pengembang mereka berkomitmen untuk menjaga stabilitas API/ABI mereka.
    • LL-NDK menyertakan pustaka berikut: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so libneuralnetworks.so , libsync.so , libvndksupport.so , dan libvulkan.so ,
  • Pustaka VNDK yang Memenuhi Syarat (VNDK) adalah Pustaka Bersama Framework yang aman untuk disalin dua kali. Modul Kerangka dan Modul Vendor dapat ditautkan dengan salinannya sendiri. Pustaka bersama kerangka kerja dapat menjadi pustaka VNDK yang memenuhi syarat hanya jika memenuhi kriteria berikut:
    • Itu tidak mengirim/menerima IPC ke/dari kerangka kerja.
    • Ini tidak terkait dengan mesin virtual ART.
    • Itu tidak membaca/menulis file/partisi dengan format file yang tidak stabil.
    • Itu tidak memiliki lisensi perangkat lunak khusus yang memerlukan tinjauan hukum.
    • Pemilik kodenya tidak keberatan dengan penggunaan vendor.
  • Framework-Only Libraries (FWK-ONLY) adalah Framework Shared Library yang tidak termasuk dalam kategori yang disebutkan di atas. Perpustakaan ini:
    • Dianggap sebagai detail implementasi internal kerangka kerja.
    • Tidak boleh diakses oleh modul vendor.
    • Memiliki ABI/API yang tidak stabil dan tidak ada jaminan kompatibilitas API/ABI.
    • Tidak disalin.

Proses yang Sama HAL (SP-HAL)

Same-Process HAL ( SP-HAL ) adalah seperangkat HAL yang telah ditentukan yang diimplementasikan sebagai Pustaka Bersama Vendor dan dimuat ke dalam Proses Kerangka . SP-HAL diisolasi oleh namespace penghubung (mengontrol pustaka dan simbol yang terlihat ke pustaka bersama). SP-HAL harus bergantung hanya pada LL-NDK dan VNDK-SP .

VNDK-SP adalah subset library VNDK yang telah ditentukan sebelumnya. Pustaka VNDK-SP ditinjau dengan cermat untuk memastikan pemuatan ganda pustaka VNDK-SP ke dalam proses kerangka kerja tidak menyebabkan masalah. Baik SP-HAL dan VNDK-SP ditentukan oleh Google.

Pustaka berikut adalah SP-HAL yang disetujui:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

Pustaka VNDK-SP menentukan vndk: { support_system_process: true } dalam file Android.bp mereka. Jika vendor_available: false juga ditentukan, maka pustaka ini disebut VNDK-SP-Private dan tidak terlihat oleh SP-HALS .

Berikut ini adalah library framework-only dengan pengecualian RS (FWK-ONLY-RS) :

  • libft2.so (Skrip Render)
  • libmediandk.so (Skrip Render)

Terminologi VNDK

  • Modul merujuk ke Pustaka Bersama atau yang Dapat Dieksekusi .
  • Proses adalah tugas sistem operasi yang dihasilkan dari Executables .
  • Kerangka kerja -istilah yang memenuhi syarat mengacu pada konsep yang terkait dengan partisi sistem .
  • Istilah berkualifikasi vendor mengacu pada konsep yang terkait dengan partisi vendor .

Sebagai contoh:

  • Kerangka yang Dapat Dieksekusi merujuk pada yang dapat dieksekusi di /system/bin atau /system/xbin .
  • Pustaka Bersama Kerangka merujuk ke pustaka bersama di bawah /system/lib[64] .
  • Modul Kerangka mengacu pada Pustaka Bersama Kerangka dan Kerangka yang Dapat Dieksekusi .
  • Proses Kerangka adalah proses yang muncul dari Kerangka Kerja yang Dapat Dieksekusi (mis /system/bin/app_process ).
  • Vendor Executable merujuk ke executable di /vendor/bin
  • Pustaka Bersama Vendor merujuk ke pustaka bersama di bawah /vendor/lib[64] .
  • Modul Vendor mengacu pada Vendor Executables dan Vendor Shared Library .
  • Proses Vendor adalah proses yang dihasilkan dari Vendor Executables (mis
  • /vendor/bin/android.hardware.camera.provider@2.4-service ).

Versi VNDK

Di Android 9, pustaka bersama VNDK diversi:

  • Properti sistem ro.vndk.version secara otomatis ditambahkan ke /vendor/default.prop .
  • Pustaka bersama VNDK diinstal ke /system/lib[64]/vndk-${ro.vndk.version} .
  • Pustaka bersama VNDK-SP diinstal ke /system/lib[64]/vndk-sp-${ro.vndk.version} .
  • File konfigurasi dynamic linker diinstal ke /system/etc/ld.config.${ro.vndk.version}.txt .

Nilai ro.vndk.version dipilih oleh algoritma di bawah ini:

  • Jika BOARD_VNDK_VERSION tidak sama dengan current , gunakan BOARD_VNDK_VERSION .
  • Jika BOARD_VNDK_VERSION sama dengan current :
    • Jika PLATFORM_VERSION_CODENAME adalah REL , gunakan PLATFORM_SDK_VERSION (mis. 28 ).
    • Jika tidak, gunakan PLATFORM_VERSION_CODENAME (mis. P ).

Mengupgrade perangkat

Jika perangkat Android 8.x menonaktifkan penegakan waktu proses VNDK dengan dibuat tanpa BOARD_VNDK_VERSION , perangkat tersebut dapat menambahkan PRODUCT_USE_VNDK_OVERRIDE := false ke BoardConfig.mk saat meningkatkan ke Android 9.

Jika PRODUCT_USE_VNDK_OVERRIDE false , properti ro.vndk.lite akan otomatis ditambahkan ke /vendor/default.prop dan nilainya akan true . Akibatnya, penaut dinamis akan memuat konfigurasi namespace penaut dari /system/etc/ld.config.vndk_lite.txt , yang hanya mengisolasi SP-HAL dan VNDK-SP.

Untuk meningkatkan versi perangkat Android 7.0 atau lebih rendah ke Android 9, tambahkan PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false ke BoardConfig.mk .

Vendor Test Suite (VTS)

Android 9 Vendor Test Suite (VTS) mengamanatkan properti ro.vndk.version yang tidak kosong. Perangkat yang baru diluncurkan dan perangkat yang ditingkatkan versinya harus mendefinisikan ro.vndk.version . Beberapa kasus pengujian VNDK (misalnya VtsVndkFilesTest dan VtsVndkDependencyTest ) mengandalkan properti ro.vndk.version untuk memuat kumpulan data pustaka VNDK yang memenuhi syarat yang cocok.

Jika properti ro.product.first_api_level lebih besar dari 27, properti ro.vndk.lite tidak boleh ditentukan. VtsTreblePlatformVersionTest akan gagal jika ro.vndk.lite didefinisikan di perangkat Android 9 yang baru diluncurkan.

Sejarah dokumen

Bagian ini melacak perubahan pada dokumentasi VNDK.

Android 9 perubahan

  • Tambahkan bagian pembuatan versi VNDK.
  • Tambahkan bagian VTS.
  • Beberapa kategori VNDK telah diganti namanya:
    • LL-NDK-Indirect telah diubah namanya menjadi LL-NDK-Private.
    • VNDK-Indirect telah diubah namanya menjadi VNDK-Private.
    • VNDK-SP-Indirect-Private telah diubah namanya menjadi VNDK-SP-Private.
    • VNDK-SP-Indirect telah dihapus.

Android 8.1 perubahan

  • Pustaka SP-NDK telah digabungkan ke dalam pustaka LL-NDK.
  • Ganti libui.so dengan libft2.so di bagian namespace RS. Itu adalah kesalahan untuk memasukkan libui.so .
  • Tambahkan libGLESv3.so dan libandroid_net.so ke pustaka LL-NDK.
  • Tambahkan libion.so ke pustaka VNDK-SP.
  • Hapus libstdc++.so dari pustaka LL-NDK. Gunakan libc++.so sebagai gantinya. Beberapa versi rantai alat mandiri dapat menambahkan -lstdc++ ke tanda tautan default. Untuk menonaktifkan default, tambahkan -nodefaultlibs -lc -lm -ldl ke LDFLAGS .
  • Pindahkan libz.so dari pustaka LL-NDK ke VNDK-SP. Dalam beberapa konfigurasi, libz.so dapat terus menjadi LL-NDK. Namun, seharusnya tidak ada perbedaan yang dapat diamati.