เครื่องมือคำจำกัดความ VNDK ช่วยให้ผู้ขายย้ายแผนผังต้นทางไปยังสภาพแวดล้อม Android 8.0 เครื่องมือนี้จะสแกนไฟล์ไบนารี่ในระบบและอิมเมจของผู้จำหน่าย จากนั้นจึงแก้ไขการขึ้นต่อกัน ขึ้นอยู่กับกราฟการพึ่งพาโมดูล เครื่องมือยังสามารถตรวจจับการละเมิดแนวคิด VNDK และให้ข้อมูลเชิงลึก/ข้อเสนอแนะสำหรับการย้ายโมดูลระหว่างพาร์ติชัน หากมีการระบุ Generic System Image (GSI) เครื่องมือคำจำกัดความ VNDK จะสามารถเปรียบเทียบอิมเมจระบบของคุณกับ GSI และกำหนดไลบรารีเพิ่มเติมได้
ส่วนนี้ครอบคลุมถึงสามคำสั่งที่ใช้บ่อยสำหรับเครื่องมือนิยาม VNDK:
-
vndk
คำนวณ VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES และ EXTRA_VENDOR_LIBRARIES สำหรับวิธีแก้ปัญหาการสร้างระบบใน Android 8.0 และสูงกว่า -
check-dep
ตรวจสอบการละเมิดการขึ้นต่อกันของโมดูลจากโมดูลของผู้จำหน่ายไปยังไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กที่ไม่มีสิทธิ์ -
deps
พิมพ์การขึ้นต่อกันระหว่างไลบรารีที่แบ่งใช้และไฟล์ปฏิบัติการ
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการใช้คำสั่งขั้นสูง โปรดดูที่ไฟล์ README.md ในพื้นที่เก็บข้อมูล VNDK Definition Tool
vndk
คำสั่งย่อย vndk
โหลดไลบรารีแบบแบ่งใช้และไฟล์เรียกทำงานจากพาร์ติชันระบบและพาร์ติชันผู้จำหน่าย จากนั้นแก้ไขการขึ้นต่อกันของโมดูลเพื่อกำหนดไลบรารีที่ต้องคัดลอกไปยัง /system/lib[64]/vndk-sp-${VER}
และ /vendor/lib[64]
. อ็อพชันสำหรับคำสั่งย่อย vndk
ประกอบด้วย:
ตัวเลือก | คำอธิบาย |
---|---|
--system | ชี้ไปที่ไดเร็กทอรีที่มีไฟล์ที่จะอยู่ในพาร์ติชันระบบ |
--vendor | ชี้ไปที่ไดเร็กทอรีที่มีไฟล์ที่จะอยู่ในพาร์ติชันของผู้จำหน่าย |
--aosp-system | ชี้ไปที่ไดเร็กทอรีที่มีไฟล์ที่จะอยู่ใน Generic System Image (GSI) |
--load-extra-deps | ชี้ไปที่ไฟล์ที่อธิบายการพึ่งพาโดยนัย เช่น 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
สแกนโมดูลผู้จำหน่าย และตรวจสอบการขึ้นต่อกัน หากตรวจพบการละเมิด ระบบจะพิมพ์ไลบรารีที่ขึ้นอยู่กับการละเมิดและการใช้สัญลักษณ์:
./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-ส่วนตัว | การพึ่งพาส่วนตัวของไลบรารี LL-NDK โมดูลผู้ขายจะต้องไม่เข้าถึงไลบรารีเหล่านี้โดยตรง |
VNDK-SP | การพึ่งพาไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์ก SP-HAL |
VNDK-SP-ส่วนตัว | การขึ้นต่อกันของ VNDK-SP ที่ไม่สามารถเข้าถึงได้โดยตรงจากโมดูลผู้จำหน่ายทั้งหมด |
ดองเวียดนาม | ไลบรารี่ที่ใช้ร่วมกันของเฟรมเวิร์กที่พร้อมใช้งานสำหรับโมดูลผู้ขาย (ยกเว้น SP-HAL และ SP-HAL-Dep) |
VNDK-เอกชน | การพึ่งพา VNDK ที่ไม่สามารถเข้าถึงได้โดยตรงจากโมดูลผู้จำหน่ายทั้งหมด |
FWK เท่านั้น | ไลบรารีที่แบ่งใช้เฉพาะเฟรมเวิร์กเท่านั้นที่ต้องไม่สามารถเข้าถึงได้โดยโมดูลผู้จำหน่าย (ทั้งทางตรงและทางอ้อม) |
FWK-เท่านั้น-RS | ไลบรารีที่ใช้ร่วมกันเฉพาะเฟรมเวิร์กซึ่งโมดูลผู้จำหน่ายจะต้องไม่สามารถเข้าถึงได้ (ยกเว้นการใช้งาน RS) |
ตารางต่อไปนี้อธิบายแท็กที่ใช้สำหรับไลบรารีที่ใช้ร่วมกันของผู้ขาย:
แท็ก | คำอธิบาย |
---|---|
เอสพี-ฮาล | ไลบรารีที่แบ่งใช้ HAL แบบกระบวนการเดียวกัน |
SP-HAL-แผนก | การพึ่งพาไลบรารีที่ใช้ร่วมกันของผู้จำหน่าย SP-HAL (หรือที่เรียกว่าการพึ่งพา SP-HAL ไม่รวม LL-NDK และ VNDK-SP) |
ดองเวียดนามเท่านั้น | ไลบรารีที่ใช้ร่วมกันที่มองไม่เห็นกรอบงานซึ่งจะต้องไม่สามารถเข้าถึงได้โดยโมดูลกรอบงาน ไลบรารี VNDK แบบขยายที่คัดลอกจะถูกแท็กเป็น VND-ONLY เช่นกัน |
ความสัมพันธ์ระหว่างแท็ก:
deps
เมื่อต้องการดีบักการขึ้นต่อกันของไลบรารี คำสั่งย่อย deps
จะพิมพ์การขึ้นต่อกันของโมดูล:
./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
ไม่มีการพึ่งพาและ 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
สัญลักษณ์ที่ใช้โดยผู้ใช้จะถูกพิมพ์