בדף הזה מתואר תהליך יצירת הגרסאות של תמונות ליבה גנריות (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 או עדכונים ראשיים. |
יצירת 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 שתואמים לאחד מהם תואמים גם לשני.
עדכוני OTA לא יכולים להקטין את גרסת ה-KMI.
רמת משנה
רמת המשנה, 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, הוא צריך להיות עטוף בפורמט המטען הייעודי (payload) של OTA, payload.bin
. מטען ה-OTA מקודד שדה version
לכל מחיצה. כש-update_engine
מטפל במטען ייעודי (payload) של OTA, הוא משווה את השדה הזה כדי לוודא שהמחיצה לא משודרגת לאחור.
כדי למנוע בלבול, השדה version
למחיצת האתחול במטא-נתונים של OTA
נקרא boot image version
.
מכיוון שדיסק ה-RAM תמיד נוצר מאפס, השימוש בחותמת הזמן של דיסק ה-RAM מספיק כדי לתאר את כל תמונת האתחול. אין צורך לקודד את גרסת ההפצה של הליבה בגרסת תמונת האתחול, אלא אם אתם מתכננים לאחד תמונת אתחול ישנה עם קובץ בינארי חדש של הליבה בעתיד.
לפני עדכון OTA, לקוח ה-OTA בודק את גרסת תמונת האתחול באותו אופן כמו כל מחיצה אחרת.