При загрузке устройства 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", "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, устройство защищено и его нельзя сбросить. Если устройство нельзя сбросить, его нельзя оценить.Поля
camerasиuiccsдоступны в Android 17 и более поздних версиях.
Определение состояния ОС Android
Чтобы получить информацию о состоянии ОС Android, например о том, является ли она одобренной сборкой, выполните следующие действия:
- Подключите устройство к рабочей станции.
- Убедитесь, что устройство подключено к интернету.
Выполните на рабочей станции следующую команду:
adb shell tradeinmode getstatus --challenge CHALLENGECHALLENGE – это случайно сгенерированная буквенно-цифровая строка, например
p4tRsuHjWB. Эта команда возвращает JSON, в том числе поле attestation, содержащее запись аттестации в кодировке Base64.Эта команда добавляет информацию о подтверждении к информации, возвращаемой командой
getstatus. Пример сведений о подтверждении:"attestation": { "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw ... }Для создания записи подтверждения на устройствах с Android 16 или более поздней версии требуется подключение к интернету. Аттестацию следует выполнять в режиме оценки после настройки подключения, так как при выполнении в мастере настройки она завершается неудачно.
Проанализируйте информацию об аттестации одним из следующих способов:
- Используйте инструмент
parse_tim_attestation, который создается при сборке AOSP. - Используйте библиотеку аттестации ключей Android.
Например, чтобы использовать инструмент
parse_tim_attestation, выполните следующую команду:parse_tim_attestation --challenge CHALLENGE output_fileПараметр CHALLENGE должен совпадать с запросом, который вы использовали для получения информации о подтверждении.
Если на шаге 2 вы сохранили выходные данные в файл output_file, укажите его название. В противном случае информация об аттестации считывается со стандартного ввода.
Возвращается объект JSON с информацией об ОС Android:
"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 не подделан.Обратите внимание, что для подтверждения подлинности требуется подключение к интернету как на устройстве, так и на хосте.
- Используйте инструмент
Как протестировать режим трейд-ин
Во время разработки протестируйте устройство, чтобы убедиться, что оно правильно входит в режим трейд-ин и выходит из него. Чтобы проверить, может ли устройство переходить в режим обмена и выходить из него, выполните следующие действия:
Подключите устройство к рабочей станции.
На рабочей станции перезапустите устройство в режиме обмена:
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, а затем случайно сгенерированный буквенно-цифровой ключ запроса, чтобы вернуть дополнительное поле подтверждения. Проанализируйте этот ответ, чтобы определить ключевую информацию об операционной системе, например статус загрузчика (заблокирован или разблокирован) и действительность серийных номеров 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