ערכת פיתוח מקומית של ספקים (VNDK)

ערכת הפיתוח המקומית של ספקים (VNDK) היא קבוצה של ספריות המיועדות אך ורק לספקים ליישום HALs שלהם. ספינות VNDK ב system.img והוא מקושר באופן דינמי קוד הספק בזמן הריצה.

למה VNDK?

אנדרואיד 8.0 ואילך מאפשר עדכונים למסגרת בלבד בהם ניתן לשדרג את מחיצת המערכת לגרסה העדכנית ביותר, בעוד שמחיצות הספק נותרו ללא שינוי. זה מרמז כי קבצים בינאריים שנבנו בזמנים שונים חייבים להיות מסוגלים לעבוד זה עם זה; VNDK מכסה שינויים ב- API/ABI בכל מהדורות אנדרואיד.

עדכוני מסגרת בלבד כוללים את האתגרים הבאים:

  • תלות בין מודולים במסגרת ומודולים ספק. לפני אנדרואיד 8.0, מודולים משני הצדדים יכולים לקשר עם מודולים מהצד השני. עם זאת, תלות ממודולי ספק הטילה מגבלות בלתי רצויות לפיתוח מודולי מסגרת.
  • רחבות לספריות AOSP. Android 8.0 ומעלה דורש מכל מכשירי Android לעבור CTS כאשר מחיצת המערכת מוחלפת בתמונת מערכת כללית (GSI) סטנדרטית. עם זאת, ככל שהספקים מרחיבים את ספריות AOSP כדי לשפר את הביצועים או להוסיף פונקציות נוספות ליישומי HIDL שלהם, הברקה של מחיצת המערכת באמצעות GSI סטנדרטית עלולה לשבור את יישום HIDL של הספק. (להנחיות בנושא מניעת שבר כזה, לראות סיומות VNDK .)

כדי להתמודד עם אתגרים אלה, 8.0 מציגה אנדרואיד מספר טכניקות כמו VNDK (המתואר בסעיף זה), HIDL , hwbinder, כיסוי עץ התקן , ולאחר כיסוי sepolicy.

משאבי VNDK

סעיף זה כולל את משאבי ה- VNDK הבאים:

  • מושגים VNDK (להלן) מתאר ספריות משותפות במסגרת, האלס מאותו תהליך (SP-שכבות HAL), ואת המינוח VNDK.
  • רחבות VNDK ספק ספציפיים מסווגות משנה לקטגוריות. לדוגמה, יש להעתיק ספריות עם פונקציות מורחבות שעליהן מסתמכים מודולי ספק למחיצת הספק, אך שינויים שאינם תואמים ל- ABI אסורים.
  • VNDK לבנות מערכת תמיכה מתארת את תצורות מערכת לבנות ו syntaxes הגדרת המודול שקשור VNDK.
  • Definition VNDK הכלי שעוזר עץ המקור שלך עובר אנדרואיד 8.0 ומעלה.
  • לינקר מרחב מספק שליטה גרגירים עדין מעל קשרים ספריה משותפת.
  • מדריכים, כללים, ואת sepolicy מגדיר את מבנה הספרייה עבור מכשירים בעלי מערכת הפעלה Android 8.0 ומעלה, כללים VNDK, ו sepolicy קשור.
  • עיצוב VNDK מצגת ממחישת מושגי VDNK יסוד המשמשים אנדרואיד 8.0 ומעלה.

מושגי VNDK

בעולם אידיאלי עבור Android 8.0 ומעלה, תהליכי מסגרת אינם טוענים ספריות משותפות של ספקים, כל תהליכי הספק מעמיסים רק ספריות משותפות של ספקים (וחלק מספריות משותפות של מסגרות) והתקשורת בין תהליכי מסגרת ותהליכי ספק נשלטת על ידי HIDL וחומרה. כּוֹרֵך.

עולם כזה כולל את האפשרות שממשקי API ציבוריים יציבים מספריות משותפות במסגרת לא יספיקו למפתחי מודולי ספקים (אם כי ממשקי API יכולים להשתנות בין גרסאות אנדרואיד), מה שמחייב חלק מספריות משותפות במסגרת להיות נגישות לתהליכי ספקים. בנוסף, מכיוון שדרישות הביצועים עלולות להוביל לפשרות, יש להתייחס לכמה תקני HAL קריטיים לתגובה אחרת.

הסעיפים הבאים מפרט כיצד VNDK מטפלת בספריות משותפות למסגרות לספקים ו- HALs של אותו תהליך (SP-HAL).

ספריות משותפות למסגרת לספק

חלק זה מתאר את הקריטריונים לסיווג ספריות משותפות הנגישות לתהליכי ספק. ישנן שתי גישות לתמיכה במודולי ספקים במספר מהדורות אנדרואיד:

  1. יצבו את Abis / APIs של מסגרת משותפת ספריות. מודולי מסגרת חדשים ומודולי ספק ישנים יכולים להשתמש באותה ספרייה משותפת כדי לצמצם את טביעת הרגל של הזיכרון ואת גודל האחסון. ספרייה משותפת ייחודית גם נמנעת מכמה בעיות של טעינה כפולה. עם זאת, עלות הפיתוח לשמירה על יציבות ABIs/APIs גבוהות וזה לא מציאותי לייצב את כל ה- ABIs/APIs המיוצאים על ידי כל ספרייה משותפת במסגרת.
  2. העתק ספריות משותפות במסגרת ישנה. מגיע עם ההגבלה החזקה כנגד ערוצים צדדיים, המוגדר כמנגנוני התקשורת בין מודולי מסגרת ומודולי ספקים, כולל (אך לא רק) קלסר, שקע, צינור, זיכרון משותף, קובץ משותף ומאפייני מערכת. לא חייבת להיות תקשורת אלא אם פרוטוקול התקשורת קפוא ויציב (למשל HIDL דרך hwbinder). טעינה כפולה של ספריות משותפות עלולה לגרום גם לבעיות; לדוגמה, אם אובייקט שנוצר על ידי הספרייה החדשה מועבר לפונקציות מהספרייה הישנה, ​​עלולה להתרחש שגיאה מכיוון שספריות אלו עשויות לפרש את האובייקט באופן שונה.

משתמשים בגישות שונות בהתאם למאפייני הספריות המשותפות. כתוצאה מכך, ספריות משותפות במסגרת מסווגות לשלוש קטגוריות משנה:

  • ספריות LL-NDK הם מסגרת לספריות משותפות שידוע כי הם יהיו יציבים. המפתחים שלהם מחויבים לשמור על יציבות ה- API/ABI שלהם.
    • LL-NDK כולל הספריות הבאות: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so , libneuralnetworks.so , libsync.so , libvndksupport.so , ו libvulkan.so ,
  • ספריות VNDK כשירות (VNDK) הן לספריות משותפות מסגרת כי הם בטוחים כדי להיות מועתקי פעמים. מסגרת מודולים מודולים Vendor יכולים לקשר עם עותקים משלהם. ספרייה משותפת במסגרת יכולה להפוך לספריית VNDK כשירה רק אם היא עומדת בקריטריונים הבאים:
    • הוא אינו שולח/מקבל IPCs אל/מהמסגרת.
    • זה לא קשור למכונה וירטואלית של ART.
    • הוא אינו קורא/כותב קבצים/מחיצות עם פורמטים של קבצים לא יציבים.
    • אין לו רישיון תוכנה מיוחד הדורש בדיקות משפטיות.
    • לבעלי הקוד שלו אין התנגדויות לשימושים של ספקים.
  • ספריות מסגרת בלבד (FWK בלבד) הן ספריות מסגרת משותפת שאינם שייכים לקטגוריות הנ"ל. ספריות אלה:
    • נחשבים לפרטי יישום פנימי במסגרת.
    • אסור לגשת למודולי ספקים.
    • יש ABIs/APIs לא יציבים וללא אחריות לתאימות API/ABI.
    • אינם מועתקים.

HAL אותו תהליך (SP-HAL)

Same-Process HAL (SP-HAL) היא קבוצה של שכבות HAL מראש מיושם כמו ספריות משותפות Vendor וטעון תהליכים המסגרת. SP-HAL מבודדים על ידי מרחב שמות מקשר (שולט בספריות ובסמלים הנראים לספריות המשותפות). SP-שכבות HAL חייב לסמוך רק על LL-NDK ו VNDK-SP.

VNDK-SP היא קבוצת משנה מוגדרת מראש של ספריות VNDK מתאימות. ספריות VNDK-SP נבדקות בקפידה על מנת להבטיח כי טעינה כפולה של ספריות VNDK-SP לתהליכי מסגרת אינה גורמת לבעיות. שני SP-HALs ו- VNDK-SP מוגדרים על ידי Google.

הספריות הבאות מאושרות SP-HAL:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP ספריות לציין vndk: { support_system_process: true } בקבצי Android.bp שלהם. אם vendor_available: false צוין גם, אז ספריות אלה נקראים VNDK-SP-פרטיים שהן אינן נראות-האלס SP.

להלן ספריות בלבד מסגרת עם חריגים RS (FWK בלבד-RS):

  • libft2.so (Renderscript)
  • libmediandk.so (Renderscript)

טרמינולוגיה של VNDK

  • מודולים מתייחסים גם לספריות משותפות או הרצה.
  • תהליכים פועלים משימות מערכת הולידו מן ההרצה.
  • מסגרת -qualified במונחים מתייחסים המושגים הקשורים במחיצת המערכת.
  • במונחי -qualified Vendor מתייחסים המושגים הקשורים מחיצות הספק.

לדוגמה:

  • מסגרת ההרצה מתייחסת הרצה /system/bin או /system/xbin .
  • ספריות משותפות מסגרת מתייחסות ספריות משותפות תחת /system/lib[64] .
  • מודולים מסגרת מתייחסים הן ספריות משותפות מסגרת ומסגרת הרצה.
  • תהליכים מסגרת הם תהליכים הוליד מן המסגרת הרצה (למשל /system/bin/app_process ).
  • רצת Vendor מתייחסת הרצה /vendor/bin
  • ספריות משותפות Vendor מתייחסות ספריות משותפות תחת /vendor/lib[64] .
  • מודולים Vendor מתייחסים הוא Vendor הרצה וספריות משותפות ספק.
  • תהליכי Vendor הם תהליכים הולידו מספק הרצה (למשל
  • /vendor/bin/android.hardware.camera.provider@2.4-service ).

גרסת VNDK

ב- Android 9, ספריות משותפות של VNDK בגרסאות:

  • ro.vndk.version רכוש המערכת מתווסף אוטומטית /vendor/default.prop .
  • VNDK משותף ספריות מותקנות כדי /system/lib[64]/vndk-${ro.vndk.version} .
  • VNDK-SP משותף ספריות מותקנות כדי /system/lib[64]/vndk-sp-${ro.vndk.version} .
  • קובץ התצורה מקשרת הדינמי מותקן /system/etc/ld.config.${ro.vndk.version}.txt .

שווי ro.vndk.version נבחר על ידי האלגוריתם להלן:

  • אם BOARD_VNDK_VERSION אינו שווה ל current , השימוש BOARD_VNDK_VERSION .
  • אם BOARD_VNDK_VERSION שווה current :
    • אם PLATFORM_VERSION_CODENAME הוא REL , השימוש PLATFORM_SDK_VERSION (למשל 28 ).
    • אחרת, השימוש PLATFORM_VERSION_CODENAME (למשל P ).

שדרוג מכשירים

אם אכיפת זמן ריצה VNDK נכים מכשיר 8.x אנדרואיד ידי הנבנים ללא BOARD_VNDK_VERSION , היא עשויה להוסיף PRODUCT_USE_VNDK_OVERRIDE := false כדי BoardConfig.mk בעוד משדרג ל- Android 9.

אם PRODUCT_USE_VNDK_OVERRIDE היא false , את ro.vndk.lite הרכוש יתווסף באופן אוטומטי /vendor/default.prop ושוויה יהיה true . כתוצאה מכך, המקשר הדינמי יהיה לטעון את תצורת מרחב ומקשר בין /system/etc/ld.config.vndk_lite.txt , שמבודדת רק SP-HAL ו- VNDK-SP.

כדי לשדרג מכשיר 7.0 אנדרואיד או התחתון כדי 9 אנדרואיד, להוסיף PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false כדי BoardConfig.mk .

Suite Test Test (VTS)

סוויטת המבחן Vendor 9 אנדרואיד (VTS) מנדטים שאיננו ריק ro.vndk.version רכוש. שניהם שהושקו לאחרונה מכשירים והתקנים שדרוגים חייבים להגדיר ro.vndk.version . כמה מקרי מבחן VNDK (למשל VtsVndkFilesTest ו VtsVndkDependencyTest ) מסתמכים על ro.vndk.version רכוש כדי לטעון את ערכות נתונים ספריות VNDK זכאי ההתאמה.

אם ro.product.first_api_level הרכוש גדול מ 27, את ro.vndk.lite הרכוש אסור להיות מוגדר. VtsTreblePlatformVersionTest תיכשל אם ro.vndk.lite מוגדר מכשיר אנדרואיד 9 שהושק לאחרונה.

היסטוריית מסמכים

חלק זה עוקב אחר שינויים בתיעוד VNDK.

שינויים ב- Android 9

  • הוסף קטע גרסת VNDK.
  • הוסף קטע VTS.
  • חלק מקטגוריות ה- VNDK קיבלו את שמה:
    • שמו של LL-NDK-Indirect שונה ל- LL-NDK-Private.
    • שמו של VNDK-Indirect שונה ל- VNDK-Private.
    • שמו של VNDK-SP-Indirect-Private שונה ל- VNDK-SP-Private.
    • VNDK-SP-Indirect הוסר.

שינויים ב- Android 8.1

  • ספריות SP-NDK אוחדו לספריות LL-NDK.
  • החלף libui.so עם libft2.so ב RS סעיף מרחב. זו היתה טעות לכלול libui.so .
  • להוסיף libGLESv3.so ו libandroid_net.so לספריות LL-NDK.
  • להוסיף libion.so לספריות VNDK-SP.
  • הסר libstdc++.so מספרי LL-NDK. השתמשו libc++.so במקום. גרסאות מסוימות של toolchains העצמאי רשאי להוסיף -lstdc++ אל דגלים והמקשר ברירת המחדל. כדי להשבית את המחדל, להוסיף -nodefaultlibs -lc -lm -ldl כדי LDFLAGS .
  • הזז libz.so מ LL-NDK לספריות VNDK-SP. בתצורות מסוימות, libz.so יכול להמשיך ולהיות LL-NDK. עם זאת, לא אמורים להיות הבדלים ניכרים.