เครื่องมือคำจำกัดความ VNDK ช่วยให้ผู้ให้บริการย้ายข้อมูลซอร์สทรีไปยังสภาพแวดล้อม Android 8.0 ได้ เครื่องมือนี้จะสแกนไฟล์ไบนารีในระบบและอิมเมจของผู้ให้บริการ จากนั้นจะแก้ไขทรัพยากร Dependency เครื่องมือนี้ยังตรวจหาการละเมิดแนวคิด VNDK และให้ข้อมูลเชิงลึก/คำแนะนำในการย้ายโมดูลระหว่างพาร์ติชันได้ด้วย โดยอิงตามกราฟการขึ้นต่อกันของโมดูล หากมีการระบุอิมเมจระบบทั่วไป (GSI) เครื่องมือคำจำกัดความ VNDK จะเปรียบเทียบอิมเมจระบบกับ GSI และกำหนดไลบรารีเพิ่มเติมได้
ส่วนนี้ครอบคลุมคำสั่ง 3 รายการที่ใช้บ่อยสำหรับเครื่องมือคำจำกัดความ VNDK
vndk
. คำนวณ VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES และ EXTRA_VENDOR_LIBRARIES สำหรับวิธีแก้ปัญหาในระบบบิลด์ใน Android 8.0 และ สูงกว่าcheck-dep
ตรวจสอบทรัพยากร Dependency ของโมดูลที่ละเมิดจาก โมดูลของผู้ให้บริการไปยังไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กที่ไม่มีสิทธิ์deps
พิมพ์การขึ้นต่อกันระหว่างไลบรารีที่ใช้ร่วมกันและ ไฟล์ที่เรียกใช้งานได้
ดูรายละเอียดเพิ่มเติมเกี่ยวกับการใช้คำสั่งขั้นสูงได้ในไฟล์ README.md ในที่เก็บเครื่องมือคำจำกัดความ VNDK
vndk
ส่วนคำสั่งย่อย vndk
จะโหลดไลบรารีที่ใช้ร่วมกันและไฟล์ที่เรียกใช้งานได้
จากพาร์ติชันระบบและพาร์ติชันของผู้ให้บริการ จากนั้นจะแก้ปัญหาการขึ้นต่อกันของโมดูล
เพื่อกำหนดไลบรารีที่ต้องคัดลอกไปยัง
/system/lib[64]/vndk-sp-${VER}
และ /vendor/lib[64]
ตัวเลือกสำหรับคำสั่งย่อย vndk
มีดังนี้
ตัวเลือก | คำอธิบาย |
---|---|
--system |
ชี้ไปยังไดเรกทอรีที่มีไฟล์ที่อยู่ในพาร์ติชันระบบ |
--vendor |
ชี้ไปยังไดเรกทอรีที่มีไฟล์ที่อยู่ในพาร์ติชันของผู้ขาย |
--aosp-system |
ชี้ไปยังไดเรกทอรีที่มีไฟล์ที่อยู่ในอิมเมจระบบทั่วไป (GSI) |
--load-extra-deps |
ชี้ไปยังไฟล์ที่อธิบายทรัพยากร Dependency โดยนัย เช่น
dlopen() |
ตัวอย่างเช่น หากต้องการคำนวณชุดไลบรารี VNDK ให้เรียกใช้
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
ระบุการอ้างอิงเพิ่มเติมด้วยรูปแบบไฟล์ที่เรียบง่าย แต่ละบรรทัดแสดงถึง ความสัมพันธ์ โดยไฟล์ก่อนเครื่องหมายโคลอนจะขึ้นอยู่กับไฟล์หลัง เครื่องหมายโคลอน เช่น
/system/lib/libart.so: /system/lib/libart-compiler.so
บรรทัดนี้ช่วยให้เครื่องมือคำจำกัดความ VNDK ทราบว่า libart.so
ขึ้นอยู่กับ libart-compiler.so
ปลายทางการติดตั้ง
เครื่องมือคำจำกัดความ VNDK แสดงรายการไลบรารีและไดเรกทอรีการติดตั้งที่เกี่ยวข้อง สำหรับหมวดหมู่ต่อไปนี้
หมวดหมู่ | ไดเรกทอรี |
---|---|
vndk_sp | ต้องติดตั้งใน /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | ต้องติดตั้งใน /vendor/lib[64]/vndk-sp |
extra_vendor_libs | ต้องติดตั้งใน /vendor/lib[64] |
สร้างเทมเพลตระบบ
หลังจากรวบรวมเอาต์พุตจากเครื่องมือคำจำกัดความ VNDK แล้ว ผู้ให้บริการสามารถสร้าง
Android.mk
และกรอกข้อมูลใน VNDK_SP_LIBRARIES
,
VNDK_SP_EXT_LIBRARIES
และ EXTRA_VENDOR_LIBRARIES
เพื่อ
ทำให้กระบวนการคัดลอกไลบรารีไปยังปลายทางการติดตั้งที่กำหนด
โดยอัตโนมัติ
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
คำสั่งย่อย check-dep
จะสแกนโมดูลของผู้ให้บริการและตรวจสอบ
การอ้างอิง หากตรวจพบการละเมิด ระบบจะพิมพ์การใช้งานไลบรารีและสัญลักษณ์ที่ละเมิดซึ่งขึ้นอยู่กับรายการต่อไปนี้
./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
เช่น เอาต์พุตตัวอย่างต่อไปนี้แสดงการอ้างอิงที่ละเมิดจาก
libRS_internal.so
ไปยัง 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
ตัวเลือกสำหรับคำสั่งย่อย check-dep
มีดังนี้
ตัวเลือก | คำอธิบาย |
---|---|
--tag-file |
ต้องอ้างอิงถึงไฟล์แท็กไลบรารีที่มีสิทธิ์ (อธิบายไว้ด้านล่าง) ซึ่งเป็นสเปรดชีตที่ Google จัดทำขึ้นซึ่งอธิบายหมวดหมู่ของเฟรมเวิร์กที่แชร์ไลบรารี |
--module-info |
ชี้ไปยัง module-info.json ที่สร้างโดยระบบบิลด์ของ Android
ซึ่งจะช่วยให้เครื่องมือคำจำกัดความ VNDK เชื่อมโยงโมดูลไบนารีกับซอร์สโค้ดได้
|
ไฟล์แท็กไลบรารีที่มีสิทธิ์
Google มีสเปรดชีต VNDK ที่มีสิทธิ์ (เช่น
eligible-list.csv
) ซึ่งติดแท็กไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กที่
โมดูลของผู้ให้บริการใช้ได้
ติดแท็ก | คำอธิบาย |
---|---|
LL-NDK | ไลบรารีที่ใช้ร่วมกันซึ่งมี ABI/API ที่เสถียรซึ่งทั้งเฟรมเวิร์กและโมดูลของผู้ให้บริการใช้ได้ |
LL-NDK-Private | ทรัพยากร Dependency ส่วนตัวของไลบรารี LL-NDK โมดูลของผู้ให้บริการต้องไม่เข้าถึง ไลบรารีเหล่านี้โดยตรง |
VNDK-SP | การขึ้นต่อกันของไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์ก SP-HAL |
VNDK-SP-Private | การอ้างอิง VNDK-SP ที่โมดูลของผู้ให้บริการทั้งหมดเข้าถึงโดยตรงไม่ได้ |
VNDK | ไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กซึ่งพร้อมใช้งานกับโมดูลของผู้ให้บริการ (ยกเว้น SP-HAL และ SP-HAL-Dep) |
VNDK-Private | การขึ้นต่อกันของ VNDK ที่โมดูลของผู้ให้บริการทั้งหมดเข้าถึงโดยตรงไม่ได้ |
FWK-ONLY | ไลบรารีที่แชร์ซึ่งมีเฉพาะเฟรมเวิร์กและโมดูลของผู้ให้บริการต้องเข้าถึงไม่ได้ (ทั้งโดยตรงและโดยอ้อม) |
FWK-ONLY-RS | ไลบรารีที่แชร์ซึ่งมีเฉพาะเฟรมเวิร์กเท่านั้นและผู้ให้บริการต้องไม่เข้าถึง โมดูล (ยกเว้นการใช้งาน RS) |
ตารางต่อไปนี้อธิบายแท็กที่ใช้สำหรับไลบรารีที่แชร์ของผู้ให้บริการ
ติดแท็ก | คำอธิบาย |
---|---|
SP-HAL | ไลบรารีที่ใช้ร่วมกันของการติดตั้งใช้งาน HAL ในกระบวนการเดียวกัน |
SP-HAL-Dep | ทรัพยากร Dependency ของไลบรารีที่ใช้ร่วมกันของผู้ให้บริการ SP-HAL (เรียกอีกอย่างว่าทรัพยากร Dependency ของ SP-HAL ยกเว้น LL-NDK และ VNDK-SP) |
VND-ONLY | ไลบรารีที่ใช้ร่วมกันซึ่งเฟรมเวิร์กมองไม่เห็นและโมดูลเฟรมเวิร์กต้องเข้าถึงไม่ได้ ระบบจะแท็กไลบรารี VNDK แบบขยายที่คัดลอกเป็น VND-ONLY ด้วย |
ความสัมพันธ์ระหว่างแท็ก

รูปที่ 1 ความสัมพันธ์ระหว่างแท็ก
deps
หากต้องการแก้ไขข้อบกพร่องของทรัพยากร Dependency ของไลบรารี คำสั่งย่อย deps
จะพิมพ์ทรัพยากร Dependency ของโมดูล
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
เอาต์พุตประกอบด้วยหลายบรรทัด บรรทัดที่ไม่มีอักขระแท็บ จะเริ่มต้นส่วนใหม่ บรรทัดที่มีอักขระแท็บจะขึ้นอยู่กับส่วนก่อนหน้า เช่น
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
เอาต์พุตนี้แสดงว่า ld-android.so
ไม่มี Dependency
และ libc.so
ขึ้นอยู่กับ libdl.so
เมื่อระบุตัวเลือก --revert
deps
คำสั่งย่อยจะพิมพ์การใช้งานไลบรารี (การอ้างอิง
แบบย้อนกลับ)
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
เช่น
/system/lib/ld-android.so /system/lib/libdl.so
เอาต์พุตนี้แสดงว่า ld-android.so
ใช้โดย
libdl.so
หรือกล่าวอีกนัยหนึ่งคือ libdl.so
ขึ้นอยู่กับ
ld-android.so
นอกจากนี้ เอาต์พุตนี้ยังแสดงว่า
libdl.so
เป็นผู้ใช้ ld-android.so
เพียงรายเดียว
เมื่อระบุตัวเลือก --symbol
คำสั่งย่อย deps
จะพิมพ์สัญลักษณ์ที่ใช้
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
เช่น
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
เอาต์พุตนี้แสดงว่า libc.so
ขึ้นอยู่กับฟังก์ชัน 6 รายการที่ส่งออกจาก libdl.so
หากระบุทั้งตัวเลือก --symbol
และตัวเลือก
--revert
ระบบจะพิมพ์สัญลักษณ์ที่ผู้ใช้ใช้