בדף הזה מתואר פרויקט Generic Kernel Image (GKI) ומוסבר איך הוא משפר את היציבות של Android ואת האבטחה.
היסטוריה
לכל מכשיר עם Android נדרש ליבת ייצור. לפני GKI, ליבות (kernels) היו מותאמות אישית ומבוססות על ליבת Android Common Kernel (ACK), עם שינויים ספציפיים למכשיר שבוצעו על ידי ספקי מערכת על שבב (SoC) ויצרני ציוד מקורי (OEM).
ההתאמה האישית הזו עלולה לגרום לכך שעד 50% מקוד הליבה יהיה קוד מחוץ לעץ, ולא מקוד ליבות Linux או ACKs במעלה הזרם. לכן, האופי המותאם אישית של ליבות לפני GKI הוביל לפיצול משמעותי של ליבות.
העלויות של הפיצול
לפיצול הליבה יש כמה השפעות שליליות על קהילת Android.
עדכוני אבטחה דורשים הרבה עבודה
תיקוני האבטחה שמצוינים בחדשות האבטחה של Android (ASB) צריכים להיות מועברים לגרסאות קודמות של ליבות המכשירים. עם זאת, בגלל הפיצול של ליבת המערכת, העברת תיקוני אבטחה למכשירי Android בשטח היא יקרה מדי.
קשה למזג עדכונים של גרסאות עם תמיכה לטווח ארוך
הגרסאות של Long-Term Supported (LTS) כוללות תיקוני אבטחה ותיקוני באגים קריטיים אחרים. התברר שהדרך היעילה ביותר לספק תיקוני אבטחה היא להישאר מעודכנים לגבי גרסאות LTS. במכשירי Pixel, התגלה ש-90% מבעיות האבטחה בקרנל שדווחו ב-ASB כבר תוקנו במכשירים שמתעדכנים באופן שוטף.
עם זאת, בגלל כל השינויים המותאמים אישית בקרנלים של המכשירים, קשה פשוט למזג את התיקונים של LTS בקרנלים של המכשירים.
מניעת שדרוגים של גרסאות פלטפורמת Android
הפיצול מקשה על הוספה של תכונות חדשות ל-Android שדורשות שינויים בקרנל למכשירים בשטח. הקוד של Android Framework היה צריך להתחשב בגרסאות השונות של הליבה, ולא יכול היה להסתמך על הטמעה של תכונות חדשות של Android בליבה. הדבר האט את החדשנות וגרם להגדלת גודל הקוד ולמורכבות שלו.
קשה לתרום שינויים בקרנל בחזרה ל-Linux
הדרך המפוצלת להעברת תיקונים לליבות הייצור גרמה לעיכוב של עד 18 חודשים מהנקודה שבה גרסת LTS הייתה זמינה במעלה הזרם, ועד שהיא הופיעה במכשיר. העיכוב הארוך הזה בין השחרור של ליבת ה-upstream לבין המוצרים מקשה על קהילת Android להזין את התכונות והדרייברים הדרושים לליבות ה-upstream. עד שהמשתמש שלח הצעות לשיפורים, בסיס הקוד השתנה, ולכן היה קשה להראות את הרלוונטיות של התיקון.
תיקון הפיצול: תמונת ליבה גנרית
פרויקט Generic Kernel Image (GKI) מטפל בפיצול הליבה על ידי איחוד ליבת המערכת והעברת התמיכה ב-SoC ובלוח אל מחוץ לליבת המערכת, למודולים של ספקים שאפשר לטעון. בנוסף, GKI מציג ממשק יציב של מודול ליבת מערכת (KMI) למודולים של ספקים, כך שאפשר לעדכן את המודולים ואת ליבת מערכת ההפעלה באופן נפרד. אלה כמה מהמאפיינים של ליבת GKI:
- ליבת ה-GKI נוצרת ממקורות ה-ACK.
- ליבת ה-GKI היא קובץ בינארי של ליבה יחידה בתוספת מודולים ניתנים לטעינה שמשויכים לכל ארכיטקטורה, לכל גרסת LTS.
- הליבה של GKI נבדקת עם כל מהדורות הפלטפורמה של Android שנתמכות על ידי ה-ACK המשויך. אין הוצאה משימוש של תכונות במהלך משך החיים של גרסת ליבת GKI.
- ליבת ה-GKI חושפת ממשק KMI יציב לדרייברים בתוך LTS נתון.
- ליבת ה-GKI לא מכילה קוד ספציפי ל-SoC או ללוח.
בסקירה הכללית על ליבת המערכת מופיעה תמונה של ארכיטקטורת GKI.
תמונה נפוצה
החל מ-Android 12, מכשירים שנשלחים עם גרסת ליבה 5.10 ומעלה חייבים להישלח עם ליבת GKI. גרסאות של Generic Kernel Image (GKI) מתעדכנות באופן קבוע עם LTS ותיקוני באגים קריטיים. יציבות בינארית נשמרת עבור KMI, כך שאפשר להתקין את תמונות האתחול האלה בלי לבצע שינויים בתמונות הספק. היעדים של פרויקט GKI הם:
- אל תגרמו לירידה משמעותית בביצועים או בצריכת החשמל כשמחליפים את ליבת המוצר בליבת GKI.
- לאפשר לשותפים לספק תיקוני אבטחה בקרנל ותיקוני באגים בלי מעורבות של הספק.
- להפחית את העלות של שדרוג גרסת הליבה הראשית במכשירים.
- כדי לשמור על קובץ בינארי יחיד של ליבת GKI לכל ארכיטקטורה, צריך לעדכן את גרסאות הליבה בתהליך שדרוג ברור.