מחזור החיים של FCM

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

כדי לאפשר עדכוני OTA של מסגרות בלבד בסביבות העסקיות שלהם, שותפים שמרחיבים את ממשקי הספקים צריכים גם להוציא משימוש ולהסיר את HIDL HALs באמצעות אותן שיטות.

טרמינולוגיה

Framework Compatibility Matrix‏ (FCM)
קובץ XML שמציין את דרישות המסגרת להטמעות של ספקים שתואמות לה. למטרות ניהול גרסאות, מטריצה התאימות מחולקת לגרסאות, וגרסה חדשה קופאת בכל השקה של המסגרת. כל מהדורה של המסגרת מכילה כמה FCM.
גרסאות FCM בפלטפורמה (SF)
הקבוצה של כל הגרסאות של FCM במהדורת מסגרת. המסגרת יכולה לפעול עם כל הטמעה של ספק שעומדת באחד מה-FCM האלה.
גרסת FCM (F)
הגרסה הגבוהה ביותר מבין כל ה-FCMs במהדורת framework.
גרסת היעד של 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).
Device Compatibility Matrix‏ (DCM)
קובץ XML שמציין את דרישות הספק לגבי הטמעות של מסגרות תואמות. כל מכשיר מכיל DCM אחד.
מניפסט של Framework
קובץ XML שמציין אילו גרסאות HAL יסופקו בצד המסגרת של ממשק הספק, כולל system,‏ system_ext ותמונות של מוצרים. ממשקי HAL במניפסט של המסגרת מושבתים באופן דינמי בהתאם לגרסה היעד של FCM במכשיר.
Framework HALs
HALs שמפורטים במניפסט של המסגרת ומפורטים במטריצה של תאימות המכשירים (DCM).

מחזור החיים של FCM בקוד הבסיס

במסמך הזה מתוארים באופן כללי שלבי מחזור החיים של FCM. כדי לראות את המניפסטים הנתמכים, אפשר לעיין במאמר hardware/interfaces/compatibility_matrix.<FCM>.xml, שבו FCM מופיע בקטע system/libvintf/include/vintf/Level.h.

במכשיר עם גרסת Android המתאימה, הערך של FCM אמור להיות גדול מאותה רמה או שווה לה. לדוגמה, מכשיר שנשלח עם Android 11 יהיה בדרך כלל ברמת FCM 5, אבל יישם FCM ברמה 6 ומעלה, עם דרישות נוספות שונות שמצוינות במטריצות התאימות. הרמות הנתמכות הן:

FCM גרסת Android
4 Android 10/Q
5 Android 11/R
6 Android 12/S
7 Android 13/T
8 Android 14/U
202404 Android 15/V

רמת ה-FCM שווה לרמת ה-API של הספק או חדשה ממנה.

כש-Android מפסיקה את השימוש ברמה מסוימת של FCM, היא עדיין נתמכת במכשירים קיימים. מכשירים שמטרגטים רמות FCM נמוכות יותר מורשים להשתמש ב-HALs שמפורטים ברמות FCM חדשות יותר, כל עוד הם זמינים בהסתעפות.

פיתוח בגרסה חדשה של FCM

מערכת Android מגדילה את גרסת FCM בכל גרסה של המסגרת (למשל Android 8 ו-8.1). במהלך הפיתוח, נוצר compatibility_matrix.F.xml חדש וה-compatibility_matrix.f.xml הקיים (כאשר f < F) לא משתנה יותר.

כדי להתחיל לפתח בגרסה החדשה של FCM F:

  1. מעתיקים את compatibility_matrix.<F-1>.xml העדכני ביותר אל compatibility_matrix.F.xml.
  2. מעדכנים את המאפיין level בקובץ ל-F.
  3. מוסיפים כללי 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.

במהלך הפיתוח, כשגרסת HAL של AIDL משודרגת מ-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 יכולים להפעיל גרסה ראשית ישנה יותר.

לדוגמה, ב-FCM בגרסה F מוצגת 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, והוא כולל את השלבים הבאים:

  1. מוודאים של-compatibility_matrix.F.xml יש את המאפיין level="F".
  2. מוודאים שכל המכשירים נוצרים ומופעל בהם אתחול.
  3. מעדכנים את בדיקות VTS כדי לוודא שבמכשירים שהושקעו עם המסגרת העדכנית ביותר (לפי רמת ה-API ששולחת הודעות) מותקנת גרסת FCM היעד V >= F.
  4. מפרסמים את הקובץ ב-AOSP.

לדוגמה, בדיקות VTS מוודאות שמכשירים שפועלים עם Android 9 כוללים גרסה של FCM עם יעד של 3 ומעלה.

בנוסף, ב-FCM של המוצר וב-FCM של system_ext עשויות להופיע גם דרישות לכל גרסאות ה-FCM של הפלטפורמה. הבעלים של התמונות האלה אחראים על פרסום הגרסאות של FCM במחיצות product ו-system_ext, בהתאמה. מספרי הגרסה של FCM במחיצות product ו-system_ext חייבים להיות זהים לאלה במחיצה system. בדומה לגרסאות FCM במחיצה של המערכת, מטריצת התאימות בגרסת FCM F במחיצות product ו-system_ext משקפת את הדרישות במכשיר עם גרסת היעד FCM F.

הוצאה משימוש של גרסת HAL

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

הוצאה משימוש של HAL של מכשיר

כשגרסת HAL foo@x.y של מכשיר מסוים הוצאה משימוש בגרסה F של FCM, המשמעות היא שאסור להטמיע את foo בגרסה x.y או בגרסה ישנה יותר מ-x.y בכל מכשיר שיושקו עם גרסת היעד V = F ואילך של FCM. עדיין יש תמיכה בגרסת HAL שהוצאה משימוש במסגרת לשדרוג מכשירים.

כשגרסה F של FCM תפורסם, גרסה foo@x.y של HAL תוגדר כגרסה לא נתמכת אם גרסה ה-HAL הספציפית לא תצוין במפורש ב-FCM העדכני ביותר לגרסה היעד V = F של FCM. במכשירים שהושקעו עם V = F, אחד מהתנאים הבאים מתקיים:

  • נדרשת גרסת framework גבוהה יותר (ראשית או משנית).
  • לא צריך יותר את HAL במסגרת.

לדוגמה, ב-Android 9, health@2.0 מוצגת כבדיחה של גרסה ראשית של HAL 1.0. השדה health@1.0 הוסר מ-compatibility_matrix.3.xml אבל הוא נמצא ב-compatibility_matrix.legacy.xml, ב-compatibility_matrix.1.xml וב-compatibility_matrix.2.xml. לכן, health@1.0 נחשב לתכונה שהוצאה משימוש.

הוצאה משימוש של HAL של מסגרת

כשגרסת HAL foo@x.y של מסגרת מסוימת הוצאה משימוש בגרסה F של FCM, המשמעות היא שמכשיר שמופעל עם גרסת היעד V = F ואילך לא יכול לצפות שהמסגרת תספק את foo בגרסה x.y או בגרסה ישנה יותר מ-x.y. עדיין יש גרסה של HAL שהוצאה משימוש, שסופקו על ידי המסגרת לצורך שדרוג המכשירים.

כשגרסת FCM F תושק, גרסה foo@x.y של HAL תוצא משימוש אם המניפסט של המסגרת מציין max-level="F - 1" עבור foo@x.y. במכשירים שפועלים עם V = F, המסגרת לא מספקת את ה-HAL foo@x.y. אסור שרשימת ה-HAL של המסגרת עם max-level < V תופיע במטריצה של תאימות המכשירים במכשירים שמשווקים עם V = F.

לדוגמה, ב-Android 12, הפונקציה schedulerservice@1.0 הוצאה משימוש. המאפיין max-level מוגדר כ-5, גרסת FCM שהוצגה ב-Android 11. מניפסט של מסגרת Android 12

הסרת התמיכה בגרסאות היעד של FCM

כשמספר המכשירים הפעילים של גרסה מסוימת של Target FCM‏ V יורד מתחת לסף מסוים, גרסה זו של Target FCM תוסר מהקבוצה SF במהדורת המסגרת הבאה. כדי לעשות זאת, צריך לבצע את שני השלבים הבאים:

  1. הסרת compatibility_matrix.V.xml מכללי ה-build (כדי שלא יותקן בתמונת המערכת) ומחיקה של כל קוד שהטמיע את היכולות שהוסרו או שהיה תלוי בהן.

  2. הסרת HALs של מסגרת עם max-level שקטן מ-V או שווה לו מקובץ המניפסט של המסגרת, ומחיקה של כל קוד שמטמיע את ה-HALs של המסגרת שהוסרו.

מכשירים עם גרסת יעד של FCM מחוץ ל-SF במהדורת מסגרת נתונה לא יכולים לשדרג למהדורה הזו.

סטטוס גרסת HAL

בקטעים הבאים מתוארים (בכרונולוגיה) המצבים האפשריים של גרסה של HAL.

לפני השקה

לגבי HAL של מכשירים, אם גרסה של HAL לא מופיעה באף אחת ממטריצות התאימות הציבוריות והקפואות, היא נחשבת כגרסה שלא פורסמה וייתכן שהיא נמצאת בפיתוח. הרשימה הזו כוללת גרסאות HAL שקיימות רק ב-compatibility_matrix.F.xml. לדוגמה:

  • במהלך הפיתוח של Android 9, ה-HAL של health@2.0 נחשב ל-HAL שלא פורסם והוא היה קיים רק ב-compatibility_matrix.3.xml.
  • HAL של teleportation@1.0 לא נכלל במטריצות תאימות שפורסמו, והוא נחשב גם ל-HAL שלא פורסם.

לגבי HAL של מסגרות, אם גרסת HAL מופיעה רק במניפסט של המסגרת של הסתעפות פיתוח לא קשורה, היא נחשבת כגרסה שלא פורסמה.

גרסאות שפורסמו ועדכניות

לגבי HAL של מכשירים, אם גרסת HAL נמצאת במטריצה ציבורית וקפואה של תאימות, היא תפורסם. לדוגמה, אחרי שגרסה 3 של FCM קופאת ומתפרסמת ב-AOSP, ה-HAL של health@2.0 נחשב לגרסה קיימת ומשוחררת של HAL.

אם גרסת HAL נמצאת במטריצה ציבורית וקפואה של תאימות עם גרסת FCM הגבוהה ביותר, גרסת ה-HAL היא גרסה עדכנית (כלומר, היא לא הוצאה משימוש). לדוגמה, גרסאות HAL קיימות (כמו nfc@1.0 שהוצגה ב-compatibility_matrix.legacy.xml) שעדיין קיימות ב-compatibility_matrix.3.xml נחשבות גם הן לגרסאות HAL שהונפקו וגרסאות HAL נוכחיות.

לגבי HAL של מסגרות, אם גרסה של HAL נמצאת במניפסט של המסגרת של ההסתעפות האחרונה שפורסמה ללא המאפיין max-level, או (באופן חריג) אם max-level שווה לגרסה של FCM שפורסמה בהסתעפות הזו או גבוהה ממנה, היא נחשבת לגרסה של HAL שפורסמה ועדכנית. לדוגמה, HAL של displayservice זמין ב-Android 12, כפי שמפורט במניפסט של מסגרת Android 12.

פורסמו אבל הוצאו משימוש

לגבי HAL של מכשיר, גרסה של HAL תופסק אם יתקיימו כל התנאים הבאים:

  • הוא משוחרר.
  • היא לא מופיעה במטריצה הציבורית והקפואה של התאימות, שבה מופיעה גרסת FCM הגבוהה ביותר.
  • הוא מופיע במטריצה ציבורית וקפואה של תאימות שעדיין נתמכת במסגרת.

לדוגמה:

לכן, power@1.0 הוא נכס תקף, אבל לא מבוטל ב-Android 9.

לגבי HAL של מסגרות, אם גרסה של HAL נמצאת במניפסט של המסגרת בהסתעפות האחרונה שפורסמה, עם מאפיין max-level נמוך יותר מהגרסה של FCM שפורסמה בהסתעפות הזו, היא נחשבת לגרסה של HAL שפורסמה אבל הוצאה משימוש. לדוגמה, HAL של schedulerservice פורסם אבל הוצא משימוש ב-Android 12, כפי שמפורט במניפסט של מסגרת Android 12.

הוסר

לגבי HAL של מכשיר, גרסה של HAL תוסר רק אם התנאים הבאים מתקיימים:

  • הוא כבר שוחרר בעבר.
  • הוא לא נכלל באף מטריצה ציבורית וקפואה של תאימות שתומכת בפלטפורמה.

מטריצות תאימות שגלומות, קפואות וציבוריות, אבל לא נתמכות במסגרת, נשמרות בקוד הבסיסי כדי להגדיר את קבוצת הגרסאות של HAL שהוסרו, וכך אפשר לכתוב בדיקות VTS כדי לוודא ש-HALs שהוסרו לא נמצאים במכשירים חדשים.

לגבי HAL של מסגרות, גרסה של 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.