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

במהדורה של 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:

  1. מעתיקים את compatibility_matrix.<F-1>.xml העדכני אל compatibility_matrix.F.xml.
  2. מעדכנים את המאפיין level בקובץ לערך F.
  3. מוסיפים כללי בנייה תואמים כדי להתקין את מטריצת התאימות הזו במכשיר.

הוספת 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, והוא כולל את השלבים הבאים:

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

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

  2. מסירים מקובץ המניפסט של מסגרת העבודה את מודולי ה-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 עצמה בכמה שלבים נוספים.

  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‏ health@2.0 נחשב ל-HAL שלא פורסם והוא הופיע רק ב-compatibility_matrix.3.xml.
  • teleportation@1.0 HAL לא מופיע באף אחת מטבלאות התאימות שפורסמו, והוא נחשב גם ל-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 הכי גבוהה.
  • היא נמצאת במטריצת תאימות ציבורית וקפואה שהמסגרת עדיין תומכת בה.

דוגמאות:

לכן, 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.