פרויקט תמונת ליבה גנרי (GKI)

ליבה של מוצר, שנקראת גם ליבה של מכשיר או ליבה של OEM, היא הליבה שאתם שולחים עם המכשיר. לפני GKI, הליבה של המוצר נוצרה מסדרה של שינויים בליבה של המקור. באיור 1 מוצג איך הוספות לליבה יוצרות ליבה של מוצר (ליבה של OEM או של מכשיר):

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

איור 1. פיתוח ליבה של מוצר לפני GKI.

  1. הליבה של Linux Long Term Supported (LTS) מ-kernel.org שונתה באמצעות תיקונים ספציפיים ל-Android, וכתוצאה מכך נוצרה Android Common Kernel (ACK).
  2. ספקים שנוספה להם תמיכה במערכת על שבב (SoC) שלהם שינו את ה-ACK. הספקים עשויים גם להוסיף אופטימיזציות של ביצועים או של צריכת חשמל. הליבה שמתקבלת נקראת ליבה של ספק.
  3. לבסוף, יצרני ציוד מקורי (OEM) שינו את הליבה של הספק עם מנהלי התקנים נוספים של התקנים והתאמות אישיות נוספות שנראו להם נחוצות. הליבה שנוצרת נקראת ליבה של מוצר.

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

עלויות הפרגמנטציה

לפיצול הליבה יש כמה השפעות שליליות על קהילת Android.

עדכוני אבטחה מצריכים מאמץ

תיקוני האבטחה שצוינו בעדכון האבטחה של Android‏ (ASB) צריכים לעבור תהליך backport לכל ליבות המכשיר. עם זאת, בגלל הפיצול של הליבה, העברת תיקוני אבטחה למכשירי Android בשטח היא יקרה מאוד.

קשה למזג עדכונים עם תמיכה לטווח ארוך

הגרסאות של תומכת לטווח ארוך (LTS) כוללות תיקוני אבטחה ותיקוני באגים קריטיים נוספים. שמירה על עדכניות בגרסאות LTS היא הדרך היעילה ביותר לספק תיקוני אבטחה. במכשירי Pixel גיליתי ש-90% מבעיות אבטחת הליבה שדווחו ב-ASB כבר תוקנו במכשירים שלא מעודכנים.

עם זאת, בגלל כל השינויים בהתאמה אישית בליבות של המכשירים, קשה למזג את התיקונים של LTS בליבות של המכשירים.

מניעת שדרוגי הגרסאות של פלטפורמת Android

הפילוח מקשה על תכונות חדשות ב-Android שמחייבות הוספה של שינויי ליבה למכשירים בשדה. קוד Android Framework צריך להניח שיש תמיכה בעד חמש גרסאות של ליבה, ושלא בוצעו שינויים בליבה במהדורת הפלטפורמה החדשה (Android 10 תומך בליבות 3.18, ‏ 4.4, ‏ 4.9, ‏ 4.14 ו-4.19, שבמקרים מסוימים לא שודרגו בתכונות חדשות מאז Android 8 בשנת 2017).

קשה לתרום שינויים בליבה חזרה ל-Linux במקור

בגלל כל השינויים שבוצעו בליבה, רוב המכשירים המובילים מגיעים עם גרסת ליבה שכבר בת 18 חודשים לפחות. לדוגמה, הליבה 4.14 שוחררה על ידי kernel.org בנובמבר 2017, והטלפונים הראשונים עם Android שמשתמשים בליבות 4.14 הופצו באביב 2019.

העיכוב הארוך הזה בין השקת הליבה (kernel) ב-upstream לבין המוצרים, מקשה על קהילת Android להזין את התכונות ומנהלי ההתקנים הנחוצים לליבה (kernel) של ה-upstream.

תיקון הפיצול: Generic Kernel Image

הפרויקט Generic Kernel Image‏ (GKI) מטפל בפיצול הליבה על ידי איחוד הליבה של הליבה והעברת התמיכה ב-SoC ובלוח מהליבה של הליבה למודול ספקים שניתן לטעינה. GKI מציג גם ממשק יציב של מודול הליבה (KMI) למודולים של ספקים, כך שאפשר לעדכן את המודולים ואת הליבה בנפרד. אלה כמה מהמאפיינים של הליבה של GKI:

  • הליבה של GKI מבוססת על מקורות ACK.
  • הליבה של GKI היא בינארית בליבה יחידה, בתוספת מודולים משויכים לטעינה בכל ארכיטקטורה, לכל גרסת LTS (כרגע רק Arm64 ב-android11-5.4 וב-android12-5.4).
  • הליבה של GKI נבדקת עם כל המהדורות של פלטפורמת Android שנתמכות ב-ACK המשויך. אין הוצאה משימוש של תכונות בכל משך החיים של גרסת ליבה של GKI.
  • הליבה של GKI חושפת KMI יציב לנהגים ב-LTS נתון.
  • הליבה של GKI לא מכילה קוד ספציפי ל-SoC או ללוח.

תמונה של ארכיטקטורת GKI מופיעה במאמר סקירה כללית על הליבה.

GKI הוא שינוי מורכב שהושק במספר שלבים, החל בליבות של גרסה 5.4 בגרסת הפלטפורמה של Android 11.

קיימים שני שלבים ב-GKI:

  • GKI 1.0 הושק ב-Android 11 למכשירים עם 5.4 ליבות. GKI 1.0 רלוונטי לכל המכשירים ששולחים עם ליבות 5.4, גם אלה שהושקו עם Android 12 או Android 13.
  • GKI 2.0 הושק ב-Android 12 למכשירים עם 5.10 ליבות, והוא התקן החדש לכל המכשירים ששולחים עם ליבה (kernel) 5.10 ואילך.

GKI 1.0

ב-GKI 1.0, מכשירי Android 11 ואילך עם ליבת גרסת 5.4 חייבים לעבור את בדיקות GKI. יעדי GKI 1.0 כוללים את אלה:

  • מומלץ להימנע מנסיגה לאחור בחבילת בדיקות של הספק (VTS) או בחבילת בדיקות התאימות (CTS) כשמחליפים את הליבה של המוצר בליבה של GKI.
  • הפחתת העומס על השותף להקפיד לעדכן את הליבה שלו באמצעות ליבות נפוצות של AOSP.
  • שינויים ב-Android ליבה בתוך הליבות של מכשירים שמשודרגים ומופקים עם גרסאות Android חדשות.
  • אסור לשבור את מרחב המשתמשים של Android.
  • הפרדה בין רכיבים ספציפיים לחומרה לליבה הליבה כמודולים נטענים.

למסמכי העזרה של GKI 1.0, ראו הקטע GKI 1.0.

GKI 2.0

ב-GKI 2.0, מכשירים עם ליבה (kernel) 5.10 ואילך חייבים להישלח עם הליבה של GKI (החל מ-Android 12). קובצי אימג' של אתחול חתומים זמינים ומתעדכנים באופן קבוע עם תיקוני באגים קריטיים ותיקוני LTS. מכיוון שהיציבות הבינארית נשמרת ב-KMI, אפשר להתקין את תמונות האתחול האלה בלי לבצע שינויים בתמונות של הספק. היעדים של GKI 2.0 כוללים את היעדים הבאים:

  • לא מוסיפים ביצועים משמעותיים או רגרסיות כוח כשמחליפים את הליבה של המוצר בליבה (kernel) של GKI.
  • מאפשרים לשותפים לספק תיקוני באגים ותיקוני אבטחה בליבה בלי מעורבות של הספק.
  • הפחתת העלות של עדכון גרסת הליבה הראשית במכשירים (לדוגמה, מ-v5.10 לליבה של LTS 2021).
  • מנהלים גרעין GKI בינארי יחיד לכל ארכיטקטורה על ידי עדכון גרסאות הליבה באמצעות תהליך ברור לשדרוג.

GKI 2.0 מייצג את המצב העדכני ביותר של הליבה של Android. מסמכי העזרה של הליבה מחוץ לקטעים GKI 1.0 ו-ליבות קודמים (‎<=4.19) משקפים את הארכיטקטורה של GKI 2.0.