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

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

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

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

הגדרה של GSI וסטיות

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

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

  • ארכיטקטורת המעבד (CPU). תמיכה בהוראות שונות של מעבדים (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, לכל ארכיטקטורת מעבד יש קובץ GSI בינארי תואם (ראו את רשימת יעדי ה-build בקטע יצירת GSI).

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

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

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

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

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

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

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

במכשירים שיושקו עם Android 10 או יעודכנו ל-Android 10, צריך להשתמש ב-GSIs של Android 10 לבדיקה של תאימות. השינויים העיקריים לעומת GSIs קודמים:

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

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

במכשירים שהושקעו עם Android 9 או עודכנו ל-Android 9, צריך להשתמש ב-GSIs של Android 9 לצורך בדיקת תאימות. השינויים העיקריים לעומת GSIs קודמים:

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

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

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

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

הורדת GSIs

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

פיתוח של GSIs

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

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

לדוגמה, כדי ליצור את היעד של build ב-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 של Android GSI

יעדי ה-build הבאים של GSI מיועדים למכשירים שפועלים ב-Android מגרסה 9 ואילך.

שם ה-GSI ארכיטקטורת המעבד (CPU) גודל הבייט של ממשק ה-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

הדרישות להצגת GSIs

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

  1. מוודאים שהמכשיר כולל את הדברים הבאים:
    • טרבליזציה
    • שיטה לביטול הנעילה של מכשירים (כדי שאפשר יהיה להריץ בהם את 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. מוחקים את נתוני המשתמש ומנקים את הנתונים מהמחיצות הנחוצות האחרות (למשל, נתוני משתמשים ומחיצות מערכת):
    $ fastboot -w
  5. מפעילים מחדש את המכשיר לתוכנת האתחול:
    $ fastboot reboot-bootloader
  6. משביתים את האימות של Verified Boot בזמן ה-flash של קובץ ה-vbmeta שסופק:
    $ fastboot --disable-verification flash vbmeta vbmeta.img
  7. Reboot:
    $ fastboot reboot
במכשירים עם Android מגרסה 10 ואילך שיש להם מחיצות מערכת קטנות יותר, יכול להיות שתופיע הודעת השגיאה הבאה במהלך ה-flash של ה-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 בדוגמה הזו.

תרומה ל-GSIs

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

  • יצירת תיקון ל-GSI ההסתעפות DESSERT-gsi לא נחשבת להסתעפות פיתוח, והיא מקבלת רק 'בחירת פריטי קוד' מההסתעפות הראשית של AOSP. לכן, כדי לשלוח תיקון GSI, צריך:
    1. שולחים את התיקון להסתעפות main ב-AOSP.
    2. בוחרים את התיקון הרצוי ומעבירים אותו אל DESSERT-gsi.
    3. שולחים דוח באג כדי לבדוק את ה-cherrypick.
  • דיווח על באגים ב-GSI או שליחת הצעות אחרות. קוראים את ההוראות במאמר דיווח על באגים, ומעיינים בבאגים ב-GSI או שולחים באגים חדשים.

טיפים

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

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

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

כאשר mode יכול להיות threebutton,‏ twobutton,‏ gestural וכו'.