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

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

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

למה VNDK?

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

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

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

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

משאבי VNDK

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

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

מושגי VNDK

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

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

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

ספריות משותפות במסגרת עבור הספק

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

  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) הן ספריות משותפות במסגרת שבטוח להעתקה פעמיים. מודולי מסגרת ומודול ספק יכולים לקשר עם עותקים משלהם. ספריית מסגרת משותפת יכולה להפוך לספריית VNDK זכאית רק אם היא עומדת בקריטריונים הבאים:
    • זה לא שולח/מקבל IPCs אל/מהמסגרת.
    • זה לא קשור למכונה וירטואלית ART.
    • זה לא קורא/כותב קבצים/מחיצות עם פורמטים לא יציבים של קבצים.
    • אין לו רישיון תוכנה מיוחד הדורש בדיקה משפטית.
    • לבעל הקוד שלו אין התנגדויות לשימושים של ספקים.
  • ספריות מסגרת בלבד (FWK-ONLY) הן ספריות מסגרת משותפות שאינן שייכות לקטגוריות שהוזכרו לעיל. הספריות האלה:
    • נחשבים לפרטי יישום פנימיים של מסגרת.
    • אין לגשת למודולי הספק.
    • בעלי ABI/API לא יציבים וללא ערובות תאימות API/ABI.
    • לא מועתקים.

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

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

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

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

  • 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-Private והן אינן נראות ל- SP-HALS .

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

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

מינוח VNDK

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

לדוגמה:

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

ניהול גרסאות VNDK

באנדרואיד 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 ).

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

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

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

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

Vendor Test Suite (VTS)

ה-Android 9 Vendor Test Suite (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.

שינויים באנדרואיד 9

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

שינויים באנדרואיד 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 . גרסאות מסוימות של שרשרות כלים עצמאיות עשויות להוסיף את -lstdc++ לדגלי המקשר המוגדרים כברירת מחדל. כדי להשבית את ברירות המחדל, הוסף -nodefaultlibs -lc -lm -ldl ל- LDFLAGS .
  • העבר את libz.so LL-NDK לספריות VNDK-SP. בתצורות מסוימות, libz.so עשוי להמשיך להיות LL-NDK. עם זאת, לא אמורים להיות הבדלים ניתנים לצפייה.