目標:在不解鎖 bootloader 的情況下,透過 DSU 在 Xperia 1 II 上體驗最新 Android 系統
結論:失敗 — Sony 的 Verified Boot 在鎖定的 bootloader 下無法啟動未簽名的 GSI
免責聲明 #
- 本文內容僅為個人測試經驗分享,不保證適用於所有 Xperia 型號或 Android 版本。
- 嘗試 DSU 可能會導致資料遺失或裝置無法開機,請務必做好備份並自行承擔風險。
環境資訊 #
| 項目 | 內容 |
|---|---|
| 手機型號 | Sony Xperia 1 II (XQ-AT) |
| Android 版本 | Android 12 |
| 版本號碼 | 58.2.A.7.93 |
| Bootloader | 已鎖定(flash.locked = 1) |
| 內部儲存 | 223GB,實際可用約 98GB (要記得給 > 40% 儲存空間) |
第一步:了解 DSU #
根據 Android 官方文件,DSU 是 Android 10 引入的功能,可以做到:
- 下載新的 GSI 安裝到獨立分區
- 以訪客 OS 形式啟動 GSI
- 重啟後可回到原本系統,不破壞現有環境
官方安裝命令:
adb push system_raw.gz /storage/emulated/0/Download/
adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system_raw.gz \
--el KEY_SYSTEM_SIZE $(du -b system_raw.img|cut -f1) \
--el KEY_USERDATA_SIZE 8589934592首先,想要對手機作任何的改造,基本上都要先從「開發人員選項」開始。DSU 也不例外,官方文件裡面有提到兩種方式可以啟動 DSU 安裝流程:
- 開發人員選項的 DSU Loader UI:在「設定 → 開發人員選項 → DSU Loader」裡面選擇 GSI 並接受條款後,系統會啟動安裝流程。
- ADB 命令列方式:直接用 ADB 呼叫 DSU Activity,傳入 GSI 路徑和大小等參數。
在手機嘗試第一種方式後,發現 DSU Loader UI 按完同意後就會閃退,無法正常啟動。這是 Xperia 設備上的已知問題,詳見 Sony Bug Tracker Issue #787。
GSI 版本選擇原則:選比你目前系統高一個版本的 GSI,例如 Android 12 → 下載 Android 13 GSI。
踩坑過程 #
❌ 錯誤 1:ADB 找不到裝置 #
錯誤訊息:
adb: error: failed to get feature set: no devices/emulators found原因:USB 偵錯未啟用或裝置未被識別。
解決方式:
- 設定 → 關於手機 → 連點「版本號碼」7 次開啟「開發人員選項」
- 開發人員選項 → 啟用「USB 偵錯」
- 手機上點擊「允許」USB 偵錯授權
- 執行
adb devices確認裝置已連接
❌ 錯誤 2:du -b 不支援(macOS)
#
錯誤訊息:
du: invalid option -- b
usage: du [-Aclnx] [-H | -L | -P] ...原因:官方文件的 du -b 指令是 Linux 語法,macOS 的 du 不支援 -b 參數,導致 KEY_SYSTEM_SIZE 變數為空,後續命令解析失敗。
解決方式(macOS):
SIZE=$(stat -f%z system_raw.img)解決方式(Linux):
SIZE=$(stat -c%s system_raw.img)解決方式(Windows PowerShell):
$SIZE = (Get-Item system_raw.img).Length❌ 錯誤 3:NumberFormatException
#
錯誤訊息:
java.lang.NumberFormatException: For input string: "--el"原因:SIZE 變數為空,導致 ADB 把 --el 當成數字解析。本質上是錯誤 2 的連鎖反應。
解決方式:確保先取得 SIZE 變數有值後再執行命令,並用引號包住:
--el KEY_SYSTEM_SIZE "$SIZE"❌ 錯誤 4:RuntimeException
#
錯誤訊息:
AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.development.DSUTermsOfServiceActivity}: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.dynsystem/com.android.dynsystem.VerificationActivity}; have you declared this activity in your AndroidManifest.xml?
05-15 12:13:14.757 7721 7721 E AndroidRuntime: at com.android.settings.development.DSUTermsOfServiceActivity.installDSU(DSUTermsOfServiceActivity.java:35)
05-15 12:13:14.757 7721 7721 E AndroidRuntime: at com.android.settings.development.DSUTermsOfServiceActivity.onCreate(DSUTermsOfServiceActivity.java:50)原因:com.android.dynsystem 這個應用程式沒有安裝或未啟用
解決方式:
-
檢查 dynsystem 應用狀態
adb shell pm list packages | grep dynsystem -
啟用動態系統功能標誌
adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1 -
檢查 dynsystem 是否被禁用
adb shell pm list packages -d | grep dynsystem -
嘗試重新啟動 DSU
SIZE=$(stat -c%s system_raw.img) adb shell am start-activity \ -n com.android.dynsystem/com.android.dynsystem.VerificationActivity \ -a android.os.image.action.START_INSTALL \ -d file:///storage/emulated/0/Download/system_raw.gz \ --el KEY_SYSTEM_SIZE "$SIZE" \ --el KEY_USERDATA_SIZE 8589934592
❌ 錯誤 5:simg2img 轉換失敗
#
錯誤訊息:
Invalid sparse file format at header magic
Failed to read sparse file原因:誤以為從官方 GSI zip 解壓出來的 system.img 是 sparse 格式,實際上已經是原始的 ext4 格式,不需要轉換。
確認方式:
file system.img
# 正確輸出:Linux rev 1.0 ext2 filesystem data ...
# 錯誤情況才需要轉換:Android sparse image如果從 GSI 下載解壓後得到的是 已經是
system_raw.img,那表示它已經是未壓縮的原始格式,不需要再用 simg2img 轉換
正確流程:直接壓縮原始檔案:
gzip -9 system.img -c > system_raw.gz❌ 錯誤 6:可用空間不足(低於 40% 門檻) #
錯誤訊息(logcat):
E gsid: free space 29% is below the minimum threshold of 40%
Failed to start installation with requested size: 8589934592原因:Android DSU 要求 /data 分區至少有 40% 的空閒空間才能安裝。
解決方式:清理手機空間,將可用空間提升到 40% 以上。清理後從 29% 提升到 43%(約 98GB 可用),順利通過門檻。
✅ 安裝成功,但無法啟動 GSI #
現象:DSU 安裝完成,通知欄顯示「重新啟動」,執行 adb shell gsi_tool enable 啟用 sticky mode 後重啟,手機顯示 Sony logo 後黑屏,然後回到原本的 Xperia 系統。
診斷命令:
adb shell getprop ro.boot.verifiedbootstate # 結果:green
adb shell getprop ro.boot.flash.locked # 結果:1根本原因:
verifiedbootstate = green:Verified Boot 完全啟用flash.locked = 1:Bootloader 已鎖定
Sony 的 Verified Boot 在開機時驗證系統簽名,發現是未由 Sony 簽名的 GSI 就直接拒絕啟動,回到原本系統。
與 Google Pixel 的差異:Google Pixel 在 Verified Boot 中內建了開發者 GSI 的信任金鑰(Developer GSI Keys),所以 Pixel 不需要解鎖 bootloader 就能使用 DSU。Sony 沒有這樣做。
If you want to support booting Developer GSI Images in LOCKED state without disabling
verified boot, include Developer GSI keys by adding the following line:
$(call inherit-product, $(SRC_TARGET_DIR)/product/developer_gsi_keys.mk)解鎖 Bootloader 的代價 #
解鎖是唯一能讓 DSU 在 Xperia 上正常運作的方式,但代價很大:
| 功能 | 影響 |
|---|---|
| 所有資料 | ❌ 完全清除(Factory Reset) |
| Widevine | L1 降為 L3,Netflix/Disney+ 只能 SD 畫質 |
| 銀行 App | ❌ 可能無法使用(需要 Magisk + 模組繞過) |
| Google Pay | ❌ 很可能失效 |
| OTA 更新 | ❌ 可能收不到官方更新 |
| 相機 | 原生相機功能應不受影響 |
另外,解鎖手機後,其實可以安裝第三方 ROM,相對來講就不太需要 DSU 了 🤔。
升級 Android 13?不可能 #
Xperia 1 II 的官方最高版本是 Android 12,Sony 已終止這支手機的大版本更新。
“Sony Xperia 1 II has reached its end of life, meaning that there won’t be any further (official) Android updates for it. Android 12 will be the phone’s last and final Android update.”
最終結論 #
在 不解鎖 bootloader 的前提下,Xperia 1 II 無法使用 DSU 啟動 GSI。
DSU 本來設計「不需要解鎖 bootloader」,但這個設計假設 OEM 廠商會在 Verified Boot 中加入開發者 GSI 的信任金鑰。Google 的 Pixel 系列有這樣做,但 Sony 沒有。
如果你也想試 Material 3 Expressive,建議直接買 Pixel 系列,原生支援 DSU。
完整指令參考 #
# 1. 確認裝置連接
adb devices
# 2. 準備 GSI 檔案(macOS)
file system.img # 確認格式
SIZE=$(stat -f%z system.img) # 取得大小
gzip -9 system.img -c > system_raw.gz # 壓縮
# 3. 推送到手機
adb push system_raw.gz /storage/emulated/0/Download/
# 4. 啟動 DSU 安裝
adb shell am start-activity -W \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system_raw.gz \
--el KEY_SYSTEM_SIZE "$SIZE" \
--el KEY_USERDATA_SIZE 8589934592 \
com.android.dynsystem/.VerificationActivity
# 5. 啟用 Sticky Mode(讓重啟後繼續進 GSI)
adb shell gsi_tool enable
# 6. 診斷工具
adb logcat -d | grep -i -E 'gsid|DynamicSystem|InstallationAsync'
adb shell getprop ro.boot.verifiedbootstate
adb shell getprop ro.boot.flash.locked
adb shell df -h /dataReferences #
| 來源 | 連結 |
|---|---|
| Android 官方 DSU 文件 | https://developer.android.com/topic/dsu |
| AOSP DSU 實作文件 | https://source.android.com/docs/core/ota/dynamic-system-updates |
| GSI 版本下載頁面 | https://developer.android.com/topic/generic-system-image/releases |
| Sony Bug Tracker - DSU Loader 問題 | https://github.com/sonyxperiadev/bug_tracker/issues/787 |
| DSU Sideloader(第三方工具) | https://github.com/VegaBobo/DSU-Sideloader |
| Xperia 1 II 版本更新狀態 | https://www.androidupdatetracker.com/p/sony-xperia-1-ii |
| XDA - DSU 討論串 | https://xdaforums.com/t/lets-talk-about-dsu-dynamic-system-updates.4664669/ |
| Play Integrity 與解鎖 bootloader | https://droidwin.com/how-to-pass-meets-device-and-basic-integrity-via-play-integrity-fix/ |