取得系統健康狀態資訊

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",
      "cameras": [
        {
          "num_physical": 3,
          "lens_facing": "back"
        },
        {
          "num_physical": 2,
          "lens_facing": "front"
        }
      ],
      "uiccs": [
        {
          "eid": "89033023427100000000007982221521",
          "removable": false,
          "physical_slot_index": 0
        },
        {
          "removable": true,
          "physical_slot_index": 1
        }
      ]
    }
    

    如果 factory_reset_protection 設為 true,裝置會受到保護,且無法重設。如果無法重設裝置,我們就無法評估裝置狀況。

    camerasuiccs 欄位位於 Android 17 以上版本。

找出 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.tradeinmode2
  2. 確認沒有恢復原廠設定保護機制或防盜鎖定。
  3. 佈建裝置,確保 Settings.Secure.USER_SETUP_COMPLETESettings.Global.DEVICE_PROVISIONED 處於 1 狀態。
  4. 關閉設定精靈活動,讓裝置回到主畫面。

換購模式參考資料

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

evaluate

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

將裝置重新啟動為換購模式。這項指令只能在設定精靈中使用。發出這項指令後,系統會略過授權,且只會執行換購模式指令。

這項指令僅適用於搭載 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,舉例來說,以下是鏈結至 getstatuswait-until-ready

adb shell tradeinmode wait-until-ready getstatus