Alat definisi VNDK

Alat definisi VNDK membantu vendor memigrasikan hierarki sumber mereka ke Lingkungan Android 8.0. Alat ini memindai file biner dalam sistem dan vendor image dasar akan mengatasi dependensi. Berdasarkan grafik dependensi modul, juga dapat mendeteksi pelanggaran terhadap konsep VNDK dan memberikan insight/saran untuk memindahkan modul antarpartisi. Jika Generic System Image (GSI) sudah ditentukan, alat definisi VNDK dapat membandingkan sistem Anda image aplikasi dengan GSI dan menentukan library yang diperluas.

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

  • vndk. Komputasi VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES, dan EXTRA_VENDOR_LIBRARIES untuk solusi sistem build di Android 8.0 dan lebih tinggi.
  • check-dep. Periksa dependensi modul yang melanggar dari modul vendor ke pustaka bersama kerangka kerja yang tidak memenuhi syarat.
  • deps. Cetak dependensi antara pustaka bersama dan file yang dapat dieksekusi.

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

{i>vndk<i}

Subperintah vndk memuat library bersama dan file yang dapat dieksekusi dari partisi sistem dan partisi vendor, kemudian menyelesaikan modul dependensi untuk menentukan library /system/lib[64]/vndk-sp-${VER} dan /vendor/lib[64]. Opsi untuk subperintah vndk mencakup:

Opsi Deskripsi
--system Arahkan kursor ke direktori yang berisi file yang berada di sistem partisi.
--vendor Arahkan kursor ke direktori yang berisi file yang berada di vendor partisi.
--aosp-system Arahkan kursor ke direktori yang berisi file yang berada di direktori generik image sistem (GSI).
--load-extra-deps Arahkan kursor ke file yang menjelaskan dependensi implisit, seperti dlopen().

Misalnya, untuk mengomputasi kumpulan library VNDK, jalankan perintah Subperintah vndk:

./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 tanda titik dua tergantung pada file setelah titik dua. Contoh:

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

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

Tujuan penginstalan

Alat definisi VNDK mencantumkan library dan direktori penginstalan yang sesuai untuk kategori berikut:

Kategori Direktori
{i>vndk_sp<i} Harus diinstal ke /system/lib[64]/vndk-sp-${VER}
{i>vndk_sp_ext<i} Harus diinstal ke /vendor/lib[64]/vndk-sp
ekstra_vendor_libs Harus diinstal ke /vendor/lib[64]

Membangun template sistem

Setelah mengumpulkan {i>output<i} dari alat definisi VNDK, vendor dapat membuat Android.mk dan isi VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES dan EXTRA_VENDOR_LIBRARIES ke mengotomatiskan proses penyalinan library ke penginstalan yang ditentukan tujuan.

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 dependensi. Jika mendeteksi pelanggaran, Google akan mencetak penggunaan library dan 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 output berikut menunjukkan dependensi 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 mencakup:

Opsi Deskripsi
--tag-file Harus merujuk ke file tag library yang memenuhi syarat (dijelaskan di bawah), yang merupakan Spreadsheet yang disediakan Google yang mendeskripsikan kategori framework yang dibagikan library.
--module-info Mengarah ke module-info.json yang dibuat oleh build Android sistem file. Membantu alat definisi VNDK mengaitkan modul biner dengan modul sumber pada kode sumber.

File tag library yang memenuhi syarat

Google menyediakan spreadsheet VNDK yang memenuhi syarat (mis. eligible-list.csv) yang memberi tag pada library bersama framework yang dapat digunakan oleh modul vendor:

Tag Deskripsi
LL-NDK Library bersama dengan ABI/API stabil yang dapat digunakan oleh keduanya modul vendor dan framework.
LL-NDK-Pribadi Dependensi pribadi library LL-NDK. Modul vendor tidak boleh mengakses {i>library<i} ini secara langsung.
VNDK-SP Dependensi library bersama framework SP-HAL.
VNDK-SP-Pribadi Dependensi VNDK-SP yang tidak dapat diakses langsung oleh semua vendor modul.
VNDK Library bersama framework yang tersedia untuk modul vendor (kecuali SP-HAL dan SP-HAL-Dep).
VNDK-Pribadi Dependensi VNDK yang tidak dapat diakses langsung oleh semua vendor modul.
KHUSUS FWK Library bersama khusus framework yang tidak boleh diakses oleh vendor modul (baik secara langsung maupun tidak langsung).
Khusus FWK Library bersama khusus framework yang tidak boleh diakses oleh vendor modul (kecuali untuk penggunaan RS).

Tabel berikut menjelaskan tag yang digunakan untuk library bersama vendor:

Tag Deskripsi
SP-HAL Library bersama implementasi HAL dengan proses yang sama.
SP-HAL-Dep Dependensi library bersama vendor SP-HAL (juga disebut dependensi SP-HAL kecuali LL-NDK dan VNDK-SP).
KHUSUS VND Library bersama yang tidak terlihat di framework yang tidak boleh diakses oleh modul framework. Library VNDK yang diperluas yang disalin diberi tag sebagai KHUSUS VND.

Hubungan antar-tag:

Hubungan antar-tag.

Gambar 1. Hubungan antar-tag.

dependensi

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

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

Output terdiri dari beberapa baris. Baris tanpa karakter tab memulai bagian baru. Baris dengan karakter tab bergantung pada bagian. Contoh:

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

Output ini menunjukkan bahwa ld-android.so tidak memiliki dependensi dan libc.so bergantung pada libdl.so.

Saat menentukan opsi --revert, deps subperintah mencetak penggunaan library (dibalikkan dependensi):

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

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, {i>output<i} ini menunjukkan bahwa libdl.so adalah satu-satunya pengguna ld-android.so.

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

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

Contoh:

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

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