在 Android 10 以上版本中,用於執行 CTS-on-GSI/VTS 相容性測試的通用系統映像檔 (GSI) 已從 userdebug 變更為使用者建構類型,以便發布簽署。這會導致 VTS 測試發生問題,因為 VTS 需要執行 adb root,但使用者建構裝置上沒有 adb root。
導入偵錯 ramdisk (或偵錯開機映像檔),可在已解鎖系統啟動載入程式的使用者建構裝置上啟用 adb root。這樣一來,CTS-on-GSI 和 VTS-on-GSI 都能使用相同的 GSI 使用者建構版本 system.img,簡化測試流程。如要設定 STS,仍須使用其他 userdebug OEM system.img。
下表顯示 Android 10 中,用於相容性測試的映像檔和建構類型變更。
| 測試套件 | 測試 | 建構 | 偵錯 ramdisk | adb root? | Android 9 -> 10 建構變數變更 |
|---|---|---|---|---|---|
| CTS | 原始設備製造商 (OEM) 的系統 | 使用者 | 否 | 否 | 沒有變化 |
| CTS-on-GSI | GSI | 使用者 | 否 | 否 | userdebug -> user GSI 已簽署讓渡書 |
| STS | 原始設備製造商 (OEM) 的系統 | userdebug | 否 | 是 | 全新功能,就在 Q |
| VTS | GSI | 使用者 | 是 | 是 | userdebug -> user GSI 已簽署讓渡書 |
總覽
這些額外的圖片檔案會產生在建構資料夾 (${ANDROID_PRODUCT_OUT}) 下:
boot-debug.imgvendor_boot-debug.img
將 boot-debug.img 刷入裝置的 boot 分區時,系統會載入系統 sepolicy 檔案的 userdebug 版本,以及額外的屬性檔案 adb_debug.prop。這可讓使用者透過 adb root system.img (GSI 或 OEM) 建立。
如要使用具有 vendor_boot 分區的裝置,請勿刷入 boot-debug.img,因為 boot 分區必須刷入通過認證的通用核心映像檔 (GKI)。請改為將 vendor_boot-debug.img 刷入 vendor_boot 分割區,方便偵錯 ramdisk。
使用偵錯 RAM 磁碟的先決條件
執行相容性測試的原始設備製造商 (OEM) 會提供偵錯 RAM 磁碟。且不得以發布簽章簽署,只能在裝置解鎖時使用。
系統不會產生或使用偵錯 RAM 磁碟,升級具有下列特性的裝置:
BOARD_BUILD_SYSTEM_ROOT_IMAGEtrueskip_initramfs核心指令列
Android 12 GSI
使用 Android 12 GSI 偵錯 RAM 磁碟時,不需要其他指示。
自 2021 年 9 月 29 日起,偵錯 ramdisk 不再需要使用 repack_bootimg 工具更新。Android 12 GSI
建構版本會在 SGR1.210929.001 (7777720) 後納入最新的
userdebug_plat_sepolicy.cil 檔案,並忽略偵錯 RAM 磁碟中的
userdebug_plat_sepolicy.cil。system.img詳情請參閱 CL。
Android 11 GSI
使用 boot-debug.img 或 vendor_boot-debug.img 時,系統會從 boot-debug.img 或 vendor_boot-debug.img 的偵錯 ramdisk 中載入 userdebug_plat_sepolicy.cil 檔案。如要啟動 GSI 映像檔,請務必納入 android11-gsi 分支的最新 sepolicy 變更,重新建構 boot-debug.img 或 vendor_boot-debug.img。
或者,您也可以使用 repack_bootimg 工具重建 boot-debug.img 或 vendor_boot-debug.img,並更新 GSI sepolicy。
重新封裝偵錯 ramdisk
合作夥伴不必納入 sepolicy 變更來重建 boot-debug.img,而是可以使用 repack_bootimg 將 GSI sepolicy 檔案更新至 boot-debug.img (如果裝置使用 GKI,則為 vendor_boot-debug.img)。
步驟如下:
從 https://ci.android.com 下載
otatools.zip。建議從aosp_cf_arm64_only_phone-userdebug的建構構件下載aosp-android-latest-release分支版本。設定
repack_bootimg的執行環境:unzip otatools.zip -d otatoolsexport PATH="${PWD}/otatools/bin:${PATH}"repack_bootimg --help從您使用的 GSI 建構版本下載
userdebug_plat_sepolicy.cil或boot-with-debug-ramdisk-${KERNEL_VERSION}.img。舉例來說,如果您使用RJR1.211020.001 (7840830)的 arm64 GSI,請從 https://ci.android.com/builds/submitted/7840830/aosp_arm64-user/latest 下載。使用
userdebug_plat_sepolicy.cil更新裝置boot-debug.img或vendor_boot-debug.img:repack_bootimg --local --dst_bootimg boot-debug.img \ --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \ --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil# If using GKIrepack_bootimg --local --dst_bootimg vendor_boot-debug.img \ --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \ --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil使用
boot-with-debug-ramdisk-${KERNEL_VERSION}.img:repack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \ --dst_bootimg boot-debug.img \ --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \ --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil# If using GKIrepack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \ --dst_bootimg vendor_boot-debug.img \ --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \ --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil您可以根據裝置設定調整
--ramdisk_add的引數。詳情請參閱下一節。
userdebug sepolicy 的路徑
上述 repack_bootimg 會將檔案 userdebug_plat_sepolicy.cil 從 --src_bootimg 的 RAM 磁碟複製到 --dst_bootimg 的 RAM 磁碟。不過,不同 Android 版本中,偵錯 RAM 磁碟內的路徑可能不同。在 Android 10 和 11 中,如果裝置的核心指令列有 androidboot.force_normal_boot=1,路徑就是 first_stage_ramdisk/userdebug_plat_sepolicy.cil。否則路徑為 userdebug_plat_sepolicy.cil。
執行下列指令,檢查核心指令列中是否有 androidboot.force_normal_boot:
adb rootadb shell cat /proc/cmdline | grep force_normal_boot
在 Android 12 以上版本中,無論核心指令列中是否有 androidboot.force_normal_boot=1,偵錯 RAM 磁碟中的路徑一律為 userdebug_plat_sepolicy.cil。下表顯示不同 Android 版本中,偵錯 RAM 磁碟內的路徑。
| 偵錯圖片 | Android 10 | Android 11 | Android 12 |
|---|---|---|---|
| GKI boot-with-debug-ramdisk-${KERNEL_VERSION}.img | 無 | first_stage_ramdisk/userdebug_plat_sepolicy.cil |
userdebug_plat_sepolicy.cil |
| 裝置專屬 boot-debug.img | 取決於 force_normal_boot | 取決於 force_normal_boot | userdebug_plat_sepolicy.cil |
| 裝置專屬 vendor_boot-debug.img | 無 | 取決於 force_normal_boot | userdebug_plat_sepolicy.cil |
您可以指定 --ramdisk_add,透過 src_path:dst_path 配對清單,將檔案從不同路徑複製到其他路徑。舉例來說,下列指令會將 Android 11 boot-with-debug-ramdisk-5.4.img 中的檔案 first_stage_ramdisk/userdebug_plat_sepolicy.cil 複製到 Android 11 vendor_boot-debug.img 中的 first_stage_ramdisk/userdebug_plat_sepolicy.cil。
repack_bootimg \
--src_bootimg boot-with-debug-ramdisk-5.4.img \
--dst_bootimg vendor_boot-debug.img \
--ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil如果核心指令列中沒有 androidboot.force_normal_boot=1,則應按照下列方式調整指令,將目的地路徑變更為 userdebug_plat_sepolicy.cil。
repack_bootimg \
--src_bootimg boot-with-debug-ramdisk-5.4.img \
--dst_bootimg vendor_boot-debug.img \
--ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil新增 AVB 頁尾
如果傳遞至 --dst_bootimg 的映像檔設定為 AVB 鏈結分割區,則執行 repack_bootimg 指令後,必須加入 AVB 頁尾。
舉例來說,在執行 repack_bootimg 之前,請先執行下列指令,檢查 vendor_boot-debug.img 是否有已連結的 AVB 頁尾。
avbtool info_image --image vendor_boot-debug.img如果原始映像檔有鏈結的 AVB 頁尾,則必須在執行 repack_bootimg 指令後新增 AVB 頁尾。使用任何測試金鑰簽署 vendor_boot-debug.img 都可以,因為只有在裝置解鎖時才能使用偵錯 RAM 磁碟,這允許在 boot 或 vendor_boot 分割區上使用非發布金鑰簽署的映像檔。
avbtool add_hash_footer --partition_name vendor_boot \
--partition_size 100663296 \
--algorithm SHA256_RSA4096 \
--key otatools/external/avb/test/data/testkey_rsa4096.pem \
--image vendor_boot-debug.img