搭载 Android 16(或更高版本)的设备在启动时会进入以旧换新模式。在这种模式下,您可以使用 adb 连接到设备,并可以使用命令获取设备相关信息。设备必须满足以下前提条件,才能进入以旧换新模式:
- 设备必须恢复出厂设置。
- 设备不得提供移动网络服务。
- 设备必须未连接到网络或未建立账号。
- 设备必须运行不可调试的 build。
完成设置向导后,设备会进入评估模式。在这种模式下,您可以在设备上执行各种 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 OS 状态
若要收集关于 Android 操作系统状态的信息(例如是否为已获批准的 build),请按以下步骤操作:
- 将设备插入工作站。
- 确保设备已连接到网络。
在工作站上,运行以下命令:
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
,则操作系统会被视为可信;build 已签名且 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
。 - 关闭设置向导 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
重启设备,使其进入以旧换新模式。此命令只能在设置向导中使用。发出此命令后,系统会绕过授权,并且只有以旧换新模式命令有效。
此命令仅适用于搭载 userdebug
、eng
或 user
build 的设备。user
build 必须设置 ro=debuggable=1
。
testing status
adb shell tradeinmode testing status
识别是否正在进行以旧换新模式测试。
此命令仅适用于搭载 userdebug
、eng
或 user
build 的设备。user
build 必须设置 ro=debuggable=1
。
testing stop
adb shell tradeinmode testing stop
将设备恢复到您发出 adb shell tradeinmode testing start
命令之前的模式。
此命令仅适用于搭载 userdebug
、eng
或 user
build 的设备。user
build 必须设置 ro=debuggable=1
。
testing wipe
adb shell tradeinmode testing wipe
将设备恢复出厂设置。
此命令仅适用于搭载 userdebug
、eng
或 user
build 的设备。user
build 必须设置 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