תוספים ל-VNDK

יצרני מכשירי Android משנים את קוד המקור של ספריות AOSP מסיבות שונות. ספקים מסוימים מטמיעים מחדש פונקציות בספריות AOSP כדי לשפר את הביצועים, בעוד שספקים אחרים מוסיפים לספריות AOSP פונקציות חדשות, ממשקי API חדשים או פונקציות חדשות. בקטע הזה מפורטות הנחיות להרחבת ספריות AOSP בצורה שלא מפריעה ל-CTS/VTS.

החלפה במקום

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

  • אסור להסיר פונקציות של AOSP.
  • אסור לשנות מבנים אם הם חשופים למשתמשים שלהם.
  • אסור לחזק את התנאי המקדים של הפונקציות.
  • הפונקציות צריכות לספק פונקציונליות זהה.
  • אסור להחליש את התנאי הפוסט-ריפורטיבי של הפונקציות.

סיווגים מורחבים של מודולים

סיווג המודולים לפי הפונקציונליות שהם מגדירים ומשתמשים בה.

הערה: המושג פונקציונליות משמש כאן במקום API/ABI כי אפשר להוסיף פונקציונליות בלי לשנות API/ABI.

בהתאם לפונקציונליות שמוגדרת במודול, אפשר לסווג מודולים כDA-Module וכDX-Module:

  • מודולים שהוגדרו רק ל-AOSP (DA-Module) לא מגדירים פונקציות חדשות שלא היו במודול המקביל ב-AOSP.
    • דוגמה 1. ספריית AOSP שלמה ללא שינויים היא מודול DA.
    • דוגמה 2. אם ספק כותב מחדש את הפונקציות ב-libcrypto.so באמצעות הוראות SIMD (בלי להוסיף פונקציות חדשות), ה-libcrypto.so המשופר יהיה מודול DA.
  • מודולים להגדרת תוספים (DX-Module): מודולים שמגדירים פונקציות חדשות או מודולים שאין להם מקביל ב-AOSP.
    • דוגמה 1. אם ספק מוסיף פונקציית עזר ל-libjpeg.so כדי לגשת לנתונים פנימיים מסוימים, ה-libjpeg.so המשופר יהיה DX-Lib והפונקציה החדשה שתתווסף תהיה החלק המורחב של הספרייה.
    • דוגמה 2. אם ספק מגדיר ספרייה שאינה AOSP בשם libfoo.so, הספרייה libfoo.so תהיה DX-Lib.

בהתאם לפונקציונליות שבה מודול משתמש, אפשר לסווג מודולים ל-UA-Module ול-UX-Module.

  • שימוש רק במודולים של AOSP (UA-Module): במודולים האלה נעשה שימוש רק בפונקציות של AOSP בהטמעות שלהם. הם לא מסתמכים על תוספים שאינם AOSP.
    • דוגמה 1. ספריית AOSP שלמה ללא שינויים היא מודול UA.
    • דוגמה 2. אם ספרייה משותפת ששונתה libjpeg.so מסתמכת רק על ממשקי API אחרים של AOSP, היא תהיה UA-Module.
  • Using-Extension Modules (UX-Module) מסתמכים על פונקציות מסוימות שאינן AOSP בהטמעות שלהם.
    • דוגמה 1. אם libjpeg.so שעבר שינוי מסתמך על ספרייה אחרת שאינה AOSP בשם libjpeg_turbo2.so, ה-libjpeg.so שעבר שינוי יהיה UX-Module.
    • דוגמה 2. אם ספק מוסיף פונקציה חדשה ל-libexif.so המותאם אישית, ו-libjpeg.so המותאם אישית משתמש בפונקציה החדשה שנוספה מ-libexif.so, ה-libjpeg.so המותאם אישית יהיה מודול UX.

ההגדרות והשימושים הם עצמאיים זה מזה:

הפונקציות שבשימוש
רק AOSP‏ (UA) מורחבת (חוויית משתמש)
פונקציונליות מוגדרת רק AOSP‏ (DA) DAUA DAUX
מורחבת (DX) DXUA DXUX

מנגנון התוספים של VNDK

מודולים של ספקים שמסתמכים על פונקציונליות מורחבת לא יפעלו, כי בספריית AOSP באותו שם אין את הפונקציונליות המורחבת. אם מודולים של ספקים תלויים באופן ישיר או עקיף בפונקציות מורחבות, הספקים צריכים להעתיק את הספריות המשותפות DAUX,‏ DXUA ו-DXUX למחיצה של הספק (תהליכי הספק תמיד מחפשים ספריות משותפות במחיצה של הספק קודם). עם זאת, אסור להעתיק ספריות LL-NDK, ולכן מודולים של ספקים לא יכולים להסתמך על הפונקציות המורחבות שמוגדרות בספריות LL-NDK ששונו.

ספריות משותפות של DAUA יכולות להישאר במחיצה של המערכת אם ספריית AOSP המתאימה יכולה לספק את אותה פונקציונליות, ומודולים של ספקים ממשיכים לפעול כשתמונה מערכתית גנרית (GSI) מחליפה את המחיצה של המערכת.

חשוב לבצע החלפה במקום (drop-in) כי ספריות VNDK ללא שינוי ב-GSI יקושרו לספריות המשותפות ששונו במקרה של התנגשות שמות. אם ספריות AOSP משתנות באופן לא תואם ל-API/ABI, יכול להיות שספריות AOSP ב-GSI לא יצליחו לקשר או שיגרמו להתנהגויות לא מוגדרות.