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

בדף הזה מוסבר על פרויקט Generic Kernel Image ‏ (GKI) ואיך הוא משפר את היציבות של Android ואת האבטחה שלה.

היסטוריה

לכל מכשיר עם Android נדרש ליבת ייצור. לפני GKI, ליבות היו מותאמות אישית ומבוססות על ליבת Android Common Kernel ‏(ACK), עם שינויים ספציפיים למכשיר שבוצעו על ידי ספקי מערכת על שבב (SoC) ויצרני ציוד מקורי (OEM).

ההתאמה האישית הזו עלולה לגרום לכך שעד 50% מקוד הליבה יהיה קוד מחוץ לעץ, ולא מקוד ליבות Linux או ACKs במעלה הזרם. לכן, האופי המותאם אישית של ליבות לפני GKI הוביל לפיצול משמעותי של ליבות.

העלויות של הפיצול

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

עדכוני אבטחה דורשים הרבה עבודה

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

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

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

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

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

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

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

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

תיקון הפיצול: תמונת ליבה גנרית

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

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

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

תמונה נפוצה

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

  • לא להציג רגרסיות משמעותיות בביצועים או בצריכת החשמל כשמחליפים את ליבת המוצר בליבת GKI.
  • לאפשר לשותפים לספק תיקוני אבטחה בקרנל ותיקוני באגים בלי מעורבות של הספק.
  • להפחית את העלות של שדרוג הגרסה הראשית של הליבה במכשירים.
  • לשמור על קובץ בינארי יחיד של ליבת GKI לכל ארכיטקטורה על ידי עדכון גרסאות הליבה בתהליך ברור לשדרוג.