ליבות נפוצות של AOSP (שנקראות גם ליבות נפוצות של Android או ACKs) הן ליבות במורד הזרם של ליבות kernel.org, והן כוללות תיקונים שמעניינים את קהילת Android ושלא מוזגו לליבות הראשיות או לליבות עם תמיכה לטווח ארוך (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 יש Kernel Module Interface יציב. ממשק KMI מזוהה באופן ייחודי לפי גרסת הליבה וגרסת הפלטפורמה של Android, ולכן שמות הענפים הם ANDROID_RELEASE-KERNEL_VERSION
.
לדוגמה, ליבת GKI 6.1 ל-Android 14 נקראת android14-6.1. ב-Android 15, הושק ליבת GKI android15-6.6.
היררכיית ליבה משותפת
הסתעפות מ-android-mainline
רמת העל של היררכיית הליבה המשותפת מוצגת באיור 1.
איור 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
מחזור החיים של ענף ACK KMI מוצג באיור 2.
איור 2. מחזור החיים של ענף KMI ב-6.6 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.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 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
android12-5.4 (לא נתמך ב-Android 16 QPR1 ואילך)
android11-5.4 (לא נתמך ב-Android 16 QPR1 ואילך)
|
| Android 15 (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 14 (2023) |
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
| Android 13 (2022) |
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
|
משך התמיכה ותיקוני אבטחה
ACKs מקבלים מיזוגים של LTS מ-upstream ותיקוני באגים לקוד ספציפי ל-Android. התיקונים האלה כוללים את כל תיקוני האבטחה של ליבת המערכת שמוזכרים בחדשות האבטחה של Android מדי חודש, ושרלוונטיים ל-ACK.
יכול להיות שתהיה תמיכה ב-ACK למשך תקופה ארוכה יותר מאשר בגרסת הליבה היציבה התואמת ב-kernel.org. במקרה כזה, Google מספקת תמיכה מורחבת עד לתאריך סוף חיי המוצר (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 |
| android16-6.12 | 2024-11-17 | 4 | 2029-07-01 |
בדיקה של ליבת מערכת ההפעלה
הליבות הנפוצות נבדקות באמצעות כמה מערכות CI, בנוסף לבדיקות במורד הזרם על ידי ספקים.
בדיקה פונקציונלית של ליבת Linux
Linux Kernel Functional Test (LKFT) בדיקות מתחילות בחבילות בדיקה שונות, כולל kselftest, LTP, VTS ו-CTS, במערך של מכשירי arm32 ו-arm64 פיזיים. תוצאות הבדיקה האחרונות זמינות בדף android-lkft.
בדיקות KernelCI
בדיקות build-and-boot של KernelCI מופעלות בכל פעם שמתבצעת התחייבות לתיקון חדש בענף ליבת נפוץ. מאות הגדרות של build נבדקות ומבוצעת בהן אתחול בלוחות שונים. תוצאות עדכניות של ליבות Android אפשר למצוא באתר KernelCL.
בדיקות לפני ואחרי שליחה ב-Android
בדיקות לפני שליחה משמשות למניעת כשלים בקרנלים הנפוצים של Android. סיכום תוצאות הבדיקה נמצא בכרטיסייה Checks (בדיקות) של שינוי הקוד ב-Android common kernel gerrit.
בדיקות אחרי שליחה ב-Android מתבצעות בגרסאות חדשות שפורסמו בענפי ליבה משותפים של Android, כשתיקונים חדשים מועברים לענף ליבה משותף של Android בכתובת ci.android.com. אם מזינים aosp_kernel כשם ענף חלקי בכתובת ci.android.com, מוצגת רשימה של ענפי ליבה עם תוצאות זמינות. לדוגמה, תוצאות של android-mainline אפשר למצוא במרכז הבקרה של Android CI (אינטגרציה רציפה של Android). לוחצים על גרסה מסוימת כדי לראות את סטטוס הבדיקה בכרטיסייה 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 common kernel.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
בדיקה של אפס ימים
בדיקות 0-day מבצעות בדיקות של תיקונים בכל הענפים של ליבת Android המשותפת, כשמתבצעת התחייבות לתיקונים חדשים. מבוצעות בדיקות שונות של אתחול, פונקציונליות וביצועים. מצטרפים לקבוצה הציבורית cros-kernel-buildreports.
מטריצת בדיקה
| Android common kernel | גרסאות של פלטפורמת Android | חבילות בדיקה | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| ראשי | 16 | 15 | 14 | 13 | 12 | LKFT | KernelCI | לפני שליחה | אחרי השליחה | 0-day | |
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android16-6.12
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android15-6.6
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
תרומה לליבות נפוצות של Android
בדרך כלל, פיתוח תכונות צריך להתבצע ב-Linux המרכזי ולא בקרנלים משותפים של Android. מומלץ מאוד לבצע פיתוח במעלה הזרם, ואחרי שהפיתוח יאושר שם, אפשר להעביר אותו חזרה אל הענף הספציפי של ACK לפי הצורך. צוות ליבת Android שמח לתמוך במאמצי העברת קוד לגרסה העדכנית ביותר לטובת הסביבה העסקית של Android.
שולחים תיקונים ל-Gerrit ומקפידים על ההנחיות האלה לתרומה.