בדף הזה מתואר תהליך יצירת הגרסאות של תמונות ליבה גנריות (GKI). תמונת ליבה כללית (GKI) כוללת מזהה ייחודי שנקרא גרסת הליבה. גרסת הליבה מורכבת מגרסת ממשק מודול הליבה (KMI) ומרמת המשנה. גרסת הליבה ספציפית לתמונה שמופצת, ואילו גרסת ה-KMI מייצגת את הממשק שממנו נוצרת הגרסה. גרסת KMI יכולה לתמוך בכמה מהדורות של ליבת המערכת. כל גרסת ליבה קשורה רק לגרסת KMI אחת. במקרה הלא סביר שבו צריך לשנות את הממשק של מודול הליבה, יצירת ה-KMI חוזרת על עצמה כדי לשקף את השינוי בגרסת ה-KMI.
סיכום התנאים
בטבלה הבאה מפורטים מונחים חשובים שמופיעים בדף הזה ובהקשר של עדכוני GKI.
| שם | סמל | דוגמה | תיאור |
|---|---|---|---|
| גרסת ליבה | w.x.y-zzz-k-suffix | 5.4.42-android12-0-foo | מזהה ייחודי של מהדורת GKI. זה הערך שמוחזר על ידי uname. |
| גרסת KMI | w.x-zzz-k | 5.4-android12-0 | מתואר ממשק מודול הליבה (KMI) בין GKI לבין מודולי ליבה שניתן לטעון באופן דינמי (DLKM). |
| רמת משנה | y | 42 | תיאור של סדר הפרסום של גרסאות הליבה באותה גרסת KMI. |
בטבלה הבאה מפורטים מונחים קשורים נוספים כהפניה.
| שם | סמל | דוגמה | תיאור |
|---|---|---|---|
| w.x.y | w.x.y | 5.4.42 |
פרטים נוספים זמינים במאמר בנושא Linux Kernel Makefiles (צריך לחפש את KERNELRELEASE). הגרסה w.x.y מופיעה ישירות לאורך כל המסמך הזה. הפורמט הזה נקרא גם מספר גרסה בן שלושה חלקים. המונח שבו משתמשים ב-VINTF, kernel version, עלול לגרום לבלבול עם מונחים אחרים, במיוחד w. המשתנה הזה נקרא kernel_version_tuple ב-libkver. הטופל הזה לא יכול לקטון בעקבות עדכונים, כולל עדכונים דרך האוויר (OTA) או עדכונים של ליבת לינוקס. |
| ענף ליבה | zzz-w.x | android12-5.4 | המונח הזה מופיע ב סוגים נפוצים של ענפי ליבה. |
| גרסה | w | 5 | המונח הזה לא מופיע במסמך הזה. המשתנה הזה נקרא version בספרייה libkver. |
| רמת התיקון | x | 4 | המונח הזה לא מופיע במסמך הזה. המשתנה הזה נקרא patch_level בספרייה libkver. |
| גרסת Android | zzz | android12 |
זהו מספר הגרסה של Android (קינוח) שהליבה משויכת אליה.
כשמשווים את השדה מספר הגרסה של Android לא יכול לרדת בעקבות עדכונים, כולל עדכוני OTA או עדכונים של mainline. |
| יצירת KMI | k | 0 |
זהו מספר נוסף שנועד לטפל באירועים לא סבירים. אם תיקון באג אבטחה מחייב שינויים בממשק KMI באותו מהדורת Android, הדור של ממשק ה-KMI גדל. מספר הדור של KMI מתחיל ב-0. |
עיצוב ניהול הגרסאות
גרסת ליבה
הגדרה
במכשירים שנשלחים עם GKI, גרסת הליבה מוגדרת באופן הבא:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
מידע נוסף מופיע במאמר קביעת גרסת הליבה ממכשיר.
זו דוגמה לגרסת ליבה.
5.4.42-android12-0-00544-ged21d463f856
תיאור
גרסת הליבה היא המזהה הייחודי של גרסת GKI. אם לשני קבצים בינאריים של GKI יש את אותה גרסת ליבה, הם חייבים להיות זהים ברמת הבייט.
גרסת ליבה מורכבת מגרסת KMI, מרמת משנה ומסיומת. לצורך המאמר הזה, המערכת מתעלמת מהסיומת אחרי יצירת ה-KMI.
גרסת KMI
הגדרה
גרסת ה-KMI מוגדרת כך:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
הערה: רמת המשנה, y, לא נכללת בגרסת ה-KMI. בדוגמה שבקטע Kernel release, גרסת ה-KMI היא:
5.4-android12-0
תיאור
גרסת ה-KMI מתארת את ממשק מודול הליבה (KMI) בין GKI לבין מודולי ליבה שניתנים לטעינה דינמית (DLKM).
אם לשני מהדורות של ליבת מערכת ההפעלה יש את אותו מספר גרסה של KMI, הן מיישמות את אותו ממשק של מודול ליבת מערכת ההפעלה. מפתחות DLKM שתואמים לאחד מהם תואמים גם לשני.
אסור להקטין את גרסת ה-KMI באמצעות עדכונים דרך האוויר (OTA).
רמת משנה
רמת המשנה, y, מתארת את סדר הפרסום של מהדורות ליבה באותה גרסת KMI.
לשתי גרסאות של ליבת מערכת ההפעלה עם אותה גרסת KMI, אבל עם רמות משנה Y1 ו-Y2 בהתאמה:
- אם Y1 קטן מ-Y2 או שווה לו, מכשיר שפועלת בו גרסה Y1 יכול לקבל עדכון לגרסה Y2.
- אם Y1 גדול מ-Y2, אי אפשר לעדכן מכשיר עם Y1 ל-Y2.
כלומר, אם גרסת ה-KMI לא משתנה, אסור להקטין את רמת המשנה באמצעות עדכון OTA.
איך קובעים את גרסת הליבה של מכשיר
אפשר למצוא את הגרסה המלאה של הליבה על ידי הרצת הפקודה uname -r, או
uname(2)
עם קטע הקוד הבא:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
פלט לדוגמה:
5.4.42-android12-0-00544-ged21d463f856
לצורך המסמך הזה, כל מה שקורה אחרי יצירת ה-KMI לא רלוונטי כשמחפשים מידע על הליבה. באופן רשמי יותר, הפלט של uname -r מנותח באמצעות הביטוי הרגולרי הבא (בהנחה ש-zzz תמיד מתחיל ב-android):
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
המידע שמתעלמים ממנו יכול לכלול פרטים כמו מספר ה-build של ci.android.com, מספר התיקונים שבוצעו מעל ליבת הבסיס וגיבובים של SHA של ה-commit ב-git.
libkver
הספרייה, libkver, מספקת ממשק C++ לניתוח של מהדורת הליבה או של מחרוזת גרסת KMI. רשימת ממשקי ה-API ש-libkver חושף מופיעה במאמר packages/modules/Gki/libkver/include/kver.
בדיקות VINTF
ב-Android 11 ומטה, יצרני המכשירים מציינים באופן ידני את חלק הגרסה של מהדורת Android ב-KMI במניפסט המכשיר. פרטים נוספים זמינים במאמר בנושא כללי התאמה של ליבת VINTF.
מגרסה Android S ואילך, אפשר לחלץ את החלק של גרסת Android מגרסת ה-KMI מהליבה ולהוסיף אותו למניפסט של המכשיר בזמן ה-build.
בדרך כלל הדרישות להגדרת הליבה לא משתנות, ולכן אין צורך לקודד את k במטריצת התאימות. עם זאת, במקרה הלא סביר שבו צריך לשנות את דרישת ההגדרה של ליבת המערכת, חשוב לוודא את הדברים הבאים:
- הדרישה התואמת מטבלת התאימות מוסרת.
- נוספו בדיקות VTS נוספות כדי לבדוק את הדרישות החדשות בהתאם ליצירת KMI.
גרסת קובץ האימג' של האתחול במטא-נתונים של OTA
גם אם קובץ אימג' לאתחול מתעדכן באמצעות OTA, הוא צריך להיות עטוף בפורמט של מטען ה-OTA, payload.bin. מטען ה-OTA מקודד שדה version לכל מחיצה. כש-update_engine מטפל במטען ייעודי (payload) של OTA, הוא משווה את השדה הזה כדי לוודא שהמחיצה לא משודרגת לאחור.
כדי למנוע בלבול, השדה version למחיצת האתחול במטא-נתונים של OTA
נקרא boot image version.
מכיוון שדיסק ה-RAM תמיד נבנה מאפס, השימוש בחותמת הזמן של דיסק ה-RAM מספיק כדי לתאר את כל קובץ האימג' לאתחול. אין צורך לקודד את גרסת הליבה בקובץ האימג' לאתחול, אלא אם אתם מתכננים בעתיד לחבר קובץ אימג' ישן לאתחול עם קובץ בינארי חדש של הליבה.
לפני עדכון OTA, לקוח ה-OTA בודק את גרסת קובץ האימג' לאתחול באותו אופן שבו הוא בודק כל מחיצה אחרת.