הכלי להגדרת VNDK עוזר לספקים להעביר את עץ המקור שלהם לסביבת Android 8.0. הכלי הזה סורק קבצים בינאריים במערכת ובדימויים של הספקים, ואז פותר את התלות. על סמך גרף התלות של המודול, הכלי יכול גם לזהות הפרות של מושגי VNDK ולספק תובנות או הצעות להעברת מודולים בין מחיצות. אם מציינים תמונה גנרית של המערכת (GSI), כלי ההגדרה של VNDK יכול להשוות את תמונת המערכת שלכם ל-GSI ולקבוע את הספריות המורחבות.
בקטע הזה מוסבר על שלוש פקודות שמשמשות לעיתים קרובות בכלי להגדרת VNDK:
-
vndk. חישוב של VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES ו-EXTRA_VENDOR_LIBRARIES לעקיפת בעיה במערכת build ב-Android מגרסה 8.0 ומעלה. -
check-dep. בודקים את התלויות של המודולים שמפירים את המדיניות, ממודולים של ספקים לספריות משותפות של מסגרות שלא עומדות בדרישות. -
deps. הדפסת התלויות בין הספריות המשותפות וקבצי ההפעלה.
לפרטים נוספים על שימוש מתקדם בפקודות, אפשר לעיין בקובץ README.md במאגר של כלי ההגדרה של VNDK.
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] |
תבניות של מערכת build
אחרי איסוף הפלט מכלי ההגדרה של 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
פקודת המשנה 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 build. הוא עוזר לכלי ההגדרה של VNDK לשייך מודולים בינאריים לקוד מקור. |
קובץ תג ספרייה שעומד בדרישות
Google מספקת גיליון אלקטרוני של VNDK שעומד בדרישות (לדוגמה:
eligible-list.csv) שבו מתויגות הספריות המשותפות של המסגרת שאפשר להשתמש בהן במודולים של הספק:
| תג | תיאור |
|---|---|
| LL-NDK | ספריות משותפות עם ממשקי ABI/API יציבים שאפשר להשתמש בהם גם במודולים של מסגרות וגם במודולים של ספקים. |
| LL-NDK-Private | יחסי תלות פרטיים של ספריות LL-NDK. אסור למודולים של ספקים לגשת לספריות האלה ישירות. |
| VNDK-SP | תלויות בספריות משותפות של מסגרת SP-HAL. |
| VNDK-SP-Private | תלויות ב-VNDK-SP שלא נגישות ישירות לכל המודולים של הספק. |
| VNDK | ספריות משותפות של מסגרות שזמינות למודולים של ספקים (חוץ מ-SP-HAL ו-SP-HAL-Dep). |
| VNDK-Private | תלויות ב-VNDK שלא נגישות ישירות לכל המודולים של הספק. |
| FWK-ONLY | ספריות משותפות שמבוססות על מסגרת בלבד, שאסור למודולים של ספקים לגשת אליהן (לא באופן ישיר ולא באופן עקיף). |
| FWK-ONLY-RS | ספריות משותפות שמבוססות על Framework בלבד, שאסור למודולים של הספק לגשת אליהן (למעט שימושים ב-RS). |
בטבלה הבאה מפורטים התגים שמשמשים לספריות משותפות של ספקים:
| תג | תיאור |
|---|---|
| SP-HAL | ספריות משותפות של הטמעת HAL באותו תהליך. |
| SP-HAL-Dep | תלויות של ספריות משותפות של ספקים ב-SP-HAL (נקראות גם תלויות של SP-HAL, לא כולל LL-NDK ו-VNDK-SP). |
| VND-ONLY | ספריות משותפות שלא נראות למסגרת, שאסור למודולים של המסגרת לגשת אליהן. ספריות ה-VNDK המורחבות שהועתקו מתויגות גם הן כ-VND-ONLY. |
הקשרים בין התגים:
איור 1. הקשרים בין התגים.
deps
כדי לנפות באגים בתלויות של הספריות, פקודת המשנה deps מדפיסה את התלויות של המודול:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendorהפלט מורכב מכמה שורות. השורה בלי תו של כרטיסייה מתחילה קטע חדש. השורה עם תו ה-Tab תלויה בקטע הקודם. לדוגמה:
/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 תלוי בשש פונקציות שמיוצאות מ-libdl.so. אם מציינים גם את האפשרות --symbol וגם את האפשרות --revert, המערכת מדפיסה את הסמלים שבהם המשתמש השתמש.