Android 16 以上版本的裝置啟動時,會進入舊機換新模式,讓您使用 adb 連線至裝置,並透過指令取得裝置資訊。裝置必須符合下列先決條件,才能進入換購模式:
- 裝置必須恢復原廠設定。
- 裝置不得具備行動網路服務。
- 裝置不得連上網路或已建立帳戶。
- 裝置必須執行無法偵錯的版本。
換機模式可讓您查詢基本診斷資訊,或進入評估模式,在裝置上執行全方位的 adb 指令,以及額外的診斷作業。
收集一般健康資訊
如要收集裝置的一般健康資訊,例如電池、儲存空間健康狀態和國際行動裝置識別碼 (IMEI) 編號等資訊,請按照下列步驟操作:
確認裝置符合換購模式的先決條件。
將裝置插入工作站。
在工作站上執行下列指令:
adb shell tradeinmode getstatus
這項指令會傳回包含裝置資訊的 JSON 物件。以下是 Pixel 7 的輸出範例:
{ "battery": { "cycle_count": 16, "health": 100, "state": 2, "manufacturing_date": 1653004800, "first_usage_date": 0 }, "storage": { "useful_lifetime_remaining": 99, "capacity_bytes": "128000000000" }, "launch_level": 33, "locks": { "factory_reset_protection": false }, "product": { "brand": "google", "device": "panther", "manufacturer": "Google", "model": "Pixel 7", "name": "panther" }, "imeis": [ "353644930127905", "353644930127913" ], "serial": "26061FDH2000AP" }
如果
factory_reset_protection
設為true
,裝置會受到保護,且無法重設。如果無法重設裝置,我們就無法評估裝置狀況。
找出 Android 作業系統狀態
如要收集 Android 作業系統的狀態資訊 (例如是否為核准版本),請按照下列步驟操作:
- 將裝置插入工作站。
- 確認裝置已連上網際網路。
在工作站上執行下列指令:
adb shell tradeinmode getstatus --challenge CHALLENGE
CHALLENGE 是隨機產生的英數字元字串,例如
p4tRsuHjWB
。這項指令會傳回 JSON,其中包含含有 base64 認證記錄的認證欄位。這個指令會將認證資訊附加至
getstatus
指令傳回的資訊。認證資訊的形式大致如下:"attestation": { "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw ... }
搭載 Android 16 以上版本的裝置必須連上網際網路,才能建立認證記錄。設定連線後,應在評估模式下執行認證,否則在設定精靈中執行會失敗。
使用下列其中一種方法剖析認證資訊:
- 使用建構 AOSP 時建構的
parse_tim_attestation
工具。 - 使用 Android 金鑰認證程式庫。
舉例來說,如要使用
parse_tim_attestation
工具,請執行:parse_tim_attestation --challenge CHALLENGE output_file
CHALLENGE 必須與您用來取得認證資訊的驗證問題相同。
如果您將步驟 2 的輸出內容儲存到 output_file,可以提供該檔案名稱。否則,認證資訊會從 stdin 讀取。
系統會傳回含有 Android OS 資訊的 JSON 物件:
"record": { "keymaster_version": "400", "keymaster_security_level": "TRUSTED_ENVIRONMENT", "attributes": { "imeis": [ "353644930125669", "353644930125677" ], "vendor_patch_level": 20250305, "serial": "26161FDH2000NV", "os_version": 160000, "source": "hardware", "boot_patch_level": 20250305 }, "bootloader_locked": false, "verified_boot": false, "security_level": "TRUSTED_ENVIRONMENT" }, "certificate": "verified", "trustworthy": "verified boot disabled"
如果
trustworthy
等於yes
,作業系統會視為可信任,且建構版本已簽署,IMEI 也未偽造。請注意,裝置和主機都必須連上網際網路,才能執行認證。
- 使用建構 AOSP 時建構的
測試換購模式
開發期間,請測試裝置,確保裝置能正確進入和退出換購模式。請按照下列步驟測試裝置進入和退出換購模式的能力:
將裝置插入工作站。
從工作站將裝置重新啟動為換購模式:
adb shell tradeinmode testing start
裝置會重新啟動並進入換購模式。進入舊機換新模式後,你可以使用任何
adb shell tradein
指令。確認已啟用舊換新模式:
adb shell tradeinmode testing status
裝置會識別出以舊換新模式測試已啟用。
退出換購模式並還原完整 adb 存取權:
adb shell tradeinmode testing stop
整合自訂設定精靈
除非新增廣播接收器,否則 evaluate
指令無法在自訂設定精靈的裝置上運作。如要將廣播接收器新增至自訂設定精靈應用程式,請按照下列步驟操作:
在應用程式資訊清單中宣告接收器:
<receiver android:name=".EnterEvaluationModeReceiver" android:exported="true" android:permission="android.permission.ENTER_TRADE_IN_MODE"> <intent-filter> <action android:name="com.google.android.setupwizard.ENTER_TRADE_IN_MODE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
建立類似下列項目的廣播接收器:
public class EnterEvaluationModeReceiver extends BroadcastReceiver { private static final String TRADE_IN_MODE_PROPERTY = "persist.adb.tradeinmode"; private static final int TIM_EVALUATION_MODE = 2; @Override public void onReceive(Context context, Intent intent) { if (SystemProperties.getInt(TRADE_IN_MODE_PROPERTY, 0) != TIM_EVALUATION_MODE) { return; } // Check if any factory reset protection is enabled. // Provision the device. // End the setup wizard activity. } }
接收器必須依序執行下列動作。
- 確認
persist.adb.tradeinmode
為2
。 - 確認沒有恢復原廠設定保護機制或防盜鎖。
- 佈建裝置,確保
Settings.Secure.USER_SETUP_COMPLETE
和Settings.Global.DEVICE_PROVISIONED
都是1
。 - 關閉設定精靈活動,讓裝置回到主畫面。
換購模式參考資料
本節說明所有換機模式指令。
評估
adb shell tradeinmode evaluate
略過設定精靈,進入評估模式,就像使用者手動略過每個設定畫面一樣。
略過設定精靈後,您可以在裝置上執行其他 ADB 指令或功能測試。
離開評估模式後,系統會恢復原廠設定,確保測試期間的任何構件都不會意外轉移給消費者。
getstatus
adb shell tradeinmode getstatus [--challenge CHALLENGE]
傳回 JSON 字串,內含裝置的系統資訊,包括電池和儲存空間健康狀態資訊。
加入 --challenge
參數,然後是隨機產生的英數字元驗證金鑰,即可傳回額外的認證欄位。剖析這項回應,找出重要的作業系統資訊,例如開機載入程式的狀態 (已鎖定或未鎖定),以及 IMEI 序號的有效性。
poweroff
adb shell tradeinmode poweroff
關閉裝置電源。在裝置未主動測試或評估時,使用這項指令可避免耗電。
重開。
adb shell tradeinmode reboot
重新啟動裝置。
測試開始
adb shell tradeinmode testing start
將裝置重新啟動為換購模式。這項指令只能在設定精靈中使用。發出這項指令後,系統會略過授權,且只會執行以舊換新模式的指令。
這項指令僅適用於搭載 userdebug
、eng
或 user
版本的裝置。user
版本必須設定 ro=debuggable=1
。
測試狀態
adb shell tradeinmode testing status
識別是否已啟用舊換新模式測試。
這項指令僅適用於搭載 userdebug
、eng
或 user
版本的裝置。user
版本必須設定 ro=debuggable=1
。
測試停止
adb shell tradeinmode testing stop
將裝置還原為發出 adb shell tradeinmode testing start
指令前的模式。
這項指令僅適用於搭載 userdebug
、eng
或 user
版本的裝置。user
版本必須設定 ro=debuggable=1
。
測試抹除
adb shell tradeinmode testing wipe
將裝置恢復原廠設定。
這項指令僅適用於搭載 userdebug
、eng
或 user
版本的裝置。user
版本必須設定 ro=debuggable=1
。
wait-until-ready
adb shell tradeinmode wait-until-ready
等待系統服務準備就緒,以便完整運作舊機換新模式。 在自動化程序中使用這項指令,確保以舊換新模式指令成功執行。
你可以在其他換購模式指令前加上 wait-until-ready
,舉例來說,以下是鏈結至 getstatus
的 wait-until-ready
:
adb shell tradeinmode wait-until-ready getstatus