כלי ההגדרה של 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. |
יחסים בין תגים:

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