เครื่องมือคำจำกัดความ VNDK

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

เครื่องมือคำจำกัดความ 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 ที่ไม่สามารถเข้าถึงได้โดยตรงสำหรับโมดูลผู้ขายทั้งหมด
VNDK กรอบงานไลบรารีที่ใช้ร่วมกันที่พร้อมใช้งานสำหรับโมดูลผู้ขาย (ยกเว้น SP-HAL และ SP-HAL-Dep)
VNDK-ส่วนตัว การพึ่งพา VNDK ที่ไม่สามารถเข้าถึงได้โดยตรงสำหรับโมดูลผู้ขายทั้งหมด
FWK-เท่านั้น ไลบรารีที่แบ่งใช้เฉพาะเฟรมเวิร์กที่โมดูลผู้ขายต้องไม่เข้าถึง (ไม่ว่าโดยตรงหรือโดยอ้อม)
FWK-เท่านั้น-RS ไลบรารีที่แบ่งใช้เฉพาะเฟรมเวิร์กที่โมดูลผู้จัดจำหน่ายต้องไม่สามารถเข้าถึงได้ (ยกเว้นการใช้งาน RS)

ตารางต่อไปนี้อธิบายแท็กที่ใช้สำหรับไลบรารีที่ใช้ร่วมกันของผู้จัดจำหน่าย:

แท็ก คำอธิบาย
SP-HAL ไลบรารีที่ใช้ร่วมกันของการนำ HAL ไปใช้ในกระบวนการเดียวกัน
SP-HAL-เดป การพึ่งพาไลบรารีที่ใช้ร่วมกันของผู้จำหน่าย SP-HAL (หรือที่เรียกว่าการพึ่งพา SP-HAL ไม่รวม LL-NDK และ VNDK-SP)
VND เท่านั้น ไลบรารีที่ใช้ร่วมกันของ Framework-invisible ที่ต้องไม่สามารถเข้าถึงได้โดยโมดูลกรอบงาน ไลบรารี VNDK แบบขยายที่คัดลอกจะถูกแท็กเป็น VND-ONLY เท่านั้นเช่นกัน

ความสัมพันธ์ระหว่างแท็ก:

รูปที่ 1. ความสัมพันธ์ระหว่างแท็ก

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 สัญลักษณ์ที่ผู้ใช้ใช้จะถูกพิมพ์