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

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

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

טרמינולוגיה

מטריצת התאימות של Framework (FCM)
קובץ XML שמפרט את דרישות המסגרת לגבי הטמעות של ספקים שעומדים בדרישות. מטריצת התאימות היא בעלת גרסאות, וגרסה חדשה מוקפאת לכל מהדורת מסגרת. כל מהדורה של מסגרת מכילה כמה FCMs.
גרסאות של פלטפורמת FCM‏ (SF)
קבוצת כל הגרסאות של FCM במהדורה של מסגרת. המסגרת יכולה לפעול עם כל הטמעה של ספק שעומדת באחת מהדרישות האלה של FCM.
גרסת FCM‏ (F)
הגרסה הכי גבוהה מבין כל ה-FCM בגרסת פריים.
גרסת היעד של FCM‏ (V)
גרסת ה-FCM שמיועדת (מ-SF), שמוצהרת באופן מפורש במניפסט המכשיר, שהטמעה של ספק עומדת בה. הטמעה של ספק צריכה להיווצר בהתאם ל-FCM שפורסם, למרות שהיא יכולה להצהיר על גרסאות חדשות יותר של HAL במניפסט המכשיר שלה.
גרסת HAL
גרסת HAL היא בפורמט [email protected], כאשר foo הוא שם ה-HAL ו-x.y היא הגרסה הספציפית. לדוגמה: [email protected], [email protected] (הקידומת הבסיסית, למשל android.hardware, מושמטת לאורך המסמך הזה).
מניפסט המכשיר
קובצי XML שמציינים אילו גרסאות HAL מסופקות בצד המכשיר של ממשק הספק, כולל תמונות הספק ו-ODM. התוכן של מניפסט המכשיר מוגבל על ידי גרסת ה-FCM של המכשיר, אבל יכול לכלול רשימה של HALs שהם חדשים יותר ביחס ל-FC שמתאים ל-V.
שכבות HAL של מכשירים
ספריות HAL שמופיעות (מסופקות) במניפסט המכשיר ומופיעות במטריצת התאימות של המסגרת (FCM).
מטריצת תאימות מכשירים (DCM)
קובץ XML שמפרט את הדרישות של הספק לגבי הטמעות של מסגרות תואמות. כל מכשיר מכיל DCM אחד.
Framework Manifest
קובץ XML שמציין אילו גרסאות HAL מספק הצד של המסגרת של ממשק הספק, כולל תמונות של מערכת, system_ext ומוצר. ‫HALs במניפסט של framework מושבתים באופן דינמי בהתאם לגרסת היעד של FCM במכשיר.
Framework HALs
HALs שמופיעים כ-HALs שסופקו במניפסט של המסגרת ומופיעים במטריצת התאימות של המכשיר (DCM).

מחזור החיים של FCM ב-codebase

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

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

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

רמת ה-FCM שווה לרמת Vendor API או חדשה ממנה.

כש-Android מוציא משימוש רמה של FCM, היא עדיין נתמכת במכשירים קיימים. למכשירים שמכוונים לרמות נמוכות יותר של FCM מותר באופן מרומז להשתמש ב-HAL שמפורטים ברמות חדשות יותר של 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 נוספה [email protected]. מכשירים עם 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.
  • בגרסאות ישנות יותר של ChromeOS באותו תג <hal> אם מכשירים שנשלחים עם V = F יכולים להפעיל גרסה ישנה יותר של ChromeOS.

לדוגמה, בגרסה F של FCM מוצגת גרסה [email protected] כשדרוג של גרסה ראשית של HAL 1.0, וגרסה HAL 1.0 הוצאה משימוש. הגרסה הישנה יותר, [email protected], משמשת למכשירים שמטרגטים גרסאות קודמות של 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, והוא כולל את השלבים הבאים:

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

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

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

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

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

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

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

כשגרסה F של FCM יוצאת, גרסה [email protected] של HAL נחשבת כמוצאת משימוש אם היא לא מצוינת באופן מפורש בגרסה האחרונה של FCM עבור גרסת היעד V = F של FCM. במכשירים שמופעלים עם V = F, אחד מהתנאים הבאים מתקיים:

  • נדרשת גרסה גבוהה יותר של המסגרת (גרסה ראשית או משנית);
  • ה-HAL כבר לא נדרש במסגרת.

לדוגמה, ב-Android 9, ‏ [email protected] מוצגת כשדרוג גרסה משמעותי של 1.0 HAL. המשתמש [email protected] הוסר מ-compatibility_matrix.3.xml אבל הוא מופיע ב-compatibility_matrix.legacy.xml, ב-compatibility_matrix.1.xml וב-compatibility_matrix.2.xml. לכן, המאפיין [email protected] נחשב כמאפיין שהוצא משימוש.

הוצאה משימוש של HAL של framework

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

כשגרסה F של FCM מופצת, גרסה [email protected] של HAL נחשבת כמוצאת משימוש אם במניפסט של המסגרת מצוין max-level="F - 1" עבור [email protected]. במכשירים שמופעלים עם V = F, המסגרת לא מספקת את HAL [email protected]. במטריצת התאימות של המכשיר במכשירים שמופעלים עם V = F, לא יכולות להיות רשימות של HALs של מסגרות עם max-level < V.

לדוגמה, ב-Android 12, ‏ [email protected] הוצא משימוש. המאפיין max-level שלו מוגדר כ-5, הגרסה של FCM שהושקה ב-Android 11. Android 12 framework manifest

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

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

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

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

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

הסרה של HALs שהוצאו משימוש

כשמסירים גרסה של FCM, חלק מממשקי HAL או גרסאות של ממשקי HAL כבר לא קיימים באף FCM. המשמעות היא שמערכת Android לא תומכת בהן יותר בכלל, גם לא בשדרוג מכשירים.

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

אם אין HAL נתמכים שמוגדרים על בסיס ה-HAL שמוסר, אפשר להסיר את הגדרת ה-HAL עצמה בכמה שלבים נוספים.

  1. מסירים את הגדרת ממשק ה-HAL מקוד המקור. זה כולל את הקבצים *.aidl ואת המודול Android.bp aidl_interface.
  2. אם מדובר ב-HIDL, מסירים את ה-HASH מהקובץ hardware/interfaces/current.txt.
  3. אם מדובר ב-AIDL, מסירים את הספרייה aidl_api עם קובצי ה-AIDL הקפואים.
  4. מסירים את הממשק מ-hardware/interfaces/compatibility_matrices/exclude/fcm_exclude.cpp.

סטטוס גרסת ה-HAL

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

לפני השקה

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

  • במהלך הפיתוח של Android 9,‏ HAL‏ [email protected] נחשב ל-HAL שלא פורסם והוא הופיע רק ב-compatibility_matrix.3.xml.
  • שכבת ה-HAL‏ [email protected] לא מופיעה באף אחת מטבלאות התאימות שפורסמו, והיא נחשבת גם כשכבת HAL שלא פורסמה.

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

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

ב-HAL של מכשירים, אם גרסת HAL נמצאת במטריצת תאימות ציבורית וקפואה, היא משוחררת. לדוגמה, אחרי שגרסה 3 של FCM קפואה ומתפרסמת ב-AOSP, ‏ [email protected] HAL נחשבת לגרסת HAL שפורסמה ועדכנית.

אם גרסת HAL נמצאת במטריצת תאימות ציבורית וקפואה עם גרסת ה-FCM הגבוהה ביותר, גרסת ה-HAL היא עדכנית (כלומר, לא הוצאה משימוש). לדוגמה, גרסאות HAL קיימות (כמו [email protected] שהוצגה ב-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 הגבוהה ביותר.
  • היא נמצאת במטריצת תאימות ציבורית וקפואה שהמסגרת עדיין תומכת בה.

לדוגמה:

לכן, [email protected] הוא עדכני, אבל לא הוצא משימוש ב-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 Target (ההסרה מתבצעת אחרי שמספר המכשירים הפעילים עם גרסה קודמת ל-8.0 יורד מתחת לסף מסוים).

גרסאות FCM שפורסמו

רשימת הגרסאות של FCM שפורסמו זמינה בכתובת hardware/interfaces/compatibility_matrices.

כדי למצוא את גרסת FCM שפורסמה עם גרסת Android ספציפית, אפשר לעיין במאמר Level.h.