Alat definisi VNDK

Alat definisi VNDK membantu vendor memigrasikan hierarki sumber mereka ke lingkungan Android 8.0. Alat ini memindai file biner di image sistem dan vendor, lalu menyelesaikan 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 executable.

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 menyelesaikan dependensi modul untuk menentukan library yang harus disalin ke /system/lib[64]/vndk-sp-${VER} dan /vendor/lib[64]. Opsi untuk subperintah vndk meliputi:

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 ada di Generic System Image (GSI).
--load-extra-deps Menunjuk 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 merepresentasikan 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 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]

Template sistem build

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 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, alat ini akan mencetak penggunaan simbol dan library 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 meliputi:

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 pustaka 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-Private 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 dalam proses yang sama.
SP-HAL-Dep Dependensi library bersama vendor SP-HAL (juga disebut dependensi SP-HAL tidak termasuk LL-NDK dan VNDK-SP).
KHUSUS VND Library bersama yang tidak terlihat oleh framework dan tidak boleh diakses oleh modul framework. Library VNDK yang diperluas yang disalin juga ditandai sebagai VND-ONLY.

Hubungan antar-tag:

Hubungan antar-tag.

Gambar 1. Hubungan antar-tag.

deps

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 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 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 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 --revert ditentukan, simbol yang digunakan oleh pengguna akan dicetak.