במהדורה של Android Framework יש כמה מטריצות תאימות של Framework (FCM), אחת לכל גרסת FCM שאפשר לשדרג אליה. המטריצות האלה מגדירות את מה שה-Framework יכול להשתמש בו ואת הדרישות של גרסת ה-FCM לטירגוט. כחלק ממחזור החיים של FCM, מערכת Android מוציאה משימוש ומסירה את HIDL HALs, ואז משנה את קובצי ה-FCM כדי לשקף את הסטטוס של גרסת ה-HAL.
כדי להפעיל עדכוני OTA שמבוססים על framework בלבד במערכות אקולוגיות משלהם, שותפים שמרחיבים ממשקי ספקים צריכים גם להוציא משימוש ולהסיר HIDL HALs באמצעות אותן שיטות.
הסברים על המונחים
- מטריצת התאימות של Framework (FCM)
- קובץ XML שמפרט את דרישות המסגרת לגבי הטמעות של ספקים שעומדים בדרישות. מטריצת התאימות היא בעלת גרסאות, וגרסה חדשה מוקפאת לכל מהדורת מסגרת. כל מהדורת מסגרת מכילה כמה FCM.
- גרסאות של פלטפורמת FCM (SF)
- קבוצת כל הגרסאות של FCM בגרסה להפצה של מסגרת. המסגרת יכולה לפעול עם כל הטמעה של ספק שעומדת באחת מהדרישות האלה של FCM.
- גרסת FCM (F)
- הגרסה הכי גבוהה מבין כל ה-FCM בגרסת פריים-וורק.
- גרסת היעד של FCM (V)
- גרסת ה-FCM שמיועדת למכשיר (מ-SF), שמוצהרת באופן מפורש במניפסט המכשיר, ושיישום של ספק עומד בדרישות שלה. הטמעה של ספק צריכה להיווצר בהתאם ל-FCM שפורסם, למרות שהיא יכולה להצהיר על גרסאות חדשות יותר של HAL במניפסט המכשיר שלה.
- גרסת HAL
- גרסת HAL היא בפורמט
foo@x.y, כאשרfooהוא שם ה-HAL ו-x.yהיא הגרסה הספציפית, למשלnfc@1.0,keymaster@3.0(הקידומת הבסיסית, למשלandroid.hardware, מושמטת לאורך המסמך הזה). - מניפסט המכשיר
- קובצי XML שמציינים אילו גרסאות HAL מסופקות בצד המכשיר של ממשק הספק, כולל תמונות הספק ו-ODM. התוכן של מניפסט המכשיר מוגבל על ידי גרסת היעד של FCM במכשיר, אבל יכול לכלול רשימה של HALs שהם חדשים יותר ביחס ל-FC שמתאים ל-V.
- Device HALs
- ספריות HAL שמופיעות (מסופקות) במניפסט המכשיר ומופיעות במטריצת התאימות של המסגרת (FCM).
- מטריצת תאימות מכשירים (DCM)
- קובץ XML שמפרט את דרישות הספק לגבי הטמעות של מסגרות תואמות. כל מכשיר מכיל DCM אחד.
- Framework Manifest
- קובץ XML שמציין אילו גרסאות HAL מספק הצד של המסגרת של ממשק הספק, כולל תמונות של המערכת, של system_ext ושל המוצר. HALs במניפסט של המסגרת מושבתים באופן דינמי בהתאם לגרסת היעד של FCM במכשיר.
- Framework HALs
- HALs שמופיעים כ-HALs שסופקו במניפסט של המסגרת ומופיעים במטריצת התאימות של המכשיר (DCM).
מחזור החיים של FCM בבסיס הקוד
במסמך הזה מתואר מחזור החיים של FCM באופן כללי. כדי לראות את קובצי המניפסט הנתמכים, אפשר לעיין במאמר system/libvintf/include/vintf/Level.h שבו מוסבר איפה אפשר למצוא את FCM.hardware/interfaces/compatibility_matrices/compatibility_matrix.<FCM>.xml
למכשיר שמופצת בו גרסת הפצה תואמת של Android אמור להיות ערך FCM שגדול מרמה מקבילה או שווה לה. לדוגמה, בדרך כלל מכשיר שנשלח עם Android 12 יכלול FCM ברמה 6, אבל יכול להיות שהוא יכלול FCM ברמה 7 ומעלה, מה שמשנה את ההתנהגות של Android ומחייב שימוש בממשקי API חדשים יותר של ספקים, כפי שמצוין במטריצות התאימות. הרמות הנתמכות ב-Android 16 הן:
| FCM | גרסת Android |
|---|---|
| 6 | Android 12/S |
| 7 | Android 13/T |
| 8 | Android 14/U |
| 202404 | Android 15/V |
| 202504 | Android 16/B |
רמת ה-FCM שווה לרמת Vendor API או חדשה ממנה.
כשפרויקט Treble הוכרז, תמונות המערכת של Android נבנו כך שיהיו תואמות לאחור לשלוש הגרסאות הקודמות של הטמעות הספקים (ארבע בסך הכול). כדי לתמוך במכשירים לאורך זמן, תקופת התמיכה הזו הוארכה כדי לתמוך בגרסה הנוכחית ובשש גרסאות קודמות של FCM (שבע גרסאות בסך הכול) ב-202404 ומעלה.
כש-Android מוציאה משימוש רמה של FCM, היא עדיין נתמכת במכשירים קיימים. למכשירים שמכוונים לרמות נמוכות יותר של FCM יש הרשאה מרומזת להשתמש ב-HALs שמפורטים ברמות גבוהות יותר של FCM, כל עוד הם זמינים בענף.
פיתוח בגרסה חדשה של FCM
מערכת Android מעלה את גרסת ה-FCM בכל מהדורה של מסגרת (כמו Android 8 ו-8.1). במהלך הפיתוח, נוצר compatibility_matrix.F.xml חדש והמערכת לא משנה יותר את compatibility_matrix.f.xml הקיים (כאשר f < F).
כדי להתחיל לפתח בגרסה חדשה של FCM F:
- מעתיקים את
compatibility_matrix.<F-1>.xmlהעדכני אלcompatibility_matrix.F.xml. - מעדכנים את המאפיין
levelבקובץ לערךF. - מוסיפים כללי בנייה תואמים כדי להתקין את מטריצת התאימות הזו במכשיר.
הוספת HAL חדש
במהלך הפיתוח, כשמציגים HAL חדש (Wi-Fi, NFC וכו') ל-Android בגרסת FCM הנוכחית F, מוסיפים את ה-HAL ל-compatibility_matrix.F.xml.
לדוגמה, ב-Android 8.1 נוספה cas@1.0. מכשירים שמופעלת בהם Android 8.1 יכולים להטמיע את HAL הזה, ולכן נוסף הערך הבא ל-compatibility_matrix.F.xml (שנקרא באופן זמני compatibility_matrix.current.xml במהלך הפיתוח של הגרסה הזו):
<hal format="hidl">
<name>android.hardware.cas</name>
<version>1.0</version>
<interface>
<name>IMediaCasService</name>
<instance>default</instance>
</interface>
</hal>
שדרוג HAL (משני)
גרסאות AIDL HAL נחשבות לגרסאות משניות של HAL. לגרסאות של ממשקי HIDL יש major.minor גרסאות כמו 1.2.
במהלך הפיתוח, כשמתבצע שדרוג גרסה של AIDL HAL מ-2 ל-3 בגרסה הנוכחית של FCM F, הגרסה החדשה מתווספת לרשומה של HAL ב-compatibility_matrix.F.xml. בשדה הגרסה של רשומה ב-HAL אפשר להזין טווחים כמו 2-3.
לדוגמה, ב-Android FCM F הוצג foo@3 כשדרוג של גרסה משנית של HAL. הגרסה הישנה יותר, foo@2, משמשת למכשירים שמטרגטים גרסאות ישנות יותר של FCM, ואילו הגרסה החדשה יותר, foo@3, יכולה לשמש למכשירים שמטרגטים את Android FCM F. הערך ב-FCMs ישנים יותר לפני גרסה 2 נראה כך:
<hal format="aidl">
<name>foo</name>
<version>2</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
הערך הזה הועתק אל compatibility_matrix.F.xml ושונה כדי לתמוך בגרסה 3 באופן הבא:
<hal format="aidl">
<name>foo</name>
<version>2-3</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
שדרוג HAL (חשוב)
במהלך הפיתוח, אם יש שדרוג של גרסה ראשית ב-HAL בגרסה הנוכחית של FCM F, הגרסה הראשית החדשה x.0 מתווספת ל-compatibility_matrix.F.xml עם ההגדרות הבאות:
- רק גרסה
x.0, אם מכשירים שנשלחים עםV = Fצריכים להיות מושקים עםx.0. - בגרסאות ישנות יותר של גרסאות ראשיות באותו תג
<hal>, אם מכשירים שנשלחים עםV = Fיכולים להפעיל גרסה ראשית ישנה יותר.
לדוגמה, בגרסה F של FCM נוסף foo@2.0 כשדרוג של גרסה ראשית של HAL 1.0, וגרסה HAL 1.0 הוצאה משימוש. הגרסה הישנה יותר, foo@1.0, משמשת למכשירים שמטרגטים גרסאות קודמות של FCM. מכשירים שמטרגטים את גרסת FCM F חייבים לספק את גרסה 2.0 החדשה אם הם מספקים את HAL. בדוגמה הזו, הגרסאות הקודמות של FCM מכילות את הרשומה הזו:
<hal format="hidl">
<name>foo</name>
<version>1.0</version>;
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
מעתיקים את הרשומה הזו אל compatibility_matrix.F.xml ומשנים אותה באופן הבא:
<hal format="hidl">
<name>foo</name>
<version>2.0</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
הגבלות:
- מכיוון ש-HAL בגרסה 1.0 לא נמצא ב-
compatibility_matrix.F.xml, מכשירים שמיועדים ל-FCM בגרסהFלא יכולים לספק את HAL בגרסה 1.0 (כי HAL הזה נחשב לגרסה שיצאה משימוש). - מכיוון ש-HAL 1.0 קיים בגרסאות ישנות יותר של FCM, עדיין אפשר להשתמש ב-HAL 1.0 במסגרת, כך שיש תאימות לאחור למכשירים ישנים שמיועדים לגרסאות ישנות יותר של FCM.
גרסאות חדשות של FCM
תהליך ההפצה של גרסת FCM במחיצת המערכת מתבצע רק על ידי Google כחלק מהפצה של AOSP, והוא כולל את השלבים הבאים:
- מוודאים שלרכיב
compatibility_matrix.F.xmlיש את המאפייןlevel="F". - מוודאים שכל המכשירים נבנים ומאותחלים.
- עדכון בדיקות VTS
כדי לוודא שבמכשירים שמופעלים עם המסגרת העדכנית ביותר (על סמך רמת API של משלוח) מוגדרת גרסת FCM לטירגוט
V >= F. - פרסום הקובץ ב-AOSP.
לדוגמה, בדיקות VTS מוודאות שבמכשירים עם Android מגרסה 9 ואילך, גרסת היעד של FCM היא >= 3.
בנוסף, יכול להיות שבדפי המוצר והמערכת של FCM יפורטו גם דרישות לכל גרסה של FCM בפלטפורמה. הבעלים של התמונות האלה אחראי על פרסום גרסאות של FCM במחיצות product ו-system_ext. מספרי הגרסאות של FCM במחיצות product ו-system_ext צריכים להיות זהים למספרי הגרסאות במחיצה system. בדומה לגרסאות FCM במחיצת המערכת, מטריצת התאימות בגרסה F של FCM במחיצות product ו-system_ext משקפת דרישות במכשיר עם גרסת FCM F.
הוצאה משימוש של גרסת HAL
הוצאה משימוש של גרסת HAL היא החלטה של מפתח (כלומר, לגבי HALs של AOSP, ההחלטה מתקבלת על ידי Google). זה יכול לקרות כשמוציאים גרסת HAL גבוהה יותר (משנית או ראשית).
הוצאה משימוש של HAL במכשיר
כש-HAL foo@x.y של מכשיר מסוים מוצא משימוש בגרסה F של FCM, המשמעות היא שאסור למכשיר כלשהו שמופעל עם גרסת יעד של FCM V = F או גרסה מאוחרת יותר להטמיע את foo בגרסה x.y או בכל גרסה ישנה יותר מ-x.y. גרסת HAL שהוצאה משימוש עדיין נתמכת על ידי המסגרת לשדרוג מכשירים.
כשגרסה F של FCM יוצאת, גרסה foo@x.y של HAL נחשבת כמוצאת משימוש אם היא לא מצוינת באופן מפורש בגרסה האחרונה של FCM לגרסת היעד V = F של FCM. במכשירים שמופעלים עם V = F, אחד מהתנאים הבאים מתקיים:
- נדרשת גרסה גבוהה יותר של המסגרת (גרסה ראשית או משנית);
- ה-HAL כבר לא נדרש במסגרת.
לדוגמה, ב-Android 9, health@2.0 מוצגת כשדרוג גרסה משמעותי של 1.0 HAL. המשתמש health@1.0 הוסר מ-compatibility_matrix.3.xml אבל הוא מופיע ב-compatibility_matrix.legacy.xml, ב-compatibility_matrix.1.xml וב-compatibility_matrix.2.xml.
לכן, המאפיין health@1.0 הוצא משימוש.
הוצאה משימוש של framework HAL
כשמפסיקים את התמיכה ב-HAL foo@x.y מסוים של framework בגרסה F של FCM, זה אומר שמכשיר שמפעיל גרסת יעד של FCM V = F או גרסה מאוחרת יותר לא יכול לצפות שה-framework יספק את foo בגרסה x.y, או בכל גרסה ישנה יותר מ-x.y. גרסת HAL שהוצאה משימוש עדיין מסופקת על ידי המסגרת לצורך שדרוג מכשירים.
כשגרסה F של FCM תושק, גרסה foo@x.y של HAL תיחשב כגרסה שיצאה משימוש אם במניפסט של המסגרת מצוין max-level="F - 1" עבור foo@x.y. במכשירים שמופעלים עם V = F, המסגרת לא מספקת את HAL foo@x.y. במטריצת התאימות של המכשיר במכשירים שמופעלים עם V = F, אסור לציין HALs של מסגרת עם max-level < V.
לדוגמה, ב-Android 12, schedulerservice@1.0 הוצא משימוש. המאפיין max-level שלו מוגדר ל-5, הגרסה של FCM שהושקה ב-Android 11. מניפסט של מסגרת Android 12
הסרת התמיכה בגרסאות יעד של FCM
אנחנו משתמשים בתהליך מבוסס-לוח זמנים כדי לקבוע את ההסרה של גרסת FCM מסוימת, כדי לשמור על תאימות למשכי זמן נדרשים ולתמוך בדרישות של שותפים למכשירים עם אורך חיים ארוך יותר.
כשמסירים גרסת יעד של FCM מהקבוצה SF של הגרסה הבאה של המסגרת, מבצעים את שני השלבים הבאים:
מסירים את
compatibility_matrix.V.xmlמכללי ה-build (כדי שלא יותקן בקובץ אימג' של המערכת), ומוחקים את כל הקוד שהטמיע את היכולות שהוסרו או שהיה תלוי בהן.מסירים מקובץ המניפסט של מסגרת העבודה את מודולי ה-HAL של מסגרת העבודה עם
max-levelנמוך או שווה ל-V, ומוחקים את כל הקוד שמטמיע את מודולי ה-HAL של מסגרת העבודה שהוסרו.
הוצאה הדרגתית משימוש של הגדרות מוצר
אסטרטגיית ההסתעפות של Trunk Stable, שבה מהדורות פלטפורמה רבעוניות (QPR) נלקחות ישירות מ-git_main במקום מהסתעפויות נפרדות של מהדורות פיתוח, מחייבת תהליך הוצאה משימוש מדורג. יכול להיות שגרסה של FCM תוסר מגרסאות trunk_staging מוקדמות, אבל תמשיך להיות נתמכת בענף הגרסאות כדי להתאים למכשירים שמקבלים QPR במהלך השנה.
בדרך כלל, גרסת framework תומכת ב-6 גרסאות של FCM: גרסה נוכחית אחת, 4 גרסאות קודמות וגרסה נוספת אחת לתמיכה ב-QPR. המספר הזה יכול לגדול אם גרסאות ספציפיות של FCM (כמו 202404 ב-Android 15) כוללות תמיכה מורחבת באריכות ימים של המכשיר.
במכשירים עם גרסת יעד של FCM מחוץ ל-SF למהדורת framework נתונה, אי אפשר לשדרג למהדורה הזו.
הסרה של HALs שהוצאו משימוש באופן מלא
כשמסירים גרסה של FCM, חלק מממשקי HAL או גרסאות של ממשקי HAL כבר לא קיימים באף FCM. המשמעות היא שמערכת Android לא תומכת בהם יותר, גם לא בשדרוג מכשירים.
אחרי ש-HAL כבר לא נתמך, המפתחים מסירים את ההפניות לממשק HAL הזה מ-Android, כולל בקוד הלקוח במסגרת, בהטמעה שמוגדרת כברירת מחדל ובמקרים של בדיקות VTS.
אם אין קובצי HAL נתמכים שנוצרו על בסיס קובץ ה-HAL שמוסר, אפשר להסיר את הגדרת ה-HAL עצמה בכמה שלבים נוספים.
- מסירים את הגדרת ממשק ה-HAL מקוד המקור. זה כולל את הקבצים
*.aidlואת המודולAndroid.bpaidl_interface. - אם מדובר ב-HIDL, מסירים את ה-HASH מהקובץ
hardware/interfaces/current.txt. - אם מדובר ב-AIDL, מסירים את הספרייה
aidl_apiעם קובצי ה-AIDL הקפואים. - מסירים את הממשק מ-
hardware/interfaces/compatibility_matrices/exclude/fcm_exclude.cpp.
סטטוס גרסת ה-HAL
בקטעים הבאים מתוארים (בסדר כרונולוגי) המצבים האפשריים של גרסת HAL.
לפני השקה
ב-HAL של מכשירים, אם גרסת HAL לא מופיעה באף אחת ממטריצות התאימות הציבוריות והקפואות, היא נחשבת לגרסה שלא פורסמה ואולי נמצאת בפיתוח.
הקטגוריה הזו כוללת גרסאות HAL שקיימות רק ב-compatibility_matrix.F.xml.
דוגמאות:
- במהלך הפיתוח של Android 9, HAL
health@2.0נחשב ל-HAL שלא פורסם והוא הופיע רק ב-compatibility_matrix.3.xml. -
teleportation@1.0HAL לא מופיע באף אחת מטבלאות התאימות שפורסמו, והוא נחשב גם ל-HAL שלא פורסם.
במקרה של HALs של מסגרות, אם גרסת HAL נמצאת רק במניפסט של המסגרת של ענף פיתוח לא קשור, היא נחשבת כגרסה שלא פורסמה.
גרסה שפורסמה וגרסה נוכחית
בממשקי HAL של מכשירים, אם גרסת HAL נמצאת במטריצת תאימות ציבורית וקפואה, היא משוחררת. לדוגמה, אחרי שגרסה 3 של FCM קפואה ומתפרסמת ב-AOSP, health@2.0 HAL נחשבת לגרסת HAL שפורסמה ועדכנית.
אם גרסת HAL מופיעה במטריצת תאימות ציבורית וקפואה עם גרסת ה-FCM הגבוהה ביותר, גרסת ה-HAL היא עדכנית (כלומר, לא הוצאה משימוש). לדוגמה, גרסאות HAL קיימות (כמו nfc@1.0 שהוצגה ב-compatibility_matrix.legacy.xml) שממשיכות להתקיים ב-compatibility_matrix.3.xml נחשבות גם הן לגרסאות HAL שפורסמו ועדכניות.
ב-HALs של framework, אם גרסת HAL נמצאת במניפסט של framework של הענף האחרון שפורסם ללא מאפיין max-level או (במקרים חריגים) עם מאפיין max-level ששווה לגרסת ה-FCM שפורסמה בענף הזה או גבוה ממנה, היא נחשבת לגרסת HAL שפורסמה ועדכנית. לדוגמה, ה-HAL מופץ ועדכני ב-Android 12, כפי שמצוין במניפסט של Android 12 framework.displayservice
פורסם אבל הוצא משימוש
במקרה של HALs של מכשירים, גרסת HAL יוצאת משימוש אם ורק אם מתקיימים כל התנאים הבאים:
- הוא מופץ.
- הוא לא מופיע במטריצת התאימות הציבורית והקפואה עם גרסת ה-FCM הכי גבוהה.
- היא נמצאת במטריצת תאימות ציבורית וקפואה שהמסגרת עדיין תומכת בה.
דוגמאות:
- HAL
health@1.0נמצא ב-compatibility_matrix.legacy.xml, ב-compatibility_matrix.1.xmlוב-compatibility_matrix.2.xml, אבל לא ב-compatibility_matrix.3.xml. לכן, הוא נחשב כהוראה שיצאה משימוש ב-Android 9. - ב-Android 9 יש שדרוג של גרסה משנית ב-HAL של ניהול צריכת החשמל, אבל
power@1.0עדיין נמצא ב-compatibility_matrix.3.xml. -
power@1.0compatibility_matrix.legacy.xml,compatibility_matrix.1.xml, ו-compatibility_matrix.2.xml. - ל
compatibility_matrix.3.xmlיש אתpower@1.0-1.
לכן, power@1.0 הוא עדכני, אבל לא הוצא משימוש ב-Android 9.
ב-HALs של framework, אם גרסת HAL נמצאת במניפסט של framework של הענף האחרון שפורסם עם מאפיין max-level נמוך יותר מגרסת ה-FCM שפורסמה בענף הזה, היא נחשבת לגרסת HAL שפורסמה אבל הוצאה משימוש. לדוגמה, מודול ה-HAL schedulerservice פורסם אבל הוצא משימוש ב-Android 12, כפי שמצוין במניפסט של Android 12 framework.
הוסר
במקרה של HALs של מכשירים, גרסת HAL מוסרת אם ורק אם התנאים הבאים מתקיימים:
- הוא הושק בעבר.
- הוא לא מופיע במטריצת תאימות ציבורית וקפואה שהמסגרת תומכת בה.
מטריצות תאימות שהן ציבוריות, קפואות אבל לא נתמכות על ידי המסגרת נשמרות בבסיס הקוד כדי להגדיר את קבוצת גרסאות ה-HAL שהוסרו, כך שאפשר לכתוב בדיקות VTS כדי לוודא שרכיבי HAL שהוסרו לא נמצאים במכשירים חדשים.
במקרה של HALs של מסגרות, גרסת HAL מוסרת אם ורק אם מתקיימים התנאים הבאים:
- הוא הושק בעבר.
- הוא לא מופיע במניפסט של אף מסגרת בענף האחרון שפורסם.
תגובות מוכנות מראש ישנות ב-FCM
הערך של גרסת היעד של FCM מדור קודם הוא ערך מיוחד לכל המכשירים שאינם Treble. במאמר בנושא FCM מדור קודם, compatibility_matrix.legacy.xml, מפורטים הדרישות של המסגרת במכשירים מדור קודם (כלומר, מכשירים שהושקו לפני Android 8.0).
אם הקובץ הזה קיים ב-FCM בגרסה F, אפשר לשדרג כל מכשיר שאינו Treble לגרסה F, בתנאי שמניפסט המכשיר תואם לקובץ הזה. ההסרה שלו מתבצעת באותו אופן כמו הסרת FCM לגרסאות יעד אחרות של FCM (ההסרה מתבצעת אחרי שמספר המכשירים הפעילים עם גרסה קודמת ל-8.0 יורד מתחת לסף מסוים).
גרסאות FCM שפורסמו
רשימת הגרסאות של FCM שפורסמו זמינה בכתובת hardware/interfaces/compatibility_matrices.
כדי למצוא את גרסת FCM שפורסמה עם גרסת Android ספציפית, אפשר לעיין במאמר Level.h.