获取系统健康状况信息

搭载 Android 16(或更高版本)的设备在启动时会进入以旧换新模式。在这种模式下,您可以使用 adb 连接到设备,并可以使用命令获取设备相关信息。设备必须满足以下前提条件,才能进入以旧换新模式:

  • 设备必须恢复出厂设置。
  • 设备不得提供移动网络服务。
  • 设备必须未连接到网络或未建立账号。
  • 设备必须运行不可调试的 build。

完成设置向导后,设备会进入评估模式。在这种模式下,您可以在设备上执行各种 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 OS 状态

若要收集关于 Android 操作系统状态的信息(例如是否为已获批准的 build),请按以下步骤操作:

  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 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,则操作系统会被视为可信;build 已签名且 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_PROVISIONED 均为 1
  4. 关闭设置向导 activity,使设备进入主屏幕。

以旧换新模式参考

本部分介绍了所有以旧换新模式命令。

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

重新启动设备。

testing start

adb shell tradeinmode testing start

重启设备,使其进入以旧换新模式。此命令只能在设置向导中使用。发出此命令后,系统会绕过授权,并且只有以旧换新模式命令有效。

此命令仅适用于搭载 userdebugenguser build 的设备。user build 必须设置 ro=debuggable=1

testing status

adb shell tradeinmode testing status

识别是否正在进行以旧换新模式测试。

此命令仅适用于搭载 userdebugenguser build 的设备。user build 必须设置 ro=debuggable=1

testing stop

adb shell tradeinmode testing stop

将设备恢复到您发出 adb shell tradeinmode testing start 命令之前的模式。

此命令仅适用于搭载 userdebugenguser build 的设备。user build 必须设置 ro=debuggable=1

testing wipe

adb shell tradeinmode testing wipe

将设备恢复出厂设置。

此命令仅适用于搭载 userdebugenguser build 的设备。user build 必须设置 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