כלי הגדרת VNDK

כלי ההגדרה VNDK עוזר לספקים להעביר את עץ המקור שלהם לסביבת Android 8.0. כלי זה סורק קבצים בינאריים במערכת ותמונות הספק ואז פותר תלות. בהתבסס על גרף התלות במודול, הכלי יכול גם לזהות הפרות למושגי VNDK ולספק תובנות / הצעות להעברת מודולים בין מחיצות. אם מוגדרת תמונת מערכת כללית (GSI), כלי ההגדרה VNDK יכול להשוות את תמונת המערכת שלך עם ה- GSI ולקבוע את הספריות המורחבות.

סעיף זה מכסה שלוש פקודות נפוצות עבור כלי ההגדרה VNDK:

  • vndk . חישוב VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES ו- EXTRA_VENDOR_LIBRARIES לפיתרון לעקיפת המערכת לבנות ב- Android 8.0 ומעלה.
  • check-dep . בדוק את התלות במודולים המפרים ממודולי ספק לספריות משותפות שאינן כשירות למסגרת.
  • deps . הדפיסו את התלות בין הספריות המשותפות וההפעלה.

לפרטים נוספים אודות שימוש מתקדם בפקודות , עיין בקובץ README.md במאגר כלי ההגדרה VNDK.

vndk

vndk המשנה vndk טוענת את הספריות vndk המשותפים vndk המערכת vndk הספקים, ואז פותרת תלות במודול כדי לקבוע את הספריות שיש להעתיק אל /system/lib[64]/vndk-sp-${VER} ו- /vendor/lib[64] . האפשרויות עבור vndk המשנה vndk כוללות:

אוֹפְּצִיָה תיאור
--system הצבע על ספריה המכילה את הקבצים שישכנו במחיצת המערכת.
--vendor הצבע על ספריה המכילה את הקבצים שישכנו במחיצת ספק.
--aosp-system הצבע על ספריה המכילה את הקבצים שישכנו בתמונת המערכת הגנרית (GSI).
--load-extra-deps הצבע על קובץ המתאר את התלות הגלומה, כגון dlopen() .

לדוגמה, כדי לחשב את ערכות ספריית VNDK, הפעל את 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 המשנה check-dep כוללות:

אוֹפְּצִיָה תיאור
--tag-file עליך להתייחס לקובץ תג ספרייה כשיר (המתואר להלן), שהוא גיליון אלקטרוני המסופק על ידי Google שתיאר קטגוריות של ספריות משותפות במסגרת.
--module-info מצביע על module-info.json שנוצר על ידי מערכת build Android. זה עוזר לכלי ההגדרה VNDK לשייך מודולים בינאריים לקוד המקור.

קובץ תג ספרייה כשיר

גוגל מספקת גיליון אלקטרוני זכאי של VNDK (למשל eligible-list.csv ) eligible-list.csv את הספריות המשותפות למסגרת שיכולות לשמש את מודולי הספקים:

תָג תיאור
LL-NDK ספריות משותפות עם ABIs / API יציבים שיכולים לשמש הן את מסגרות והן את מודולי הספקים.
LL-NDK-Private תלות פרטית של ספריות LL-NDK. אסור למודולי ספק לגשת ישירות לספריות אלה.
VNDK-SP מסגרת SP-HAL תלויה בספריות.
VNDK-SP-Private תלות VNDK-SP שאינן נגישות ישירות לכל מודולי הספקים.
VNDK מסגרות משותפות של מסגרות הזמינות למודולי ספקים (למעט SP-HAL ו- SP-HAL-Dep).
VNDK- פרטי תלות VNDK שאינה נגישה ישירות לכל מודולי הספקים.
FWK בלבד ספריות משותפות המסגרות בלבד שאסור לגשת אליהן באמצעות מודולי ספקים (לא באופן ישיר ולא עקיף).
FWK-ONLY-RS ספריות משותפות המסגרות בלבד שאסור לגשת אליהן באמצעות מודולי ספקים (למעט שימושים ב- RS).

הטבלה הבאה מתארת ​​תגים המשמשים לספריות משותפות של ספקים:

תָג תיאור
SP-HAL יישום HAL של אותו תהליך ספריות משותפות.
SP-HAL-Dep ספקי SP-HAL תלויים בספריות (תלויות SP-HAL תלויות למעט LL-NDK ו- VNDK-SP).
VND בלבד ספריות משותפות שאינן נראות למסגרת שאסור לגשת אליהן באמצעות מודולי מסגרת. ספריות ה- VNDK המורחבות שהועתקו יתויגו גם כ- VND.

יחסים בין תגיות:

איור 1. קשרים בין תגים.

deps

כדי לנקות באגים בתלות בספרייה, 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 subcommand הדפסים השימושים של ספריות (תלות הפוך):

./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 subcommand הדפסים הסמלים בשימוש:

./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 האפשרות - --symbol וגם האפשרות - --symbol , --revert שמשמשים את המשתמש.