當 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 作業系統資訊的 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
。 - 關閉設定精靈活動,讓裝置回到主畫面。
換購模式參考資料
本節將說明所有換購模式指令。
evaluate
adb shell tradeinmode evaluate
略過設定精靈,進入評估模式,就像使用者手動略過每個設定畫面一樣。
略過設定精靈後,您可以在裝置上執行其他 ADB 指令或功能測試。
離開評估模式後,系統會恢復原廠設定,確保不會將測試產生的構件意外傳送給任何客戶。
getstatus
adb shell tradeinmode getstatus [--challenge CHALLENGE]
傳回裝置的系統資訊 JSON 字串,包括電池和儲存空間健康資訊。
請加入 --challenge
參數,後面加上隨機產生的英數挑戰金鑰,以便傳回額外的認證欄位。剖析這個回應,找出主要的作業系統資訊,例如引導程式 (Bootloader) 的狀態 (已鎖定或已解鎖) 和 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
。例如,以下是 wait-until-ready
連結至 getstatus
的情況:
adb shell tradeinmode wait-until-ready getstatus