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

เครื่องมือคำจำกัดความ 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 เท่านั้น

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

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

รูปที่ 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 ซึ่งเป็นสัญลักษณ์ที่ผู้ใช้ใช้ จะได้รับการพิมพ์