כלי להגדרת VNDK

הכלי להגדרת 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 בלבד.

קשרי הגומלין בין התגים:

קשרי הגומלין בין התגים.

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