תמונות מערכת גנריות

תמונת מערכת גנרית (GSI) היא תמונת מערכת עם הגדרות מותאמות למכשירי Android. היא נחשבת הטמעה של Android טהור עם קוד לא משונה של Android Open Source Project ‏ (AOSP), שכל מכשיר Android עם Android מגרסה 9 ואילך יכול להפעיל בהצלחה.

תמונות GSI משמשות להרצת בדיקות VTS ו-CTS-on-GSI. קובץ האימג' של מערכת במכשיר Android מוחלף ב-GSI ואז נבדק באמצעות חבילת בדיקות הספק (VTS) וחבילת בדיקות התאימות (CTS) כדי לוודא שהמכשיר מטמיע ממשקי ספק בצורה נכונה עם הגרסה העדכנית של Android.

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

הגדרות ושינויים ב-GSI

ההגדרה הנוכחית של GSI ב-Android היא:

הגרסה הנוכחית של GSI ל-Android כוללת את ההבדלים העיקריים הבאים:

  • ארכיטקטורת המעבד. תמיכה בהוראות שונות של מעבדים (ARM,‏ x86 וכו') ובסוג המעבד (32 ביט או 64 ביט).

יעדי GSI לבדיקות תאימות ל-Treble

מערכת ה-GSI שמשמשת לבדיקת התאימות נקבעת לפי גרסת Android שהמכשיר מופעל איתה.

סוג המכשיר יעד Build
מכשירים שיושקו עם Android 15 gsi_$arch-user (חתום)
מכשירים שיושקו עם Android 14 gsi_$arch-user (חתום)
מכשירים שיושקו עם Android 13 gsi_$arch-user (חתום)
מכשירים שיושקו עם Android 12L gsi_$arch-user (חתום)
מכשירים שמופעלת בהם מערכת Android 12 gsi_$arch-user (חתום)
מכשירים שיושקו עם Android 11 gsi_$arch-user (חתום)

כל תמונות ה-GSI נוצרות מבסיס הקוד של Android 12, ולכל ארכיטקטורת CPU יש קובץ בינארי GSI תואם (אפשר לעיין ברשימת יעדי הבנייה במאמר יצירת תמונות GSI).

שינויים ב-GSI ב-Android 12

במכשירים שהושקו עם Android 12 או עודכנו לגרסה הזו, צריך להשתמש ב-GSI של Android 12 לבדיקות תאימות. השינויים העיקריים לעומת גרסאות GSI קודמות:

  • שם היעד. שם היעד של GSI לבדיקות תאימות השתנה ל-gsi_$arch. ה-GSI עם שם היעד aosp_$arch נשמר למפתחי אפליקציות ל-Android. תוכנית הבדיקה CTS-on-GSI מצומצמת גם לממשק של ספק הבדיקה.
  • הוצאנו משימוש את GSI מדור קודם. ‫GSI 12 מסיר את הפתרונות העקיפים שמתאימים למכשירי Android 8.0 או 8.1 שלא עברו Treblization מלא.
  • Userdebug SEPolicy. ‫GSI gsi_$arch כולל userdebug_plat_sepolicy.cil. בזמן ההתקנה של vendor_boot-debug.img או boot-debug.img הספציפיים ליצרן, /system/bin/init ייטען מ-userdebug_plat_sepolicy.cil של GSI system.img. פרטים נוספים זמינים במאמר בנושא בדיקות VTS עם Debug Ramdisk.

שינויים ב-GSI ב-Android 11

במכשירים שהושקו עם Android מגרסה 11 ואילך או עודכנו לגרסה הזו, צריך להשתמש ב-GSI של Android 11 לבדיקות תאימות. השינויים העיקריים לעומת גרסאות GSI קודמות:

  • תוכן של system_ext. ‫Android 11 מגדיר מחיצה חדשה system_ext. ‫GSI מכניס את התוכן של תוסף המערכת לתיקייה system/system_ext.
  • APEXes. קובץ ה-GSI מכיל קובצי APEX שטוחים ודחוסים. המערכת קובעת באיזה מהם להשתמש לפי מאפיין המערכת ro.apex.updatable במחיצת הספק בזמן הריצה. פרטים נוספים זמינים במאמר בנושא הגדרת המערכת לתמיכה בעדכוני APEX.

שינויים ב-GSI ב-Android 10

מכשירים שמופעלת בהם מערכת Android 10 או שמערכת Android 10 מותקנת בהם, חייבים להשתמש ב-GSI של Android 10 לבדיקות תאימות. השינויים העיקריים לעומת גרסאות GSI קודמות:

  • משתמש build. ל-GSI יש גרסת build למשתמש מ-Android 10. ב-Android 10, אפשר להשתמש ב-GSI של גרסת משתמש בבדיקות תאימות של CTS-on-GSI/VTS. פרטים נוספים זמינים במאמר בנושא בדיקות VTS עם Debug Ramdisk.
  • פורמט לא דליל. ‫GSI עם יעדים aosp_$arch נוצרים בפורמט לא דליל. אפשר להשתמש ב-img2simg כדי להמיר GSI לא דליל לפורמט דליל, אם צריך.
  • System-as-root. הוצאנו משימוש את יעד הבנייה של GSI מדור קודם שנקרא aosp_$arch_a. למכשירים ששודרגו מ-Android 8 או 8.1 ל-Android 10 עם ramdisk ועם non-system-as-root, צריך להשתמש ב-GSI מדור קודם aosp_$arch_ab. השדרוג של init ב-ramdisk תומך ב-system.img של OEM עם פריסת מערכת כשורש.
  • אימות האתחול כדי להשתמש ב-GSI, צריך רק לבטל את נעילת המכשיר. אין צורך להשבית את ההפעלה המאומתת.

שינויים ב-GSI ב-Android 9

מכשירים שמופעלים עם Android 9 או מעודכנים ל-Android 9 חייבים להשתמש ב-GSI של Android 9 לבדיקות תאימות. השינויים העיקריים לעומת גרסאות GSI קודמות:

  • מיזוג של GSI ואמולטור. תמונות GSI נוצרות מתמונות המערכת של מוצרי אמולטור, לדוגמה, aosp_arm64 ו-aosp_x86.
  • System-as-root. בגרסאות קודמות של Android, מכשירים שלא תמכו בעדכוני A/B יכלו לטעון את תמונת המערכת בספרייה /system. ב-Android 9, השורש של תמונת המערכת מותקן כשם השורש של המכשיר.
  • ממשק binder ב-64 ביט. ב-Android 8.x, מערכות GSI של 32 ביט השתמשו בממשק Binder של 32 ביט. ‫Android 9 לא תומך בממשק Binder ב-32 ביט, ולכן גם GSI ב-32 ביט וגם GSI ב-64 ביט משתמשים בממשק Binder ב-64 ביט.
  • אכיפת VNDK. ב-Android 8.1, ‏ VNDK היה אופציונלי. החל מ-Android 9, ‏ VNDK הוא חובה, ולכן צריך להגדיר את BOARD_VNDK_VERSION .
  • מאפיין מערכת תואם. ‫Android 9 מאפשרת את בדיקת הגישה למאפיין מערכת תואם (PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE := true).

‫Android 9 שינויים ב-Keymaster

בגרסאות קודמות של Android, מכשירים שמטמיעים Keymaster בגרסה 3 ומטה נדרשו לאמת שפרטי הגרסה (ro.build.version.release ו-ro.build.version.security_patch) שדווחו על ידי המערכת הפועלת תואמים לפרטי הגרסה שדווחו על ידי תוכנת האתחול. מידע כזה נלקח בדרך כלל מכותרת תמונת האתחול.

ב-Android מגרסה 9 ואילך, הדרישה הזו השתנתה כדי לאפשר לספקים להפעיל GSI. באופן ספציפי, Keymaster לא צריך לבצע אימות כי פרטי הגרסה שמדווחים על ידי GSI עשויים לא להיות זהים לפרטי הגרסה שמדווחים על ידי טוען האתחול של הספק. במכשירים שמוטמעת בהם גרסה Keymaster 3 או גרסה נמוכה יותר, הספקים צריכים לשנות את ההטמעה של Keymaster כדי לדלג על האימות (או לשדרג לגרסה Keymaster 4). פרטים על Keymaster מופיעים במאמר בנושא Keystore עם גיבוי חומרה.

הורדת תמונות מערכת כלליות (GSI)

אפשר להוריד תמונות GSI מוכנות מראש מאתר השילוב הרציף (CI) של AOSP בכתובת ci.android.com. אם סוג ה-GSI של פלטפורמת החומרה שלכם לא זמין להורדה, אפשר לעיין בקטע הבא כדי לקבל פרטים על בניית תמונות GSI ליעדים ספציפיים.

יצירת תמונות מערכת כלליות (GSI)

החל מ-Android 9, לכל גרסת Android יש ענף GSI בשם DESSERT-gsi ב-AOSP (לדוגמה, android12-gsi הוא ענף ה-GSI ב-Android 12). ענפי GSI כוללים את התוכן של Android עם כל תיקוני האבטחה ותיקוני ה-GSI שהוחלו.

כדי ליצור GSI, צריך להגדיר את עץ המקור של Android על ידי הורדה מענף GSI ובחירת יעד build של GSI. כדי לקבוע את הגרסה הנכונה של GSI למכשיר שלכם, היעזרו בטבלאות שלמטה. אחרי שה-build מסתיים, ה-GSI הוא קובץ האימג' של המערכת (כלומר, system.img) והוא מופיע בתיקיית הפלט out/target/product/generic_arm64.

לדוגמה, כדי ליצור את יעד הבנייה של GSI‏ gsi_arm64-userdebug בענף GSI‏ android12-gsi, מריצים את הפקודות הבאות.

$ repo init -u https://android.googlesource.com/platform/manifest -b android12-gsi
$ repo sync -cq
$ source build/envsetup.sh
$ lunch gsi_arm64-userdebug
$ make -j4

יעדי build של GSI ב-Android

יעדי הבנייה הבאים של GSI מיועדים למכשירים עם Android מגרסה 9 ומעלה.

שם ה-GSI ארכיטקטורת המעבד הביטים של ממשק ה-Binder System-as-root יעד Build
gsi_arm דריכה 32 Y gsi_arm-user
gsi_arm-userdebug
gsi_arm64 ARM64 64 Y gsi_arm64-user
gsi_arm64-userdebug
gsi_x86 x86 32 Y gsi_x86-user
gsi_x86-userdebug
gsi_x86_64 x86-64 64 Y gsi_x86_64-user
gsi_x86_64-userdebug

דרישות להצגת תמונות מערכת כלליות (GSI)

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

  1. חשוב לוודא שבמכשיר יש את הדברים הבאים:
    • Treblized
    • שיטה לביטול הנעילה של מכשירים (כדי שאפשר יהיה להפעיל בהם Flash באמצעות fastboot)
    • מצב לא נעול כדי לאפשר צריבה באמצעות fastboot (כדי לוודא שיש לכם את הגרסה העדכנית ביותר של fastboot, צריך לבנות אותה מעץ המקור של Android).
  2. מוחקים את מחיצת המערכת הנוכחית, ואז מצמידים את ה-GSI למחיצת המערכת.
  3. למחוק את נתוני המשתמש ולנקות את הנתונים ממחיצות נדרשות אחרות (לדוגמה, נתוני משתמש ומחיצות מערכת).
  4. מפעילים מחדש את המכשיר.

לדוגמה, כדי לצרוב GSI לכל מכשיר Pixel:

  1. מבצעים אתחול לfastboot ומבטלים את הנעילה של תוכנת האתחול.
  2. המכשירים שתומכים ב-fastbootd צריכים גם לאתחל את fastbootd באמצעות:
    $ fastboot reboot fastboot
  3. מוחקים את ה-GSI ומעבירים אותו למחיצת המערכת:
    $ fastboot erase system
    $ fastboot flash system system.img
  4. אם המכשיר תומך ב-Android Virtual Framework, צריך לצרוב את קושחת המכונה הווירטואלית המוגנת:
    $ fastboot flash pvmfw pvmfw.img
    
  5. מחיקת נתוני המשתמש וניקוי הנתונים ממחיצות נדרשות אחרות (לדוגמה, נתוני משתמש ומחיצות מערכת):
    $ fastboot -w
  6. מפעילים מחדש את המכשיר בחזרה למצב Bootloader:
    $ fastboot reboot-bootloader
  7. משביתים את האימות של Verified Boot בזמן שמבצעים פלאשינג של קובץ ה-vbmeta שסופק:
    $ fastboot --disable-verification flash vbmeta vbmeta.img
  8. Reboot:
    $ fastboot reboot
במכשירים עם Android מגרסה 10 ומעלה שיש להם מחיצות מערכת קטנות יותר, יכול להיות שתופיע הודעת השגיאה הבאה כשמבצעים פלאשינג של GSI:
    Resizing 'system_a'    FAILED (remote: 'Not enough space to resize partition')
    fastboot: error: Command failed
כדי למחוק את מחיצת המוצר ולפנות מקום למחיצת המערכת, משתמשים בפקודה הבאה. כך מקבלים עוד מקום להעברת ה-GSI:
$ fastboot delete-logical-partition product_a
הסיומת _a צריכה להיות זהה למזהה המשבצת של מחיצת המערכת, כמו system_a בדוגמה הזו.

תרומה ל-GSI

אנחנו ב-Android מזמינים אתכם לתרום לפיתוח של GSI. אתם יכולים לעזור לנו לשפר את ה-GSI על ידי:

  • יצירת תיקון GSI.DESSERT-gsi לא מהווה ענף פיתוח, והיא מקבלת רק cherrypicks מתוך ענף הגרסה האחרונה של AOSP‏ (android16-qpr2-release). לכן, כדי לשלוח תיקון GSI, צריך:
    1. שולחים את התיקון לענף AOSP android16-qpr2-release.
    2. בוחרים את התיקון (patch) ל-DESSERT-gsi.
    3. כדי שהשינוי יבדק, צריך להגיש דוח על באג.
  • דיווח על באגים ב-GSI או שליחת הצעות אחרות. קוראים את ההוראות במאמר דיווח על באגים, ואז מעיינים בבאגים ב-GSI או מדווחים עליהם.

טיפים

שינוי המצב של סרגל הניווט באמצעות adb

כשמבצעים אתחול באמצעות GSI, מצב סרגל הניווט מוגדר על ידי ספק שמבטל את ההגדרה. אפשר לשנות את המצב של סרגל הניווט על ידי הפעלת פקודת ה-adb הבאה בזמן הריצה.

adb exec-out cmd overlay enable-exclusive com.android.internal.systemui.navbar.mode

הערך של mode יכול להיות threebutton, twobutton, gestural וכן הלאה.