เครื่องมือคำจำกัดความ VNDK ช่วยให้ผู้ขายย้ายข้อมูลแผนผังต้นทางไปยัง สภาพแวดล้อมของ Android 8.0 เครื่องมือนี้จะสแกนไฟล์ไบนารีในระบบและผู้ให้บริการ จะแก้ทรัพยากร Dependency ได้ จากกราฟทรัพยากร 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
พิมพ์ทรัพยากร Dependency ระหว่างไลบรารีที่ใช้ร่วมกันและ ไฟล์ปฏิบัติการ
โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับการใช้คำสั่งขั้นสูงที่ README.md ในที่เก็บ VNDK Definition Tool
Vndk
คำสั่งย่อย vndk
จะโหลดไลบรารีและไฟล์ปฏิบัติการที่แชร์
จากพาร์ติชันระบบและพาร์ติชันผู้ให้บริการ จากนั้นแปลงโมดูล
ทรัพยากร Dependency เพื่อกำหนดไลบรารีที่ต้องคัดลอกไป
/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
ระบุทรัพยากร Dependency เพิ่มเติมด้วยรูปแบบไฟล์แบบง่าย แต่ละบรรทัดแสดง กับไฟล์ที่อยู่ก่อนเครื่องหมายโคลอนโดยขึ้นอยู่กับไฟล์ที่อยู่หลัง เครื่องหมายโคลอน เช่น
/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 |
คลัง_ผู้ให้บริการพิเศษ | ต้องติดตั้งไปยัง /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
จะสแกนโมดูลของผู้ให้บริการและตรวจสอบ
ทรัพยากร Dependency หากตรวจพบการละเมิด ก็จะพิมพ์ผู้พึ่งพาที่มีการละเมิด
การใช้ไลบรารีและสัญลักษณ์:
./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
เช่น เอาต์พุตตัวอย่างต่อไปนี้แสดงทรัพยากร Dependency ที่เป็นการละเมิดจาก
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-ส่วนตัว | ทรัพยากร Dependency ส่วนตัวของไลบรารี LL-NDK โมดูลผู้ให้บริการต้องไม่เข้าถึง ไลบรารีเหล่านี้ได้โดยตรง |
VNDK-SP | ทรัพยากร Dependency ของไลบรารีที่แชร์ร่วมกันเฟรมเวิร์ก SP-HAL |
VNDK-SP-เอกชน | ทรัพยากร Dependency ของ VNDK-SP ที่ผู้ให้บริการบางรายเข้าถึงไม่ได้โดยตรง โมดูล |
ดองเวียดนาม | เฟรมเวิร์กไลบรารีที่ใช้ร่วมกันซึ่งพร้อมใช้งานสำหรับโมดูลของผู้ให้บริการ (ยกเว้น SP-HAL และ SP-HAL-Dep) |
VNDK-เอกชน | ทรัพยากร Dependency ของ VNDK ที่ผู้ให้บริการบางรายเข้าถึงไม่ได้โดยตรง โมดูล |
FWK เท่านั้น | ไลบรารีที่แชร์ร่วมกันที่ใช้เฟรมเวิร์กเท่านั้นและผู้ให้บริการต้องไม่เข้าถึง (ทั้งทางตรงและทางอ้อม) |
FWK เท่านั้น-RS | ไลบรารีที่แชร์ร่วมกันที่ใช้เฟรมเวิร์กเท่านั้นและผู้ให้บริการต้องไม่เข้าถึง โมดูล (ยกเว้นการใช้งาน RS) |
ตารางต่อไปนี้อธิบายแท็กที่ใช้สำหรับไลบรารีที่ใช้ร่วมกันของผู้ให้บริการ
ติดแท็ก | คำอธิบาย |
---|---|
SP-HAL | ไลบรารีที่ใช้ร่วมกันที่ใช้กระบวนการ HAL กระบวนการเดียวกัน |
ระดับ SP-HAL | ทรัพยากร Dependency ของไลบรารีที่แชร์ของผู้ให้บริการ SP-HAL (หรือที่เรียกว่าทรัพยากร Dependency ของ SP-HAL) ไม่รวม LL-NDK และ VNDK-SP) |
VND เท่านั้น | ไลบรารีที่ใช้ร่วมกันที่มองไม่เห็นเฟรมเวิร์กที่ต้องไม่เข้าถึงโดย โมดูลเฟรมเวิร์ก ไลบรารี VNDK แบบขยายที่คัดลอกจะติดแท็กเป็น VND เท่านั้น |
ความสัมพันธ์ระหว่างแท็ก:
![ความสัมพันธ์ระหว่างแท็ก](https://source.android.com/docs/core/architecture/images/treble_vndk_design.png?authuser=2&hl=th)
รูปที่ 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
คำสั่งย่อยจะพิมพ์การใช้งานไลบรารี (ย้อนกลับ
ทรัพยากร Dependency):
./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
ซึ่งเป็นสัญลักษณ์ที่ผู้ใช้ใช้
จะได้รับการพิมพ์