סכמת ניהול גרסאות של GKI

בדף הזה מתוארת סכמת ניהול הגרסאות של תמונות ליבה גנריות (GKIs). א' תמונת ליבה גנרית (GKI) יש מזהה ייחודי שנקרא מהדורת הליבה. שחרור הליבה מורכבת של גרסת ממשק מודול הליבה (KMI) וברמת המשנה. הליבה ספציפי לתמונה חדשה, ואילו גרסת KMI שמייצג את הממשק שממנו נוצרה גרסה. גרסת KMI יכולה לתמוך כמה שחרורי ליבה. גרסת ליבה (kernel) קשורה רק לגרסת 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 Maker (מחפשים את 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 (קינוח) שאליו משויכת הליבה עם.

כשמשווים את השדה AndroidRelease, החלק המספרי הוא חולץ מהמחרוזת לצורך השוואה.

אין להפחית את מספר הגרסה של 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. לדוגמה בגרסת ליבה, גרסת ה-KMI היא:

5.4-android12-0

תיאור

גרסת ה-KMI מתארת את ממשק מודול הליבה (KMI) בין GKI ו מודולים של ליבה (kernel) שניתנים לטעינה באופן דינמי (DLKM).

אם לשתי גרסאות ליבה יש את אותה גרסת KMI, הן מטמיעות את אותה ליבה של ממשק המשתמש. גם קישורי ה-DLKM שתואמים לאחד מהערכים האלה תואמים עם השני.

אסור להוריד את גרסת ה-KMI באמצעות עדכוני OTA.

רמת משנה

��מת המשנה y מתארת את סדר ההפצה של שחרורי הליבה בתוך אותה גרסת KMI.

לשתי גרסאות ליבה (kernel) בעלות אותה גרסת 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, מספר ה-build תיקונים מעל הליבה (kernel) הבסיסית וגיבובי SHA של ה-Git Save.

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, היא חייבת להיות ארוז בפורמט מטען ייעודי (payload) של OTA, payload.bin. המטען הייעודי (payload) של OTA מקודד version לכל מחיצה. כש-update_engine מטפל במטען ייעודי (payload) של OTA, הוא משווה את השדה הזה כדי לוודא שהמחיצה לא תשודרג לאחור.

כדי למנוע בלבול, השדה version של מחיצת האתחול ב-OTA מטא-נתונים נקראים boot image version.

מכיוון שה-ramdisk תמיד נוצר מאפס, באמצעות ramdisk timestampמספיקה כדי לתאר את כל תמונת האתחול. אין צורך לקודד שחרור ליבה (kernel) בגרסת תמונת האתחול, אלא אם אתם יוצרים רצף תמונות ישן להפעיל קובץ אימג' לקובצי ליבה בינאריים חדשים בעתיד.

לפני עדכון OTA, לקוח OTA בודק את גרסת קובץ האתחול בדיוק כמו כל מחיצה אחרת.