ליבות נפוצות ב-Android

ליבות נפוצות של AOSP (שנקראות גם ליבות נפוצות של Android או ACK) הן ליבה (kernels) של kernel.org, והן כוללות תיקונים מעניינים בקהילת Android שלא מוזגו לליבות ראשיות או לליבות נתמכות לטווח ארוך (LTS). התיקונים האלה יכולים לכלול:

  • עדכונים והמלצה לגבי פונקציונליות upstream שנדרשת לתכונות ב-Android
  • תכונות מוכנות למכשירי Android אבל עדיין בשלבי פיתוח
  • תכונות של ספקים או OEM (יצרן ציוד מקורי) שמועילות לשותפים אחרים בסביבה העסקית

android-mainline היא ענף הפיתוח העיקרי של תכונות ב-Android. השורה הראשית של Linux ממוזגת עם android-mainline בכל פעם ש-Linus Torvalds מפרסם גרסה או מועמד להפצה. לפני 2019, הליבות הנפוצות של Android נוצרו על ידי שכפול ליבת ה-LTS שהוצהרה לאחרונה והוספת התיקונים הספציפיים ל-Android. התהליך השתנה ב-2019 להסתעפות הליבה המשותפת החדשה של Android מ-android-mainline. המודל החדש הזה מונע את המאמץ המשמעותי להעביר קדימה את היציאות ולבדוק תיקונים ל-Android על ידי השגת אותה תוצאה באופן מצטבר. המודל android-mainline עובר בדיקות שוטפות משמעותיות, כדי להבטיח ליבה (kernel) באיכות גבוהה מיום הפרסום שלו.

כשמצהירים על LTS חדש ב-upstream, הליבה המשותפת התואמת מסתעפת מ-android-mainline. כך השותפים יוכלו להתחיל פרויקט לפני ההצהרה על גרסת ה-LTS, על ידי מיזוג מ-android-mainline. אחרי שיוצרים את הסתעפות הליבה המשותפת החדשה, השותפים יכולים לשנות באופן חלק את מקור המיזוג להסתעפות החדשה.

הסתעפויות ליבה נפוצות אחרות מקבלות מיזוגים שוטפים מהליבה של ה-LTS שמשויכת אליה. המיזוגים האלה בדרך כלל מבוצעים מיד אחרי פרסום גרסת ה-LTS. לדוגמה, כשפורסם גרסה 6.1.75 של Linux, הוא מוזג עם ליבה (kernel) משותפת של 6.1 (android14-6.1). אנחנו ממליצים מאוד לשותפים לעדכן את הליבות שלהם כדי להישאר מעודכנים בכל הנוגע ל-LTS ולתיקוני באגים ספציפיים ל-Android.

הסתעפות הליבה של ACK KMI

לליבות של GKI יש ממשק ליבה יציב של מודול ליבה. ה-KMI מזוהה באופן ייחודי באמצעות גרסת הליבה והגרסה של פלטפורמת Android, כך שההסתעפויות נקראת ANDROID_RELEASE-KERNEL_VERSION. לדוגמה, הליבה 6.1 של GKI ל-Android 14 נקראת android14-6.1. ב-Android 15 (AOSP ניסיוני) הופעלה הליבה של GKI android15-6.6.

איך מוסיפים ומשיקים ליבה (kernels)

לפני Android 15 (AOSP ניסיוני), היה אפשר להשתמש בכל אחת משלוש הליבות האחרונות להפעלת המכשיר. החל מ-Android 15 (AOSP ניסיוני), ניתן להשתמש בשתי גרסאות הליבה האחרונות להפעלת המכשיר. הליבה של ההשקה ל-Android 15 (ב-AOSP) היא android15-6.6 ו-android14-6.1.

מכיוון שלא נדרשים שדרוגי ליבה כשמעדכנים את גרסת הפלטפורמה, עדיין אפשר להשתמש בליבות (kernel) שחסרות בהן התכונות העדכניות לגרסת הפלטפורמה כדי להפעיל מכשירים. לכן אפשר להשתמש במכשירים בליבות שתוכננו ל-Android 14, כמו android14-6.1, גם אחרי שמשדרגים את גרסת הפלטפורמה ל-Android 15 (AOSP).

גרסה של פלטפורמת Android השקת ליבות הליבה של התכונה
Android 15 (AOSP ניסיוני) (2024) android15-6.6
android14-6.1
android15-6.6
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.101
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.41
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

1 יכול להיות שיחולו הגבלות נוספות אם ה-BSP המשויך עודכן לגרסת הפלטפורמה. באופן כללי, מספר הגרסה של Android של הליבה צריך להיות גבוה מגרסת היעד של FCM או שווה לה. לפרטים נוספים, ראו אובייקט ממשק ספק – התאמת הסתעפויות ליבה.

היררכיית ליבה משותפת

הסתעפות מ-Android-mainline

הרמה העליונה של היררכיית הליבה המשותפת מוצגת באיור 1.

יצירת ליבות (kernel) נפוצות מליבה (kernel) של android-mainline

איור 1. יצירת ליבות (kernel) נפוצות מליבה (kernel) של android-mainline

שימו לב שליבה נפוצה חדשה של Android android14-6.1 הסתעפה מ-android-mainline בשנת 2022. ב-2023, כשערוץ ה-LTS הבא הוכרז, android15-6.6 הסתעפות מ-android-mainline.

כפי שמוצג באיור 1, כל גרסת ליבה יכולה להיות הבסיס לשתי ליבות של GKI. לדוגמה, שתי הליבות של גרסה 5.15 הן android13-5.15 ו-android14-5.15, ושתיהן הן ליבות (kernel) של מאפיין בגרסאות הפלטפורמה המתאימות. זה היה גם במקרה של 5.10; android12-5.10 נוצר בזמן ההצהרה על ה-LTS והסתעפות android13-5.10 מ-android12-5.10 בשלבי הליבה של תכונת הליבה באביב 2021, כדי לאפשר פיתוח של תכונות ל-Android 13. החל מגרסה 15 של Android (AOSP) (ב-2024), קיימת רק גרסת ליבה חדשה אחת של GKI לכל גרסת ליבה (אין ליבה (kernel) של android15-6.1).

מחזור החיים של הסתעפות ACK KMI

מחזור החיים של הסתעפות KMI מוצג בהמשך באיור 2.

6.6 מחזור חיים בהסתעפות ACK KMI

איור 2. 6.6 מחזור חיים בהסתעפות ACK KMI

כדי להבהיר את תהליך הפיתוח ואת מחזור החיים של ההסתעפות, איור 2 מתמקד בהסתעפויות KMI של ACK ל-6.6.

כל הסתעפות ACK KMI עוברת בין שלושה שלבים שמצוינים באיור 2 בצבעים שונים בכל הסתעפות. כפי שמוצג, LTS ממוזג באופן קבוע ללא קשר לשלב.

שלב הפיתוח

כשיוצרים אותה, הסתעפות ACK KMI נכנסת לשלב הפיתוח (מסומן כ-dev באיור 2), ופתוחה להוספת תכונות בגרסה הבאה של פלטפורמת Android. באיור 2, android15-6.6 נוצרה כשהוצהר ש-6.6 ליבה חדשה של LTS ב-upstream.

שלב הייצוב

כשמצהירים על כך שהסתעפות ACK KMI הושלמה, היא נכנסת לשלב הייצוב (מסומן בתווית יציב באיור 2). תכונות לשותפים ותיקוני באגים עדיין יתקבלו, אבל מעקב KMI מופעל כדי לזהות שינויים שמשפיעים על הממשק. בשלב הזה יתקבלו שינויים לכשלים KMI, וההגדרה של ה-KMI מתעדכנת בקצב מוגדר מראש (בדרך כלל כל שבועיים). פרטים על מעקב KMI מופיעים בסקירה הכללית על GKI.

שלב הקפאת KMI

לפני שגרסת פלטפורמה חדשה מועברת ל-AOSP, הסתעפות ACK KMI מוקפאת ונשארת מוקפאת כל עוד ההסתעפות. המשמעות היא ששינויים ב-KMI לא יתקבלו, אלא אם תזוהה בעיית אבטחה חמורה, שאי אפשר לצמצם בלי להשפיע על ה-KMI היציב. אם לא נדרש תיקון במכשירי Android, חלק מהתיקונים שמוזגו מ-LTS ישתנו או יושמטו, כדי למנוע תקלות ב-KMI.

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

לדוגמה, אסור לבצע שינוי שמוסיף שדה למבנה שמשמש את ליבה משותפת של ממשק KMI כי הוא משנה את הגדרת הממשק:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

אבל אפשר להוסיף פונקציה חדשה:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

כל משך החיים של הליבה של GKI, נשמרים תאימות לאחור למרחב המשתמשים, כדי שאפשר יהיה להשתמש בבטחה בליבה (kernel) של פלטפורמת Android שאיתה הופעל המכשיר. בדיקות רציפות בגרסאות קודמות מבטיחה שהתאימות תישמר. כך, באיור 2, ניתן להשתמש בליבה (kernel) של android15-6.6 במכשירים עם Android 15 (AOSP) ואילך. גרסת הפלטפורמה של Android תואמת גם לגרסאות קודמות, ולכן אפשר להשתמש בליבה (kernel) android14-6.1 של מכשירי Android 15 (AOSP) להשקה או לשדרוג.

מספר גנרציה של KMI

אם מתרחשת מיזוג של LTS במהלך שלב הייצוב, או בעיה באבטחה או אירוע אחר לאחר מכן שדורשים אישור לשינוי KMI, מספר הגנרציה של KMI שתועד ב-build.config.common גדל. אפשר למצוא את הגנרציה הנוכחית של ה-KMI באמצעות הפקודה uname:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

המספר שמופיע אחרי מהדורת הפלטפורמה הוא מספר ה-KMI (6 במקרה הזה).

אם הדור של KMI משתנה, הליבה לא תואמת למודולים של ספקים שתואמים מדור ה-KMI הקודם, ולכן צריך לבנות מחדש את המודולים ולעדכן אותם באופן סינכרוני עם הליבה. אחרי הקפאת KMI, השינויים ביצירת KMI צפויים להיות נדירים מאוד.

תאימות בין ליבה (kernel)

דרישות התאימות בין ליבות באותה משפחת LTS משתנות כבר בליבות (kernel) החדשות של GKI.

ליבות של GKI

הליבות של GKI שומרות על תאימות לאחור לכל הגרסאות של פלטפורמת Android שתומכות בגרסת הליבה. בנוסף, הגרסאות של פלטפורמת Android תואמות לאחור עם ליבות של GKI מגרסאות קודמות. כך אפשר להשתמש בבטחה בליבה (kernel) של android14-6.1 שפותחה ל-Android 14 (2023) במכשירים עם Android 15 (AOSP ניסיוני) (2024). התאימות מאומתת באמצעות בדיקות רציפות של VTS ו-CTS של ליבות GKI עם כל הגרסאות הנתמכות.

ה-KMI יציב כך שאפשר לעדכן את הליבה ללא צורך בבנייה מחדש של מודולים של ליבה בתמונת הספק.

לא נשמרת תאימות KMI בין ליבות שונות של GKI. כך, לדוגמה, אי אפשר להחליף ליבה (kernel) של android14-6.1 בליבה (kernel) של android15-6.6 בלי לבנות מחדש את כל המודולים.

יש תמיכה בליבות של GKI רק בגרסאות הראשוניות והעוקבות שלהן. הם לא נתמכים בגרסאות ישנות יותר. לכן, בליבה (kernel) של android15-6.6 אין תמיכה ב-devs עם Android 14 (2023).

מטריצת תאימות

בטבלה הזו מוצגות גרסאות הליבה שנתמכות ונבדקו בכל גרסה של פלטפורמת Android.

גרסה של פלטפורמת Android ליבות (kernel) נתמכות לשדרוג ליבות (kernel) נתמכות להשקה
Android 15 (AOSP ניסיוני) (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android15-6.6
android14-6.1
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

תמיכה בטווחי חיים ובתיקונים לפגיעויות באבטחה

יש תמיכה בליבות נפוצות ב-Android עד שהתמיכה בליבת ה-LTS המשויכת או בגרסה של פלטפורמת Android תופסק. למרות שיש תמיכה בליבה, היא ממשיכה לקבל מיזוגי LTS מ-upstream ותיקוני באגים בקוד ספציפי ל-Android. התיקונים האלה כוללים את כל תיקוני האבטחה בליבה (kernel) שצוינו בחדשות האבטחה של Android החודשיות, שרלוונטיים לליבות הנפוצות של Android.

השותפים יכולים להיות בטוחים שבאמצעות שימוש בליבות של GKI, הם מקבלים את כל תיקוני האבטחה האפשריים בליבה (kernel) שאפשר.

בדיקת ליבה נפוצה

הליבות הנפוצות נבדקות באמצעות כמה מערכות CI, נוסף על בדיקות downstream על ידי ספקים.

בדיקת פונקציונליות הליבה של Linux

בדיקות הליבה של Linux (LKFT) מתחילות חבילות בדיקה שונות, כולל kselftest, LTP, VTS ו-CTS, בקבוצה של מכשירי Arm32 ו-arm64. תוצאות הבדיקה האחרונות זמינות כאן.

בדיקת KernelCI

בדיקות בנייה ואתחול של KernelCI מתחילות בכל פעם שתיקון חדש מחויב להסתעפות ליבה משותפת. כמה מאות הגדרות build נבדקות ומפעילות בלוחות שונים. כאן אפשר למצוא תוצאות עדכניות לגבי ליבה (kernel) של Android.

בדיקות ב-Android בשליחה מראש ובאחר-שליחה

בדיקות הגשה מראש משמשות כדי למנוע כשלים בליבה (kernel) הנפוצות של Android. הסיכום של תוצאת הבדיקה מופיע בכרטיסייה 'בדיקות' של שינוי הקוד ב-Grerit נפוץ ב-Android.

בדיקות לאחר שליחה ב-Android מתבצעות בגרסאות build חדשות שפורסמו בהסתעפויות ליבה נפוצות של Android כשתיקונים חדשים מחויבים להסתעפות ליבה (kernel) נפוצה של Android ב-ci.android.com. אם מזינים את aosp_kernel בתור שם הסתעפות חלקי ב-ci.android.com, תוצג רשימה של הסתעפויות ליבה (kernel) עם תוצאות זמינות. לדוגמה, התוצאות של android-mainline מופיעות כאן. כשלוחצים על build מסוים, סטטוס הבדיקה מופיע בכרטיסייה Test Results.

הבדיקות שהוגדרו על ידי מיפוי בדיקות עם קבוצת הבדיקה kernel-presubmit בעץ המקור של פלטפורמת Android ירוצו כשליחה מראש עבור הסתעפויות הליבה של Android. לדוגמה, ההגדרה הבאה ב-test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING תפעיל את vts_kernel_proc_file_api_test כבדיקת presbumit בשלב צ'ק אין נפוץ של קוד ליבה (kernel) של Android.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

בדיקה ב-0 ימים

בבדיקות 0 ימים מתבצעות בדיקות תיקונים לכל תיקון בכל הסתעפויות הליבה (kernel) הנפוצות של Android, כשמתבצעים תיקונים חדשים. מתבצעות בדיקות שונות של הפעלה, פונקציונליות וביצועים. מצטרפים לקבוצה הציבורית cros-kernel-buildreports.

מטריצת בדיקה

ליבה (kernel) נפוצה של Android גרסאות של Android Platform חבילות בדיקה
ראשי 15 14 13 12 11 ‏10 LKFT KernelCI שליחה מוקדמת פרסום פוסט אפס ימים
android-mainline
android5-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable

תרומה לליבה (kernel) נפוצה של Android

באופן כללי, פיתוח תכונות צריך להתבצע בגרסה הראשית של Linux, ולא בליבה (kernel) נפוצה של Android. אנחנו ממליצים מאוד על פיתוח ב-upstream, ואחרי שמקבלים את הפיתוח שם אפשר להעביר אותו בקלות לאחור להסתעפות הספציפית של ACK, לפי הצורך. צוות הליבה של Android שמח לתמוך במאמצי העלאה בסטרימינג לתועלת הסביבה העסקית של Android.

אפשר לשלוח תיקונים ל-Gerrit ולפעול בהתאם להנחיות האלה בנושא תרומות.