קובץ אימג' מערכת גנרי (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 הנוכחי יש את התצורה הבאה:
- טרבל GSI כולל תמיכה מלאה בשינויים הארכיטקטוניים מבוססי-AIDL/HIDL (שנקראים גם Treble), כולל תמיכה בממשקי AIDL ובממשקי HIDL. אפשר להשתמש ב-GSI בכל מכשיר Android שמשתמש בממשקי ספקים של AIDL/HIDL. (פרטים נוספים זמינים במאמר משאבי ארכיטקטורה).
- מערכת קבצים. מערכת ה-GSI משתמשת במערכת הקבצים ext4.
הגרסה הנוכחית של 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
מ-GSIsystem.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 כדי לקבל הוראות מפורטות להצגת הפלאש. השלבים הבאים יכולים לשמש כמדריך כללי:
- מוודאים שהמכשיר כולל את הדברים הבאים:
- טרבליזציה
- שיטה לביטול הנעילה של מכשירים (כדי שאפשר יהיה להריץ בהם את
fastboot
) - במצב פתוח כדי שאפשר יהיה לבצע בו איפוס באמצעות
fastboot
(כדי לוודא שיש לכם את הגרסה האחרונה שלfastboot
, צריך לבנות אותה מתוך עץ המקור של Android).
- מוחקים את מחיצת המערכת הנוכחית ומעבירים את ה-GSI למחיצה של המערכת באמצעות הפלאש.
- מחיקה של נתוני המשתמש וניקוי הנתונים במחיצות נחוצות אחרות (לדוגמה, נתוני משתמשים ומחיצות מערכת).
- מפעילים מחדש את המכשיר.
לדוגמה, כדי להריץ אימג' GSI בכל מכשיר Pixel:
- מפעילים את המכשיר במצב
fastboot
ומבטלים את הנעילה של תוכנת האתחול. - במכשירים שתומכים ב-
fastbootd
צריך גם להפעיל אתfastbootd
באופן הבא:$ fastboot reboot fastboot
- מוחקים את ה-GSI ומעבירים אותו למחיצה של המערכת באמצעות הפלאש:
$ fastboot erase system $ fastboot flash system system.img
- מוחקים את נתוני המשתמש ומנקים את הנתונים מהמחיצות הנחוצות האחרות (למשל, נתוני משתמשים ומחיצות מערכת):
$ fastboot -w
- מפעילים מחדש את המכשיר לתוכנת האתחול:
$ fastboot reboot-bootloader
- משביתים את האימות של Verified Boot בזמן ה-flash של קובץ ה-vbmeta שסופק:
$ fastboot --disable-verification flash vbmeta vbmeta.img
- Reboot:
$ fastboot reboot
Resizing 'system_a' FAILED (remote: 'Not enough space to resize partition') fastboot: error: Command failed
$ fastboot delete-logical-partition product_a
_a
צריכה להתאים למזהה החריץ של מחיצה המערכת,
למשל system_a
בדוגמה הזו.
תרומה ל-GSIs
אנחנו ב-Android מקבלים בברכה את התרומות שלכם לפיתוח GSI. אתם יכולים להצטרף ולעזור בשיפור GSI:
- יצירת תיקון ל-GSI ההסתעפות
DESSERT-gsi
לא נחשבת להסתעפות פיתוח, והיא מקבלת רק 'בחירת פריטי קוד' מההסתעפות הראשית של AOSP. לכן, כדי לשלוח תיקון GSI, צריך:- שולחים את התיקון להסתעפות
main
ב-AOSP. - בוחרים את התיקון הרצוי ומעבירים אותו אל
DESSERT-gsi
. - שולחים דוח באג כדי לבדוק את ה-cherrypick.
- שולחים את התיקון להסתעפות
- דיווח על באגים ב-GSI או שליחת הצעות אחרות. קוראים את ההוראות במאמר דיווח על באגים, ומעיינים בבאגים ב-GSI או שולחים באגים חדשים.
טיפים
שינוי המצב של סרגל הניווט באמצעות adb
כשמפעילים את המכשיר באמצעות GSI, מצב סרגל הניווט מוגדר על ידי שינוי מברירת המחדל של הספק. כדי לשנות את המצב של סרגל הניווט, מריצים את הפקודה הבאה של adb בסביבת זמן הריצה.
adb exec-out cmd overlay enable-exclusive com.android.internal.systemui.navbar.mode
כאשר mode יכול להיות threebutton
, twobutton
, gestural
וכו'.