↓ 快轉到主要內容
  1. Posts/

Sony Xperia 1 II (XQ-AT52) 嘗試 DSU (Dynamic System Update) 完整踩坑紀錄

·828 字·4 分鐘· loading · loading · ·
ADSFAaron
作者
ADSFAaron
熱愛動手實作的開發者,喜歡把前端、雲端與網路的實作過程寫成筆記分享。
目錄

目標:在不解鎖 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 安裝流程:

  1. 開發人員選項的 DSU Loader UI:在「設定 → 開發人員選項 → DSU Loader」裡面選擇 GSI 並接受條款後,系統會啟動安裝流程。
  2. 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 偵錯未啟用或裝置未被識別。

解決方式:

  1. 設定 → 關於手機 → 連點「版本號碼」7 次開啟「開發人員選項」
  2. 開發人員選項 → 啟用「USB 偵錯」
  3. 手機上點擊「允許」USB 偵錯授權
  4. 執行 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 這個應用程式沒有安裝或未啟用

解決方式:

  1. 檢查 dynsystem 應用狀態

    adb shell pm list packages | grep dynsystem
  2. 啟用動態系統功能標誌

    adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1
  3. 檢查 dynsystem 是否被禁用

    adb shell pm list packages -d | grep dynsystem
  4. 嘗試重新啟動 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 沒有這樣做。

參考:AOSP DSU 實作文件

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 了 🤔。

參考:DSU Sideloader 說明


升級 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.”

— Android Update Tracker


最終結論
#

在 不解鎖 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 /data

References
#

來源 連結
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/

☕ 這篇文章對你有幫助嗎?

覺得有幫助的話,歡迎小額贊助,支持我持續分享。

請我喝杯咖啡 →