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

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

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

טרמינולוגיה

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

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

במסמך הזה מתואר מחזור החיים של 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

גם כשמערכת Android מוציאה משימוש רמת FCM, היא עדיין נתמכת במכשירים קיימים.

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

מערכת Android מעלה את גרסת FCM לכל גרסת framework (למשל 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 עם הגדרות optional הבאות:

  • optional="false" אם מכשירים ששולחים עם V = F חייבים לפעול עם ממשק ה-HAL הזה,
  • optional="true" אם ניתן להפעיל מכשירים שנשלחים עם V = F בלי ממשק ה-HAL הזה.

לדוגמה, ב-Android 8.1 הוספנו את cas@1.0 כ-HAL אופציונלי. מכשירים שמושקים עם Android 8.1 לא נדרשים כדי להטמיע את ממשק ה-HAL הזה, לכן הרשומה הבאה נוספה ל-compatibility_matrix.F.xml (שבעבר נקרא compatibility_matrix.current.xml באופן זמני במהלך הפיתוח של הגרסה הזו):

<hal format="hidl" optional="true">
    <name>android.hardware.cas</name>
    <version>1.0</version>
    <interface>
        <name>IMediaCasService</name>
        <instance>default</instance>
    </interface>
</hal>

שדרוג HAL (שני)

במהלך הפיתוח, ל-HAL יש שדרוג לגרסה משנית מ-x.z ל-x.(z+1) בגרסה הנוכחית F של FCM, אם הגרסה הזו:

  • חובה במכשירים שמופעלים עם V = F, בcompatibility_matrix.F.xml צריך לציין x.(z+1) ו-optional="false".
  • לא נדרש במכשירים שמופעלים עם V = F, ב-compatibility_matrix.F.xml חייב להיות העתקה של x.y-z ואפשרות חובה מ-compatibility_matrix.<F-1>.xml ולשנות את הגרסה ל-x.w-(z+1) (כאשר w >= y).

לדוגמה, ב-Android 8.1 הוספנו את broadcastradio@1.1 כשדרוג לגרסה משנית של HAL 1.0. הגרסה הישנה יותר, broadcastradio@1.0, אופציונלית במכשירים שמופעלים עם Android 8.0, והגרסה החדשה יותר, broadcastradio@1.1, אופציונלית במכשירים עם Android 8.1. ב-compatibility_matrix.1.xml:

<hal format="hidl" optional="true">
    <name>android.hardware.broadcastradio</name>
    <version>1.0</version>
    <interface>
        <name>IBroadcastRadioFactory</name>
        <instance>default</instance>
    </interface>
</hal>

רשומה זו הועתקה אל compatibility_matrix.F.xml ושונה באופן הבא:

<hal format="hidl" optional="true">
    <name>android.hardware.broadcastradio</name>
    <version>1.0-1</version>
    <interface>
        <name>IBroadcastRadioFactory</name>
        <instance>default</instance>
    </interface>
</hal>

שדרוג HAL (ראשי)

במהלך הפיתוח, כשל-HAL יש שדרוג לגרסה ראשית בגרסה F הנוכחית של FCM, הגרסה הראשית החדשה x.0 מתווספת אל compatibility_matrix.F.xml עם הגדרות optional הבאות:

  • optional="false" עם גרסה x.0 בלבד, אם מכשירים ששולחים עם V = F חייבים לפעול עם x.0.
  • optional="false" אבל יחד עם גרסאות ראשיות ישנות יותר באותו תג <hal>, אם מכשירים שנשלחים עם V = F חייבים להתחיל לפעול עם HAL הזה, אבל יכולים להפעיל אותם עם גרסה ראשית ישנה יותר.
  • optional="true" אם מכשירים שנשלחים עם V = F לא צריכים להפעיל את ממשק התשלומים HAL.

לדוגמה, ב-Android 9 אנחנו משיקים את health@2.0 כשדרוג לגרסה 1.0 HAL של גרסה 1.0, ונוציא משימוש את הגרסה 1.0 HAL. הגרסה הישנה יותר, health@1.0, היא אופציונלית במכשירים שמותקנת בהם מערכת ההפעלה Android 8.0 ו-Android 8.1. במכשירים שמושקים עם Android 9 אסור לספק את קוד ה-HAL 1.0 שהוצא משימוש, ובמקום זאת לספק את הגרסה החדשה 2.0. אני compatibility_matrix.legacy.xml, compatibility_matrix.1.xml ו-compatibility_matrix.2.xml:

<hal format="hidl" optional="true">
    <name>android.hardware.health</name>
    <version>1.0</version>;
    <interface>
        <name>IHealth</name>
        <instance>default</instance>
    </interface>
</hal>

הרשומה הזו הועתקה אל compatibility_matrix.F.xml והשתנתה באופן הבא:

<hal format="hidl" optional="false">
    <name>android.hardware.health</name>
    <version>2.0</version>
    <interface>
        <name>IHealth</name>
        <instance>default</instance>
    </interface>
</hal>

הגבלות:

  • מכיוון שגרסת 2.0 HAL נמצאת ב-compatibility_matrix.3.xml עם optional="false", המכשירים שמופעלים עם Android 9 צריכים לכלול גם HAL 2.0.
  • גרסת HAL 1.0 לא נמצאת ב-compatibility_matrix.3.xml ולכן מכשירים שמופעלים בהם Android 9 לא יכולים לספק קוד 1.0 HAL (כי HAL הזה נחשב כהוצאה משימוש).
  • גרסת HAL 1.0 קיימת בגרסה 1.0 HAL (גרסאות ישנות יותר של FCM שאיתה מערכת Android 9 יכולה לעבוד) בתור HAL אופציונלי, ולכן מסגרת Android 9 עדיין יכולה לפעול עם גרסת 1.0 HAL (שלא נחשבת לגרסת HAL שהוסרה).

גרסאות חדשות של FCM

תהליך הפרסום של גרסת FCM במחיצת המערכת מתבצע אך ורק על ידי Google כחלק מגרסת AOSP, והוא כולל את השלבים הבאים:

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

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

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

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

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

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

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

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

  • המסגרת דורשת גרסה גבוהה יותר (ראשית או משנית).
  • ל-framework אין יותר צורך ב-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 נחשב כהוצאה משימוש.

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

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

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

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

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

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

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

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

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

סטטוס גרסת 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 שלא פורסם.

ב-framework HALs, אם גרסת HAL נמצאת רק במניפסט ה-framework של הסתעפות פיתוח לא קשורה, היא נחשבת כגרסת 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 נוכחיות.

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

הופץ אבל הוצא משימוש

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

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

לדוגמה:

לכן, power@1.0 הוא קיים ב-Android, אבל לא הוצא משימוש.

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

הוסר

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

  • היא הושקה בעבר.
  • היא לא נמצאת במטריצת תאימות ציבורית או קפואה שנתמכת במסגרת ה-framework.

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

ל-framework HALs, המערכת מסירה גרסת HAL רק אם היא עומדת בדרישות הבאות:

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

מנהלי FCM מדור קודם

גרסת היעד של FCM היא ערך מיוחד לכל המכשירים שהם לא טרבל. ב-FCM הקודם, compatibility_matrix.legacy.xml, מפורטות הדרישות של ה-framework במכשירים מדור קודם (כלומר מכשירים שהופעלו לפני Android 8.0).

אם הקובץ הזה קיים בשביל FCM בגרסה F, אפשר לשדרג כל מכשיר שאינו טרבל ל-F בתנאי שמניפסט המכשיר שלו תואם לקובץ הזה. להסרה של גרסאות יעד אחרות של FCM, תהליך ההסרה זהה לתהליך ההסרה של גרסאות היעד הרלוונטיות של FCM (כשמספר המכשירים הפעילים לפני 8.0 יורד מתחת לסף מסוים).

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

כאן אפשר למצוא את רשימת הגרסאות של FCM שפורסמו בקטע hardware/interfaces/compatibility_matrices.

כדי לבדוק איזו גרסה של FCM הושקה בגרסה ספציפית של Android: Level.h.