יצרני מכשירי 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.
- דוגמה 1. אם ספק מוסיף פונקציית עזר ל-
בהתאם לפונקציונליות שבה מודול משתמש, אפשר לסווג מודולים ל-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.
- דוגמה 1. אם
ההגדרות והשימושים הם עצמאיים זה מזה:
| הפונקציות שבשימוש | |||
|---|---|---|---|
| רק 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 לא יצליחו לקשר או שיגרמו להתנהגויות לא מוגדרות.