בדף הזה מתוארת הסכימה לניהול גרסאות של קובצי אימג' של ליבה גנרית (GKI). ל-Generic Kernel Image (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 ו מודולים של ליבה (kernel) שניתנים לטעינה באופן דינמי (DLKM). |
רמה משנית | y | 42 | תיאור סדר הגרסאות של הליבה באותה גרסה של KMI. |
בטבלה הבאה מפורטים מונחים קשורים נוספים לצורך עיון.
שם | סמל | דוגמה | תיאור |
---|---|---|---|
w.x.y | w.x.y | 5.4.42 |
פרטים נוספים זמינים במאמר Linux קובצי Kernel Makefiles (מחפשים את KERNEL הסכמה). w.x.y מופיע ישירות במסמך הזה. זה גם נקרא בדרך כלל מספר הגרסה בעלת שלושה חלקים. המונח שבו נעשה שימוש ב-VINTF, גרסת ליבה, עלול לגרום לבלבול עם מונחים אחרים, במיוחד W. המשתנה הזה נקרא kernel_version_tuple ב-libkver. אסור להפחית את הצבע הזה באמצעות עדכונים, כולל OTA או הראשי. |
הסתעפות ליבה | zzz-w.x | android12-5.4 | מונח זה נמצא בשימוש ב סוגים נפוצים של הסתעפויות ליבה. |
גרסה | w | 5 | המונח הזה לא מופיע במסמך הזה. משתנה זה נקרא גרסה ב-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. לדוגמה
בגרסת ליבה, גרסת ה-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 של השמירה ב-git.
libkver
הספרייה libkver מספקת ממשק C++ לניתוח מהדורת הליבה או
מחרוזת גרסת KMI. לרשימה של ממשקי API ש-libkver חושפים:
packages/modules/Gki/libkver/include/kver
בדיקות VINTF
ל-Android מגרסה 11 ומטה, החלק של הגרסה ל-Android בגרסת KMI הוא שצוינו באופן ידני בקובץ המניפסט של המכשיר על ידי יצרני המכשירים. לפרטים, לעיון בכללי התאמת ליבה (kernel) של 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
.
מכיוון ש-ramdisk נוצר תמיד מהתחלה, השימוש בחותמת הזמן של ה-ramdisk מספיק כדי לתאר את קובץ האימג' של האתחול כולו. אין צורך לקודד את גרסת הליבה בגרסה של קובץ האימג' להפעלה, אלא אם אתם מתכוונים לחבר בעתיד קובץ אימג' להפעלה ישן לקובץ בינארי חדש של ליבה.
לפני עדכון OTA, לקוח OTA בודק את גרסת קובץ האתחול בדיוק כמו כל מחיצה אחרת.