取得系統健康狀態資訊

當 Android 16 (或更高版本) 裝置啟動時,會進入換購模式,讓您使用 ADB 連線至裝置,並使用指令取得裝置相關資訊。裝置必須符合下列先決條件,才能進入換購模式:

  • 裝置必須恢復原廠設定。
  • 裝置不得使用行動網路服務。
  • 裝置不得連上網路或建立帳戶。
  • 裝置必須執行無法偵錯的版本。

完成設定精靈後,裝置會進入評估模式,讓您執行各種 ADB 指令,並在裝置上執行其他診斷作業。

收集一般健康資訊

如要收集裝置的一般健康資訊,例如電池、儲存空間健康和國際行動裝置識別碼 (IMEI) 號碼的相關資訊,請按照下列步驟操作:

  1. 確認裝置符合換購模式的先決條件。

  2. 將裝置插入工作站。

  3. 在工作站上執行下列指令:

    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 作業系統狀態的相關資訊,例如是否為已核准的版本,請按照下列步驟操作:

  1. 將裝置插入工作站。
  2. 確認裝置已連上網際網路。
  3. 在工作站上執行下列指令:

    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 以上版本的裝置必須連上網際網路,才能建立認證記錄。在設定連線後,應在評估模式下執行認證,因為在設定精靈中執行認證會失敗。

  4. 使用下列任一方法剖析認證資訊:

    舉例來說,如要使用 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 並未遭到偽造。

    請注意,無論是在裝置上還是在主機上,都必須連上網際網路才能執行認證。

測試換購模式

開發期間,請測試裝置,確保裝置能正確進入和退出換購模式。請按照下列步驟測試裝置是否能進入及退出換購模式:

  1. 將裝置插入工作站。

  2. 透過工作站將裝置重新啟動至換購模式:

    adb shell tradeinmode testing start

    裝置會重新啟動並進入換購模式。進入換購模式後,您可以使用任何 adb shell tradein 指令。

  3. 確認已啟用換購模式:

    adb shell tradeinmode testing status

    裝置會識別出正在進行的換購模式測試。

  4. 退出換購模式並還原完整 ADB 存取權:

    adb shell tradeinmode testing stop

自訂設定精靈整合

除非新增廣播接收器,否則 evaluate 指令無法在含有自訂設定精靈的裝置上運作。如要在自訂設定精靈應用程式中新增廣播接收器,請按照下列步驟操作:

  1. 在應用程式資訊清單中宣告接收器:

    <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>
    
  2. 建立類似的廣播接收器:

    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.
     }
    }
    

接收端必須依序執行下列動作。

  1. 確認 persist.adb.tradeinmode 是否為 2
  2. 確認沒有恢復原廠設定保護機制或防盜鎖。
  3. 佈建裝置,確保 Settings.Secure.USER_SETUP_COMPLETESettings.Global.DEVICE_PROVISIONED1
  4. 關閉設定精靈活動,讓裝置回到主畫面。

換購模式參考資料

本節將說明所有換購模式指令。

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

重新啟動裝置並進入換購模式。這個指令僅適用於設定精靈。發出這項指令後,系統會略過授權程序,僅執行換購模式指令。

這項指令僅適用於搭載 userdebugenguser 版本的裝置。user 版本必須設定 ro=debuggable=1

測試狀態

adb shell tradeinmode testing status

指出是否啟用換購模式測試。

這項指令僅適用於搭載 userdebugenguser 版本的裝置。user 版本必須設定 ro=debuggable=1

測試停止

adb shell tradeinmode testing stop

將裝置還原為您發出 adb shell tradeinmode testing start 指令之前的模式。

這項指令僅適用於搭載 userdebugenguser 版本的裝置。user 版本必須設定 ro=debuggable=1

測試抹除

adb shell tradeinmode testing wipe

將裝置恢復原廠設定。

這項指令僅適用於搭載 userdebugenguser 版本的裝置。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