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 image vendor, lalu me-resolve dependensi. Berdasarkan grafik dependensi modul, alat ini juga dapat mendeteksi pelanggaran terhadap konsep VNDK dan memberikan insight/saran untuk memindahkan modul antar-partisi. Jika Generic System Image (GSI) ditentukan, alat definisi VNDK dapat membandingkan image sistem Anda dengan GSI dan menentukan library yang diperluas.

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

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

Untuk mengetahui detail selengkapnya tentang penggunaan perintah lanjutan, lihat file README.md di repositori VNDK Definition Tool.

vndk

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

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

Misalnya, untuk menghitung set library VNDK, jalankan subperintah 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. Contoh:

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

Baris ini memungkinkan alat definisi VNDK mengetahui 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
vndk_sp Harus diinstal ke /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext Harus diinstal ke /vendor/lib[64]/vndk-sp
extra_vendor_libs Harus diinstal ke /vendor/lib[64]

Membuat template sistem

Setelah mengumpulkan output dari alat definisi VNDK, vendor dapat membuat Android.mk dan mengisi VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES, dan EXTRA_VENDOR_LIBRARIES untuk mengotomatiskan proses penyalinan library ke tujuan penginstalan yang ditetapkan.

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, kode ini akan mencetak penggunaan library dan simbol dependen yang melanggar:

./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 menjelaskan kategori library bersama framework.
--module-info Menunjuk ke module-info.json yang dihasilkan oleh sistem build Android. Hal ini membantu alat definisi VNDK mengaitkan modul biner dengan kode sumber.

File tag library yang memenuhi syarat

Google menyediakan spreadsheet VNDK yang memenuhi syarat (misalnya 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 modul framework dan vendor.
LL-NDK-Private Dependensi pribadi library LL-NDK. Modul vendor tidak boleh mengakses library ini secara langsung.
VNDK-SP Dependensi library bersama framework SP-HAL.
VNDK-SP-Private Dependensi VNDK-SP yang tidak dapat diakses secara langsung oleh semua modul vendor.
VNDK Library bersama framework yang tersedia untuk modul vendor (kecuali SP-HAL dan SP-HAL-Dep).
VNDK-Pribadi Dependensi VNDK yang tidak dapat diakses secara langsung oleh semua modul vendor.
FWK-ONLY Library bersama khusus framework yang tidak boleh diakses oleh modul vendor (baik secara langsung maupun tidak langsung).
FWK-ONLY-RS Library bersama khusus framework yang tidak boleh diakses oleh modul vendor (kecuali untuk penggunaan RS).

Tabel berikut menjelaskan tag yang digunakan untuk library bersama vendor:

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

Hubungan antar-tag:

Hubungan antar-tag.

Gambar 1. Hubungan antar-tag.

dependensi

Untuk men-debug dependensi library, subperintah deps akan 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 akan memulai bagian baru. Baris dengan karakter tab bergantung pada bagian sebelumnya. 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, subperintah deps akan mencetak penggunaan library (dependensi terbalik):

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

Saat menentukan opsi --symbol, subperintah deps akan 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.