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

AOSP common kernels (שנקראים גם Android common kernels או ACKs) הם נגזרים של ליבות kernel.org וכוללים תיקונים שמעניינים את קהילת Android, שלא מוזגו לליבות mainline או Long Term Supported ‏ (LTS). התיקונים האלה יכולים לכלול:

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

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

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

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

ענף ליבה של ACK KMI

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

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

ענף מ-android-mainline

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

יצירת ליבות נפוצות מליבת android-mainline

איור 1. יצירת ליבות נפוצות מליבת android-mainline

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

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

מחזור החיים של ענף ACK KMI

מחזור החיים של ענף KMI של ACK מוצג באיור 2.

‫6.6 מחזור החיים של ענף KMI של ACK

איור 2. ‫6.6 מחזור החיים של ענף KMI של ACK

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

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

שלב הפיתוח

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

שלב הייצוב

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

שלב קפוא של KMI

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

כשענף 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, נשמרת תאימות לאחור עם מרחב המשתמש, כך שאפשר להשתמש בליבה בבטחה לגרסת פלטפורמת Android שהמכשיר הושק איתה. בדיקות רציפות עם גרסאות קודמות שומרות על תאימות. לכן, באיור 2, אפשר להשתמש ב-android15-6.6kernel במכשירי Android מגרסה 15 ומעלה. מכיוון שגרסת פלטפורמת Android תואמת גם לגרסאות קודמות, אפשר להשתמש בליבת android14-6.1 במכשירי Android 15 גם להפעלה וגם לשדרוג.

מספר הדור של KMI

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

$ uname -r
6.6.30-android15-6-g86d10b30f51f

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

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

תאימות בין ליבות

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

ליבות GKI

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

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

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

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

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

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

עדכון לפלטפורמת Android ליבות נתמכות
‫Android 17‏ (2026) android17-6.18
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10 (לא נתמך ב-Android 17 QPR1 ואילך) ‫
android12-5.10 (לא נתמך ב-Android 17 QPR1 ואילך)
‫Android 16‏ (2025) android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
‫Android 15‏ (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
‫Android 14 ‏ (2023) 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
‫Android 12 ‏ (2021) android12-5.10

משך התמיכה ותיקוני אבטחה

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

יכול להיות שתהיה תמיכה ב-ACKs למשך זמן ארוך יותר מאשר בגרסת הליבה היציבה התואמת במעלה הזרם בכתובת kernel.org. במקרה כזה, Google מספקת תמיכה מורחבת עד לתאריך סוף חיי המוצר (EOL) שמוצג בקטע הזה. כשגרעיני מערכת מגיעים לסוף החיים שלהם, הם כבר לא נתמכים על ידי Google והמכשירים שפועלים בהם נחשבים לפגיעים.

החל מליבה (kernel) 6.6, משך התמיכה בליבות היציבות הוא 4 שנים.

בטבלה הזו מפורטים משכי החיים של אישורי ה-ACK הנתמכים:

הסתעפות ACK תאריך
ההשקה
תמיכה
לכל
משך החיים(שנים)
EOL
android12-5.10 2020-12-13 6 2027-07-01
android13-5.10 2020-12-13 6 2027-07-01
android13-5.15 2021-10-31 6 2028-07-01
android14-5.15 2021-10-31 6 2028-07-01
android14-6.1 2022-12-11 6 2029-07-01
android15-6.6 2023-10-29 4 2028-07-01
android16-6.12 2024-11-17 4 2029-07-01
android17-6.18 2025-11-30 4 2030-07-01

בדיקות נפוצות של ליבת המערכת

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

בדיקות KernelCI

בדיקות build-and-boot של KernelCI מופעלות בכל פעם שמתבצעת התחייבות לתיקון חדש בענף ליבת משותף. מאות הגדרות של בילד נבדקות ומבוצעת אתחול שלהן בלוחות שונים. תוצאות עדכניות של ליבות Android זמינות באתר KernelCL.

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

בדיקות לפני שליחה משמשות למניעת כשלים בקרנלים הנפוצים של Android. סיכום תוצאות הבדיקה נמצא בכרטיסייה Checks (בדיקות) של שינוי הקוד ב-Android common kernel gerrit.

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

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

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

בדיקות של פרצות אפס-יום

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

מטריצת בדיקה

Android common kernel גרסאות של פלטפורמת Android חבילות מקרים לבדיקה
ראשי 17 16 15 14 13 KernelCI לפני השליחה אחרי השליחה אפס ימים
android-mainline
android17-6.18
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10

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

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

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