כלי ההגדרה של VNDK

כלי ההגדרה של VNDK עוזר לספקים להעביר את עץ המקור שלהם לסביבת אנדרואיד 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 Definition Tool.

vndk

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

אוֹפְּצִיָה תיאור
--system הצבע על ספרייה המכילה את הקבצים שיישבו במחיצת המערכת.
--vendor הצבע על ספרייה המכילה את הקבצים שיישבו במחיצת הספק.
--aosp-system הצבע על ספרייה המכילה את הקבצים שיישבו בתמונת המערכת הגנרית (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 שנוצר על ידי מערכת הבנייה של אנדרואיד. זה עוזר לכלי ההגדרה של VNDK לשייך מודולים בינאריים לקוד מקור.

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

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

תָג תיאור
LL-NDK ספריות משותפות עם ABIs/APIs יציבים שיכולים לשמש גם מודולים של מסגרת וגם של ספקים.
LL-NDK-פרטי תלות פרטית של ספריות LL-NDK. אסור למודולי ספק לגשת ישירות לספריות אלו.
VNDK-SP ספריות משותפות במסגרת SP-HAL.
VNDK-SP-פרטי תלות 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-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 , הסמלים שבהם משתמש המשתמש יודפסו.