ליבונים משותפים של AOSP (שנקראים גם ליבות משותפים של Android או ACKs) הם ליבות שמגיעים מ-downstream של ליבות kernel.org, וכוללים תיקונים שעניינים לקהילת Android ושעדיין לא מוזגו לליבת המקור או לליבות עם תמיכה לטווח ארוך (LTS). התיקונים האלה יכולים לכלול:
- גרסאות Backport ותכונות נבחרות מקוד מקור שדרושות לתכונות של Android
- תכונות שזמינות במכשירי Android אבל עדיין בתהליך פיתוח ב-upstream
- תכונות של ספקים או יצרני ציוד מקורי ששימושיות לשותפים אחרים בסביבה העסקית
android-mainline
היא ההסתעפות הראשית של הפיתוח של תכונות Android. ההתמזגות של Linux mainline עם android-mainline
מתרחשת בכל פעם ש-Linus Torvalds מפרסם גרסה או גרסה מועמדת להפצה. לפני 2019, הליבה המשותפת של Android נוצרה על ידי יצירת עותקים מקודמים של הליבה של LTS שהוצהרה לאחרונה והוספת התיקונים הספציפיים ל-Android. התהליך הזה השתנה בשנת 2019 כדי ליצור את הליבה המשותפת החדשה של Android מ-android-mainline
. המודל החדש הזה מאפשר להשיג את אותה תוצאה באופן מצטבר, וכך חוסך את המאמץ המשמעותי של העברת יציאות ובדיקת תיקוני Android. android-mainline
עובר בדיקות מתמשכות משמעותיות, והמודל הזה מבטיח ליבת איכות גבוהה מהיום שבו היא מתפרסמת.
כשמכריזים על LTS חדש ב-upstream, הליבה המשותפת המתאימה מתפצלת מ-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 15, אפשר היה להשתמש בכל אחד משלושת הליבות האחרונות להשקת המכשיר. החל מ-Android 15, אפשר להשתמש בשתי הגרסאות האחרונות של הליבה להפעלת המכשיר. הליבות של Android 15 הן android15-6.6
ו-android14-6.1
.
מאחר ששדרוגי ליבה לא נדרשים כשמעדכנים את הגרסה של הפלטפורמה, עדיין אפשר להשתמש בליבות בלי התכונות העדכניות ביותר של גרסה של פלטפורמה כדי להשיק מכשירים. לכן, אפשר להשתמש בליבות שתוכננו ל-Android 14, כמו android14-6.1
, במכשירים גם אחרי שמשדרגים את גרסת הפלטפורמה ל-Android 15.
גרסה לפלטפורמת Android | גרעיני הפעלה | ליבות של תכונות |
---|---|---|
Android 15 (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.10
|
android14-6.1
android14-5.15
|
Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
android13-5.15
android13-5.10
|
Android 12 (2021) |
android12-5.10
android12-5.4
android11-5.4
|
android12-5.10
android12-5.4
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
1 יכול להיות שיחולו הגבלות נוספות אם ה-BSP המשויך עודכן לגרסה החדשה של הפלטפורמה. באופן כללי, מספר הגרסה של Android בליבה צריך להיות גדול מגרסת היעד של FCM או שווה לה. לפרטים נוספים, ראו אובייקט ממשק הספק – התאמה להסתעפויות של הליבה. |
היררכיית ליבה נפוצה
הסתעפות מ-android-mainline
הרמה העליונה של היררכיית הליבה המשותפת מוצגת באיור 1.
איור 1. יצירת ליבות משותפים מליבה של android-mainline
שימו לב שגרסת הליבה המשותפת החדשה של Android android14-6.1
הופקה מהגרסה android-mainline
בשנת 2022. בשנת 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. החל מגרסה 15 של Android (2024), יש רק ליבה GKI חדשה אחת לכל גרסת ליבה (אין ליבה android15-6.1
).
מחזור החיים של ההסתעפות ב-ACK KMI
מחזור החיים של הסתעפות KMI ב-ACK מוצג באיור 2 שבהמשך.
איור 2. מחזור החיים של ההסתעפות ב-ACK KMI בגרסה 6.6
כדי להבהיר את תהליך הפיתוח ואת מחזור החיים של ההסתעפויות, תרשים 2 מתמקד בהסתעפויות של ACK KMI בגרסה 6.6.
כל הסתעפות של ACK KMI עוברת דרך שלושה שלבים, שמצוינים בתרשים 2 באמצעות צבעים שונים בכל הסתעפות. כפי שמוצג, השילוב של LTS מתבצע באופן קבוע ללא קשר לשלב.
שלב הפיתוח
כשהוא נוצר, ההסתעפות של ACK KMI נכנסת לשלב הפיתוח (שסומן בתור dev באיור 2), והיא פתוחה לתרומות של תכונות לגרסה הבאה של פלטפורמת Android. באיור 2, השגיאה android15-6.6
נוצרה כשגרסת הליבה 6.6 הוכרזה כגרסת הליבה החדשה של LTS במקור.
שלב הייצוב
כשהתכונה מוגדרת כשלמה בהסתעפות ACK KMI, היא נכנסת לשלב היציבות (המוכרז כstable באיור 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.6
במכשירים עם 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 15 (2024) |
android15-6.6
|
android15-6.6
|
Android 14 (2023) |
android14-6.1
|
android14-6.1
|
Android 13 (2022) |
android13-5.15
|
android13-5.15
|
Android 12 (2021) |
android12-5.10
|
android11-5.4
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
תוחלת חיים ותיקוני אבטחה
ב-ACKs מתקבלים מיזוגים של LTS מ-upstream ותיקוני באגים לקוד שספציפי ל-Android. התיקונים האלה כוללים את כל תיקוני האבטחה של הליבה שצוינו בעדכוני האבטחה החודשיים של Android שרלוונטיים ל-ACK.
יכול להיות שתהיה תמיכה ב-ACKs למשך זמן ארוך יותר מאשר לליבת ה-kernel היציבה המתאימה ב-kernel.org. במקרה כזה, Google מספקת תמיכה מורחבת עד לתאריך הסיום של חיי המוצר (EOL) שמצוין בקטע הזה. כשגרסאות הליבה מגיעות ל-EOL, Google מפסיקה לתמוך בהן והמכשירים שפועלות בהם נחשבים לנקודות חולשה.
החל מגרסת הליבה 6.6, משך החיים של התמיכה בליבות היציבות הוא 4 שנים.
בטבלה הבאה מוצגות תקופות החיים של הודעות ה-ACK הנתמכות:
הסתעפות ACK | תאריך ההשקה |
תמיכה לכל החיים (שנים) |
EOL |
---|---|---|---|
android11-5.4 | 2019-11-24 | 6 | 2026-01-01 |
android12-5.4 | 2019-11-24 | 6 | 2026-01-01 |
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 |
בדיקות ליבה נפוצות
הליבות הנפוצות נבדקות בכמה מערכות CI, בנוסף לבדיקות של ספקים במורד הזרם.
בדיקה פונקציונלית של ליבה של Linux
Linux Kernel Functional Test (LKFT) הוא בדיקה שמפעילה חבילות בדיקה שונות, כולל kselftest, LTP, VTS ו-CTS, על קבוצה של מכשירים פיזיים מסוג arm32 ו-arm64. תוצאות הבדיקה האחרונות זמינות כאן.
בדיקות KernelCI
בדיקות ה-build-and-boot של KernelCI מופעלות בכל פעם שמתבצע השמירה של תיקון חדש להסתעפות ליבה משותפת. מאות הגדרות build נבדקות ומופעל בהן אתחול בלוחות שונים. תוצאות עדכניות לגבי ליבות Android זמינות כאן.
בדיקות לפני שליחת בקשה לבדיקה ובדיקות לאחר שליחת בקשה לבדיקה ב-Android
הבדיקות לפני שליחת הקוד משמשות למניעת כשל בגרעינים הנפוצים של Android. סיכום תוצאות הבדיקה מופיע בכרטיסייה 'בדיקות' של שינוי הקוד ב-Android common kernel gerrit.
בדיקות של Android לאחר שליחת בקשה מתבצעות ב-builds חדשים שפורסמו בהסתעפויות ליבה נפוצות של Android, כשתיקונים חדשים מועברים להסתעפות ליבה נפוצה של Android ב-ci.android.com. כשתזינו את הערך aosp_kernel
בתור שם חלקי של ההסתעפות ב-ci.android.com, תוצג רשימה של הסתעפויות ליבה עם תוצאות זמינות. לדוגמה, התוצאות של android-mainline
מופיעות כאן. כשלוחצים על גרסה ספציפית של build, סטטוס הבדיקה מופיע בכרטיסייה Test Results
.
הבדיקות שמוגדרות על ידי test-mapping עם קבוצת הבדיקות kernel-presubmit
בעץ המקור של פלטפורמת Android יפעלו כבדיקה לפני שליחת בקשת העריכה להסתעפויות של ליבה של Android. לדוגמה, ההגדרה הבאה ב-test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING תפעיל את vts_kernel_proc_file_api_test כבדיקה לפני שליחת קובץ לבדיקה (presubmit) בזמן הבדיקה של קוד הליבה המשותף של Android.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
בדיקת 0 ימים
בבדיקה של 0-day מתבצע בדיקה של תיקון אחרי תיקון בכל ההסתעפויות הנפוצות של הליבה של Android כשמתבצעת התחייבות לתיקונים חדשים. מתבצעות בדיקות שונות של אתחול, בדיקות פונקציונליות ובדיקות ביצועים. הצטרפות לקבוצה הציבורית cros-kernel-buildreports
מטריצת בדיקה
Android common kernel | גרסאות של פלטפורמת Android | חבילות בדיקה | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
ראשי | 15 | 14 | 13 | 12 | 11 | 10 | LKFT | KernelCI | לפני שליחה | אחרי שליחה | 0 ימים | |
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android15-6.6
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
תרומה לליבת Android
באופן כללי, פיתוח תכונות צריך להתבצע ב-Linux הראשי ולא בליבות נפוצות של Android. מומלץ מאוד לבצע פיתוח ב-upstream, ואחרי שהפיתוח יתקבל שם, אפשר להעביר אותו בקלות להסתעפות הספציפית ב-ACK לפי הצורך. צוות הליבה של Android ישמח לתמוך במאמצים להעברת קוד למקור (upstreaming) לטובת הסביבה העסקית של Android.
שולחים תיקונים ל-Gerrit ופועלים בהתאם להנחיות לתרומות.