במהדורה של 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 של המכשיר, אבל יכול לכלול רכיבי HAL חדשים יותר ביחס ל-FC שמתאים ל-V.
- שכבות HAL של מכשירים
- ספריות HAL שמופיעות (מסופקות) במניפסט המכשיר ומופיעות במטריצת התאימות של המסגרת (FCM).
- מטריצת תאימות מכשירים (DCM)
- קובץ XML שמפרט את הדרישות של הספק לגבי הטמעות של מסגרות תואמות. כל מכשיר מכיל DCM אחד.
- Framework Manifest
- קובץ XML שמציין אילו גרסאות HAL מספק הצד של המסגרת של ממשק הספק, כולל תמונות של המערכת, system_ext והמוצר. HALs במניפסט של המסגרת מושבתים באופן דינמי בהתאם לגרסת היעד של FCM במכשיר.
- Framework HALs
- HALs שמופיעים כ-HALs שסופקו במניפסט של המסגרת ומופיעים במטריצת התאימות של המכשיר (DCM).
מחזור החיים של FCM בבסיס הקוד
במסמך הזה מתואר מחזור החיים של FCM באופן כללי. כדי לראות את קובצי המניפסט הנתמכים, אפשר לעיין במאמר hardware/interfaces/compatibility_matrices/compatibility_matrix.<FCM>.xmlsystem/libvintf/include/vintf/Level.h שבו מוסבר איפה אפשר למצוא את FCM.
במכשיר שמופצת בו גרסת 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. - מוסיפים כללי build תואמים כדי להתקין את מטריצת התאימות הזו במכשיר.
הוספת 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. מכשירים שמטרגטים את גרסה F של FCM חייבים לספק את גרסה 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 בפלטפורמות שונות ב-FCMs של המוצר ושל system_ext. הבעלים של התמונות האלה אחראי על פרסום גרסאות FCM במחיצות product ו-system_ext. מספרי הגרסאות של FCM במחיצות product ו-system_ext צריכים להיות זהים למספרים במחיצה system. בדומה לגרסאות FCM במחיצת המערכת, מטריצת התאימות בגרסה F של FCM במחיצות product ו-system_ext משקפת את הדרישות במכשיר עם גרסת היעד F של FCM.
הוצאה משימוש של גרסת HAL
ההחלטה להוציא משימוש גרסת HAL היא החלטה של מפתח (כלומר, לגבי HAL של AOSP, Google מקבלת את ההחלטה). זה יכול לקרות כשגרסה גבוהה יותר של HAL (משנית או ראשית) יוצאת.
הוצאה משימוש של HAL במכשיר
כש-HAL foo@x.y מסוים של מכשיר מוצא משימוש ב-FCM בגרסה F, המשמעות היא שאסור למכשיר כלשהו שמופעל עם גרסת יעד של FCM V = F ומעלה להטמיע את foo בגרסה x.y או בכל גרסה ישנה יותר מ-x.y. התמיכה בגרסת HAL שהוצאה משימוש עדיין קיימת במסגרת לצורך שדרוג מכשירים.
כשגרסה F של FCM יוצאת, גרסה foo@x.y של HAL נחשבת כמוצאת משימוש אם גרסת HAL הספציפית לא מצוינת באופן מפורש בגרסה האחרונה של FCM עבור גרסת היעד של FCM V = F. במכשירים שמופעלים עם 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 של מסגרת נתונה בגרסה F של FCM, זה אומר שמכשירים שמופעלת בהם גרסת היעד של FCM V = F או גרסה מאוחרת יותר לא יכולים לצפות שהמסגרת תספק את 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, אסור שרכיבי HAL של מסגרת יופיעו עם max-level < V.
לדוגמה, ב-Android 12, schedulerservice@1.0 הוצא משימוש. המאפיין max-level שלו מוגדר ל-5, הגרסה של FCM שהושקה ב-Android 11. מניפסט של Android 12 framework
הסרת התמיכה בגרסאות יעד של FCM
אנחנו משתמשים בתהליך מבוסס-לוח זמנים כדי לקבוע את ההסרה של גרסאות יעד של FCM, כדי לשמור על תאימות למשכי זמן נדרשים ולתמוך בדרישות של שותפים למכשירים עם אורך חיים ארוך יותר.
כשמסירים גרסת FCM לטירגוט מהקבוצה SF של הגרסה הבאה של Framework, מבצעים את שני השלבים הבאים:
מסירים את
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
פורסם אבל הוצא משימוש
במקרה של HAL למכשירים, גרסת 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
הערך Target FCM Version legacy הוא ערך מיוחד לכל המכשירים שאינם 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.