Skip to main content
  1. Posts/

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

·828 words·4 mins· loading · loading · ·
ADSFAaron
Author
ADSFAaron
Table of Contents

目標:在不解鎖 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/