อิมเมจระบบทั่วไป (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 ปัจจุบันมีการกำหนดค่าดังนี้
- Treble GSI รองรับการเปลี่ยนแปลงทางสถาปัตยกรรมที่อิงตาม AIDL/HIDL (หรือที่เรียกว่า Treble) อย่างเต็มรูปแบบ รวมถึงรองรับ อินเทอร์เฟซ AIDL และ อินเทอร์เฟซ HIDL คุณใช้ GSI ได้ใน อุปกรณ์ Android ใดก็ได้ที่ใช้อินเทอร์เฟซผู้ให้บริการ AIDL/HIDL (ดูรายละเอียดเพิ่มเติมได้ที่แหล่งข้อมูลด้านสถาปัตยกรรม)
- ระบบไฟล์ GSI ใช้ระบบไฟล์ ext4
GSI ของ Android ปัจจุบันมีความแตกต่างที่สำคัญดังต่อไปนี้
- สถาปัตยกรรม CPU รองรับคำสั่ง CPU ที่แตกต่างกัน (ARM, x86 ฯลฯ) และบิตของ CPU (32 บิตหรือ 64 บิต)
เป้าหมาย GSI สำหรับการทดสอบการปฏิบัติตามข้อกำหนดของ Treble
GSI ที่ใช้สำหรับการทดสอบการปฏิบัติตามข้อกำหนดจะกำหนดโดยเวอร์ชัน Android ที่ อุปกรณ์เปิดตัว
ประเภทอุปกรณ์ | สร้างเป้าหมาย |
---|---|
อุปกรณ์ที่เปิดตัวพร้อม 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 ที่ ไม่ได้ใช้ Treble อย่างเต็มรูปแบบออก
- SEPolicy ของ Userdebug 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 ต้องใช้ 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 ต้องใช้ GSI ของ Android 10 ในการทดสอบการปฏิบัติตามข้อกำหนด ซึ่งรวมถึงการเปลี่ยนแปลงที่สำคัญต่อไปนี้จาก GSI เวอร์ชันก่อนหน้า
- การสร้างผู้ใช้ GSI มีบิลด์ของผู้ใช้จาก 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 และ ไม่ใช่ระบบเป็นรูท ให้ใช้ GSI เดิมaosp_$arch_ab
init
ที่อัปเกรดแล้วใน ramdisk รองรับ OEM system.img ที่มีเลย์เอาต์ system-as-root - การเปิดเครื่องที่ได้รับการยืนยัน การใช้ GSI คุณเพียงแค่ต้องปลดล็อกอุปกรณ์ คุณไม่จำเป็นต้องปิดใช้การเปิดเครื่องที่ได้รับการยืนยัน
การเปลี่ยนแปลง GSI ของ 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
)
การเปลี่ยนแปลง Keymaster ใน Android 9
ใน Android เวอร์ชันก่อนหน้า อุปกรณ์ที่ใช้ Keymaster 3 หรือต่ำกว่า
ต้องยืนยันว่าข้อมูลเวอร์ชัน
(ro.build.version.release
และ
ro.build.version.security_patch
) ที่รายงานโดยระบบที่ทำงานอยู่
ตรงกับข้อมูลเวอร์ชันที่รายงานโดย Bootloader โดยปกติแล้ว ข้อมูลดังกล่าวจะมาจากส่วนหัวของอิมเมจการบูต
ใน Android 9 ขึ้นไป ข้อกำหนดนี้มีการเปลี่ยนแปลงเพื่อให้ผู้ให้บริการสามารถบูต GSI ได้ กล่าวคือ Keymaster ไม่ควรทำการยืนยัน เนื่องจากข้อมูลเวอร์ชันที่ GSI รายงานอาจไม่ตรงกับข้อมูลเวอร์ชัน ที่ Bootloader ของผู้ให้บริการรายงาน สำหรับอุปกรณ์ที่ใช้ 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 และ
เลือกเป้าหมาย
การสร้าง GSI ใช้ตารางเป้าหมายการสร้างด้านล่างเพื่อพิจารณาเวอร์ชัน GSI
ที่ถูกต้องสำหรับอุปกรณ์ หลังจากที่บิลด์เสร็จสมบูรณ์แล้ว 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
เป้าหมายบิลด์ GSI ของ Android
เป้าหมายการสร้าง GSI ต่อไปนี้มีไว้สำหรับอุปกรณ์ที่เปิดตัวใน Android 9 ขึ้นไป
ชื่อ GSI | สถาปัตยกรรม CPU | จำนวนบิตของอินเทอร์เฟซ Binder | System-as-root | สร้างเป้าหมาย |
---|---|---|---|---|
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 เพื่อขอวิธีการแฟลชที่ชัดเจน ใช้ขั้นตอนต่อไปนี้เป็นหลักเกณฑ์ทั่วไป
- ตรวจสอบว่าอุปกรณ์มีคุณสมบัติต่อไปนี้
- Treblized
- วิธีการปลดล็อกอุปกรณ์ (เพื่อให้แฟลชได้โดยใช้
fastboot
) - สถานะที่ปลดล็อกเพื่อให้แฟลชได้ผ่าน
fastboot
(หากต้องการให้แน่ใจว่าคุณมีfastboot
เวอร์ชันล่าสุด ให้สร้าง จากโครงสร้างแหล่งที่มาของ Android)
- ลบพาร์ติชันระบบปัจจุบัน แล้วแฟลช GSI ไปยังพาร์ติชันระบบ
- ล้างข้อมูลผู้ใช้และล้างข้อมูลจากพาร์ติชันอื่นๆ ที่จำเป็น (เช่น ข้อมูลผู้ใช้และพาร์ติชันระบบ)
- รีบูตอุปกรณ์
เช่น หากต้องการแฟลช GSI ไปยังอุปกรณ์ Pixel ใดก็ได้ ให้ทำดังนี้
- บูตเข้าสู่
โหมด
fastboot
และ ปลดล็อก Bootloader - อุปกรณ์ที่รองรับ
fastbootd
จะต้องบูตเข้าสู่fastbootd
ด้วย โดยทำดังนี้$ fastboot reboot fastboot
- ลบและแฟลช GSI ไปยังพาร์ติชันระบบ
$ fastboot erase system $ fastboot flash system system.img
- หากอุปกรณ์รองรับ Android Virtual Framework ให้แฟลชเฟิร์มแวร์เครื่องเสมือนที่ได้รับการปกป้องโดยทำดังนี้
$ fastboot flash pvmfw pvmfw.img
- ล้างข้อมูลผู้ใช้และล้างข้อมูลจากพาร์ติชันอื่นๆ ที่จำเป็น (เช่น ข้อมูลผู้ใช้และพาร์ติชันระบบ) โดยทำดังนี้
$ fastboot -w
- รีบูตกลับไปที่ Bootloader
$ fastboot reboot-bootloader
- ปิดใช้การยืนยันการเปิดเครื่องที่ได้รับการยืนยันขณะแฟลช 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
ในตัวอย่างนี้
ร่วมให้ข้อมูลกับ GSI
Android ยินดีรับการมีส่วนร่วมของคุณในการพัฒนา GSI คุณสามารถมีส่วนร่วม และช่วยปรับปรุง GSI ได้โดยทำดังนี้
- การสร้างแพตช์ GSI
DESSERT-gsi
ไม่ใช่สาขาการพัฒนาและยอมรับเฉพาะการเลือกเชอร์รี่จาก สาขาการเผยแพร่ล่าสุดของ AOSP (android16-release
) ดังนั้นหากต้องการส่งแพตช์ GSI คุณต้องทำดังนี้- ส่งแพตช์ไปยังสาขา
AOSP
android16-release
- Cherrypick the patch to
DESSERT-gsi
. - รายงานข้อบกพร่องเพื่อให้มีการตรวจสอบการเลือกเชอร์รี
- ส่งแพตช์ไปยังสาขา
AOSP
- รายงานข้อบกพร่องของ GSI หรือให้คำแนะนำอื่นๆ อ่าน วิธีการใน การรายงานข้อบกพร่อง จากนั้น เรียกดูหรือส่ง ข้อบกพร่องของ GSI
เคล็ดลับ
เปลี่ยนโหมดแถบนำทางโดยใช้ adb
เมื่อบูตด้วย GSI ผู้ให้บริการจะกำหนดค่าโหมดแถบนำทางโดยการลบล้าง คุณ เปลี่ยนโหมดแถบนำทางได้โดยเรียกใช้คำสั่ง adb ต่อไปนี้ในรันไทม์
adb exec-out cmd overlay enable-exclusive com.android.internal.systemui.navbar.mode
โดย mode อาจเป็น threebutton
, twobutton
,
gestural
และอื่นๆ