הכלי להגדרת VNDK עוזר לספקים להעביר את עץ המקור שלהם סביבת Android 8.0. הכלי הזה סורק קבצים בינאריים במערכת ובספק יחסי התלות. בהתאם לתרשים התלות של המודול, יכול גם לזהות הפרות של מושגים של VNDK ולספק תובנות או הצעות להעברת מודולים בין מחיצות. אם מדובר במערכת כללית צוינה תמונה (GSI), כלי ההגדרה של VNDK יכול להשוות את המערכת בקובץ ה-GSI ולקבוע את הספריות המורחבות.
הקטע הזה עוסק בשלוש פקודות נפוצות להגדרה של VNDK כלי:
vndk
Compute VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES וגם PWA_VENDOR_LIBRARIES לעקיפת מערכת build ב-Android 8.0 ו- גבוהה יותר.check-dep
בודקים את יחסי התלות של המודול שמפר את המדיניות מודולים של ספקים לספריות משותפות של framework שלא עומדות בדרישות.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] |
יצירת תבניות מערכת
אחרי איסוף פלט מכלי ההגדרה של 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 שנוצר באמצעות גרסת ה-build של Android
המערכת. הוא עוזר לכלי להגדרת VNDK לשייך מודולים בינאריים למקור
|
קובץ תגים של ספרייה שעומד בדרישות
Google מספקת גיליון אלקטרוני מתאים של VNDK (למשל
eligible-list.csv
) שמתייג את הספריות המשותפות של framework
יכולים לשמש במודולים של ספקים:
תיוג | תיאור |
---|---|
LL-NDK | ספריות משותפות עם ממשקי ABI/API יציבים שניתן להשתמש בהם ואת המודולים של הספקים. |
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 בלבד | ספריות משותפות בלתי נראות מסוג Framework של framework. ספריות ה-VNDK המורחב שהועתקו מתויגות בתור גם VND בלבד. |
קשרי הגומלין בין התגים:
![קשרי הגומלין בין התגים.](https://source.android.com/docs/core/architecture/images/treble_vndk_design.png?authuser=1&hl=he)
איור 1. קשרי הגומלין בין התגים.
נקודות
כדי לנפות באגים ביחסי התלות של הספרייה, פקודת המשנה 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
תלוי בשש פונקציות שיוצאו
החל מ-libdl.so
. אם גם האפשרות --symbol
וגם
האפשרות --revert
צוינה, הסמלים שמשמשים את המשתמש
מודפסים.