通用系統映像

通用系統映像 (GSI) 是針對 Android 設備調整了配置的系統映像。它被認為是一個純粹的Android實現與未改性的Android開源項目(AOSP)的代碼,任何運行Android 9或更高版本的Android設備可以成功運行。

GSI 用於運行 VTS 和 CTS-on-GSI 測試。 Android設備的系統的圖像替換為GSI然後與測試賣方測試套件(VTS)兼容性測試套件(CTS)以確保該設備實現廠商與Android的最新版本正確地接口。

要開始使用GSIS,請查看以下部分細節GSI配置(並允許方差)和類型。當你準備使用GSI,下載並構建GSI為您的設備的目標,然後閃GSI Android設備。

GSI 配置和差異

目前Android GSI有如下配置:

當前的 Android GSI 包括以下主要差異:

  • CPU架構。支持不同的 CPU 指令(ARM、x86 等)和 CPU 位數(32 位或 64 位)。

Treble 合規性測試的 GSI 目標

用於合規性測試的 GSI 由設備啟動時使用的 Android 版本決定。

設備類型構建目標
搭載 Android 12 的設備gsi_$arch-user (簽名)
搭載 Android 11 的設備gsi_$arch-user (簽名)
搭載 Android 10 的設備gsi_$arch-user (簽名)
搭載 Android 9 的設備gsi_$arch-userdebug

所有GSIS從Android的代碼庫12內置,每個CPU架構都有相應的GSI二進制(見的構建目標列表中的大樓GSIS )。

Android 12 GSI 更改

搭載 Android 12 或更新至 Android 12 的設備必須使用 Android 12 GSI 進行合規性測試。這包括與早期 GSI 的以下主要變化:

  • 目標名稱。用於一致性測試的GSI目標名稱更改為gsi_$arch 。與目標名稱的GSI aosp_$arch保持了Android應用開發者。測試計劃CTS-on-GSI也降低用於測試供應商接口。
  • 舊版 GSI 已被淘汰。 GSI 12 刪除了適用於未完全 Treblized 的 Android 8.0 或 8.1 設備的變通方法。
  • 用戶調試 SEPolicy。該GSI gsi_$arch包含userdebug_plat_sepolicy.cil 。當閃爍的OEM特定vendor_boot-debug.imgboot-debug.img/system/bin/init將加載userdebug_plat_sepolicy.cil從GSI system.img 。參考VTS測試與調試內存虛擬硬盤的詳細信息。

Android 11 GSI 更改

搭載 Android 11 或更新至 Android 11 的設備必須使用 Android 11 GSI 進行合規性測試。這包括與早期 GSI 的以下主要變化:

  • system_ext 內容。機器人11定義了一個新的分區system_ext 。 GSI將系統擴展內容的文件夾下的system/system_ext
  • 頂點。 GSI 包含扁平化和壓縮的 APEX。使用哪一個是由系統屬性決定ro.apex.updatable在運行時的供應商分區。參考配置系統支持APEX更新的詳細信息。

Android 10 GSI 更改

搭載 Android 10 或更新至 Android 10 的設備必須使用 Android 10 GSI 進行合規性測試。這包括與早期 GSI 的以下主要變化:

  • 用戶構建。 GSI 具有來自 Android 10 的用戶構建。在 Android 10 中,用戶構建 GSI 可用於 CTS-on-GSI/VTS 合規性測試。參考VTS測試與調試Ramdisk的詳細信息。
  • 非稀疏格式。 GSI與目標aosp_$arch與unsparsed格式建造。您可以使用img2simg如果必要的unsparsed GSI轉換為稀疏格式。
  • 系統作為 root。命名遺留GSI構建目標aosp_$arch_a已被淘汰。對於來自8的Android或8.1升級到Android 10與虛擬盤和非系統作為根的裝置中,使用傳統的GSI aosp_$arch_ab 。已升級的init在虛擬盤支持OEM system.img與系統作為根佈局。
  • 驗證啟動。使用 GSI,您只需要解鎖設備。沒有必要禁用驗證啟動。

Android 9 GSI 更改

搭載 Android 9 或更新至 Android 9 的設備必須使用 Android 9 GSI 進行合規性測試。這包括與早期 GSI 的以下主要變化:

  • 合併 GSI 和模擬器。 GSIS是從仿真器產品的系統映像,例如,建aosp_arm64aosp_x86
  • 系統作為 root。在Android中,設備的早期版本是不支持A / B更新可以安裝在系統映像/system目錄下。在 Android 9 中,系統映像的根目錄被掛載為設備的根目錄。
  • 64 位活頁夾接口。在 Android 8.x 中,32 位 GSI 使用 32 位綁定器接口。 Android 9 不支持 32 位綁定器接口,因此 32 位 GSI 和 64 位 GSI 都使用 64 位綁定器接口。
  • VNDK 強制執行。在 Android 8.1 中,VNDK 是可選的。從Android的9起,VNDK是強制性的,所以BOARD_VNDK_VERSION必須設置。
  • 兼容的系統屬性。機器人9使得用於兼容的系統屬性的訪問檢查( PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE := true )。

Android 9 Keymaster 更改

在早期版本的Android,實施鑰匙大師3或以下被需要的設備,以驗證該版本信息( ro.build.version.releasero.build.version.security_patch )報告相匹配的運行系統的版本信息報告的引導程序。此類信息通常是從引導映像標頭中獲得的。

在 Android 9 及更高版本中,此要求已更改以允許供應商啟動 GSI。具體來說,Keymaster 不應執行驗證,因為 GSI 報告的版本信息可能與供應商引導加載程序報告的版本信息不匹配。對於實現 Keymaster 3 或更低版本的設備,供應商必須修改 Keymaster 實現以跳過驗證(或升級到 Keymaster 4)。有關鑰匙大師的詳細信息,請參閱硬件支持的密鑰庫

下載 GSI

您可以在AOSP持續集成(CI)的網站上下載預建的GSIS ci.android.com 。如果您的硬件平台的 GSI 類型無法下載,請參閱以下部分以了解有關為特定目標構建 GSI 的詳細信息。

建立 GSI

與Android 9開始,每個Android版本具有GSI分支命名DESSERT -gsi上AOSP(例如, android12-gsi是在Android 12的GSI分支)。 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

Android GSI 構建目標

以下 GSI 構建目標適用於搭載 Android 9 或更高版本的設備。

GSI 名稱CPU架構Binder 接口位數系統作為 root構建目標
gsi_arm手臂64gsi_arm-user
gsi_arm-userdebug
gsi_arm64 ARM64 64gsi_arm64-user
gsi_arm64-userdebug
gsi_x86 x86 64gsi_x86-user
gsi_x86-userdebug
gsi_x86_64 x86-64 64gsi_x86_64-user
gsi_x86_64-userdebug

刷寫 GSI 的要求

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
在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應系統分區,的槽ID相符如system_a在這個例子。

為 GSI 做貢獻

Android 歡迎您為 GSI 開發做出貢獻。您可以通過以下方式參與並幫助改進 GSI:

  • 創建 GSI 補丁。 DESSERT -gsi不是一個發展分支並接受來自AOSP主分支僅cherrypicks,所以提交GSI補丁,你必須:
    1. 提交補丁的AOSP master分支。
    2. Cherrypick補丁到DESSERT -gsi
    3. 提交錯誤以審查cherrypick。
  • GSI報告錯誤或作出其他建議。查看說明在報告錯誤,然後瀏覽或文件GSI錯誤

提示

使用 adb 更改導航欄模式

使用 GSI 引導時,導航欄模式由供應商覆蓋配置。您可以通過在運行時運行以下 adb 命令來更改導航欄模式。

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

mode可以threebuttontwobuttongestural等。