Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Alat Definisi VNDK

Alat definisi VNDK membantu vendor memigrasikan struktur pohon sumber mereka ke lingkungan Android 8.0. Alat ini memindai file biner di sistem dan gambar vendor lalu menyelesaikan ketergantungan. Berdasarkan grafik ketergantungan modul, alat ini juga dapat mendeteksi pelanggaran konsep VNDK dan memberikan wawasan / saran untuk memindahkan modul antar partisi. Jika Generic System Image (GSI) ditentukan, fitur definisi VNDK dapat membandingkan image sistem Anda dengan GSI dan menentukan library yang diperluas.

Bagian ini mencakup tiga perintah yang sering digunakan untuk alat definisi VNDK:

  • vndk . Hitung VNDK_SP_LIBRARY, VNDK_SP_EXT_LIBRARY, dan EXTRA_VENDOR_LIBRARY untuk solusi sistem build di Android 8.0 dan lebih tinggi.
  • check-dep . Periksa dependensi modul yang melanggar dari modul vendor ke library bersama framework yang tidak memenuhi syarat.
  • deps . Cetak dependensi antara perpustakaan bersama dan file yang dapat dieksekusi.

Untuk detail selengkapnya tentang penggunaan perintah lanjutan, lihat file README.md di repositori Alat Definisi VNDK.

vndk

Subperintah vndk memuat library dan executable bersama dari partisi sistem dan partisi vendor, lalu menyelesaikan dependensi modul untuk menentukan library yang harus disalin ke /system/lib[64]/vndk-sp-${VER} dan /vendor/lib[64] . Opsi untuk vndk meliputi:

Pilihan Deskripsi
--system Arahkan ke direktori yang berisi file yang akan berada di partisi sistem.
--vendor Arahkan ke direktori yang berisi file yang akan berada di partisi vendor.
--aosp-system Arahkan ke direktori yang berisi file yang akan berada di Generic System Image (GSI).
--load-extra-deps Arahkan ke file yang menjelaskan dependensi implisit, seperti dlopen() .

Misalnya, untuk menghitung kumpulan pustaka VNDK, jalankan vndk berikut:

./vndk_definition_tool.py vndk \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor \
    --aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_ab/system\
    --load-extra-deps dlopen.dep

Tentukan dependensi tambahan dengan format file sederhana. Setiap baris mewakili hubungan, dengan file sebelum titik dua bergantung pada file setelah titik dua. Sebagai contoh:

/system/lib/libart.so: /system/lib/libart-compiler.so

Baris ini memberi tahu alat definisi libart.so bahwa libart.so bergantung pada libart-compiler.so .

Tujuan instalasi

Alat definisi VNDK mencantumkan pustaka dan direktori instal terkait untuk kategori berikut:

Kategori Direktori
vndk_sp Harus menginstal ke /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext Harus menginstal ke /vendor/lib[64]/vndk-sp
extra_vendor_libs Harus menginstal ke /vendor/lib[64]

Buat template sistem

Setelah mengumpulkan keluaran dari fitur definisi VNDK, vendor dapat membuat Android.mk dan mengisi VNDK_SP_LIBRARIES , VNDK_SP_EXT_LIBRARIES , dan EXTRA_VENDOR_LIBRARIES untuk mengotomatiskan proses menyalin library ke tujuan penginstalan yang ditentukan.

ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
VNDK_SP_LIBRARIES := ##_VNDK_SP_##
VNDK_SP_EXT_LIBRARIES := ##_VNDK_SP_EXT_##
EXTRA_VENDOR_LIBRARIES := ##_EXTRA_VENDOR_LIBS_##

#-------------------------------------------------------------------------------
# VNDK Modules
#-------------------------------------------------------------------------------
LOCAL_PATH := $(call my-dir)

define define-vndk-lib
include $$(CLEAR_VARS)
LOCAL_MODULE := $1.$2
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
LOCAL_STRIP_MODULE := false
LOCAL_MULTILIB := first
LOCAL_MODULE_TAGS := optional
LOCAL_INSTALLED_MODULE_STEM := $1.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_RELATIVE_PATH := $3
LOCAL_VENDOR_MODULE := $4
include $$(BUILD_PREBUILT)

ifneq ($$(TARGET_2ND_ARCH),)
ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true)
include $$(CLEAR_VARS)
LOCAL_MODULE := $1.$2
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
LOCAL_STRIP_MODULE := false
LOCAL_MULTILIB := 32
LOCAL_MODULE_TAGS := optional
LOCAL_INSTALLED_MODULE_STEM := $1.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_RELATIVE_PATH := $3
LOCAL_VENDOR_MODULE := $4
include $$(BUILD_PREBUILT)
endif  # TARGET_TRANSLATE_2ND_ARCH is not true
endif  # TARGET_2ND_ARCH is not empty
endef

$(foreach lib,$(VNDK_SP_LIBRARIES),\
    $(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,)))
$(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\
    $(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true)))
$(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\
    $(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true)))


#-------------------------------------------------------------------------------
# Phony Package
#-------------------------------------------------------------------------------

include $(CLEAR_VARS)
LOCAL_MODULE := $(YOUR_DEVICE_NAME)-vndk
LOCAL_MODULE_TAGS := optional
LOCAL_REQUIRED_MODULES := \
    $(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \
    $(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \
    $(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES))
include $(BUILD_PHONY_PACKAGE)

endif  # ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)

check-dep

Subperintah check-dep memindai modul vendor dan memeriksa dependensinya. Jika mendeteksi pelanggaran, itu mencetak perpustakaan dependen yang melanggar dan penggunaan simbol:

./vndk_definition_tool.py check-dep \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor \
    --tag-file eligible-list.csv \
    --module-info ${ANDROID_PRODUCT_OUT}/module-info.json \
    1> check_dep.txt \
    2> check_dep_err.txt

Misalnya, contoh keluaran berikut menunjukkan ketergantungan yang melanggar dari libRS_internal.so ke libmediandk.so :

/system/lib/libRS_internal.so
        MODULE_PATH: frameworks/rs
        /system/lib/libmediandk.so
                AImageReader_acquireNextImage
                AImageReader_delete
                AImageReader_getWindow
                AImageReader_new
                AImageReader_setImageListener

Opsi untuk subperintah check-dep meliputi:

Pilihan Deskripsi
--tag-file Harus mengacu pada file tag pustaka yang memenuhi syarat (dijelaskan di bawah), yang merupakan spreadsheet yang disediakan Google yang menjelaskan kategori pustaka bersama framework.
--module-info module-info.json ke module-info.json dibuat oleh sistem build Android. Ini membantu alat definisi VNDK mengasosiasikan modul biner dengan kode sumber.

File tag perpustakaan yang memenuhi syarat

Google menyediakan spreadsheet VNDK yang memenuhi syarat (misalnya, daftar eligible-list.csv ) yang menandai pustaka bersama kerangka kerja yang dapat digunakan oleh modul vendor:

Menandai Deskripsi
LL-NDK Library bersama dengan ABI / API stabil yang dapat digunakan oleh framework dan modul vendor.
LL-NDK-Private Dependensi pribadi library LL-NDK. Modul vendor tidak boleh mengakses perpustakaan ini secara langsung.
VNDK-SP Kerangka kerja SP-HAL dependensi pustaka bersama.
VNDK-SP-Private Dependensi VNDK-SP yang tidak langsung dapat diakses oleh semua modul vendor.
VNDK Perpustakaan bersama kerangka kerja yang tersedia untuk modul vendor (kecuali SP-HAL dan SP-HAL-Dep).
VNDK-Private Dependensi VNDK yang tidak langsung dapat diakses oleh semua modul vendor.
FWK-ONLY Pustaka bersama kerangka kerja saja yang tidak boleh diakses oleh modul vendor (baik secara langsung maupun tidak langsung).
KHUSUS FWK-RS Pustaka bersama kerangka kerja saja yang tidak boleh diakses oleh modul vendor (kecuali untuk penggunaan RS).

Tabel berikut menjelaskan tag yang digunakan untuk pustaka bersama vendor:

Menandai Deskripsi
SP-HAL Pustaka bersama implementasi HAL dengan proses yang sama.
SP-HAL-Dep Dependensi library bersama vendor SP-HAL (alias dependensi SP-HAL tidak termasuk LL-NDK dan VNDK-SP).
KHUSUS VND Library bersama framework-invisible yang tidak boleh diakses oleh modul framework. Library VNDK tambahan yang disalin juga akan diberi tag sebagai VND-ONLY.

Hubungan antar tag:

Gambar 1. Hubungan antar tag.

deps

Untuk men-debug dependensi library, deps mencetak dependensi modul:

./vndk_definition_tool.py deps \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

Outputnya terdiri dari beberapa baris. Baris tanpa karakter tab memulai bagian baru. Garis dengan karakter tab bergantung pada bagian sebelumnya. Sebagai contoh:

/system/lib/ld-android.so
/system/lib/libc.so
        /system/lib/libdl.so

Keluaran ini menunjukkan bahwa ld-android.so tidak memiliki ketergantungan dan libc.so bergantung pada libdl.so .

Saat menentukan opsi --revert , deps subcommand mencetak penggunaan perpustakaan (dependensi terbalik):

./vndk_definition_tool.py deps \
    --revert \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

Sebagai contoh:

/system/lib/ld-android.so
        /system/lib/libdl.so
        

Output ini menunjukkan bahwa ld-android.so digunakan oleh libdl.so , atau dengan kata lain, libdl.so bergantung pada ld-android.so . Selain itu, keluaran ini menunjukkan bahwa libdl.so adalah satu-satunya pengguna ld-android.so .

Saat menentukan opsi --symbol , --symbol deps mencetak simbol yang digunakan:

./vndk_definition_tool.py deps \
    --symbol \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor
    
.dll

Sebagai contoh:

/system/lib/libc.so
        /system/lib/libdl.so
                android_get_application_target_sdk_version
                dl_unwind_find_exidx
                dlclose
                dlerror
                dlopen
                dlsym

Keluaran ini menunjukkan bahwa libc.so bergantung pada 6 fungsi yang diekspor dari libdl.so . Jika opsi --symbol dan --revert ditentukan, simbol yang digunakan oleh pengguna akan dicetak.