Cuando se inicia un dispositivo con Android 16 (o versiones posteriores), se pone en modo de intercambio, que te permite conectarte al dispositivo con adb y usar un comando para obtener información sobre él. Deben existir las siguientes condiciones previas para que el dispositivo entre en el modo de intercambio:
- Se debe restablecer la configuración de fábrica del dispositivo.
- El dispositivo no debe tener servicio celular.
- El dispositivo no debe tener conectividad ni una cuenta establecida.
- El dispositivo debe estar ejecutando una compilación no depurable.
Después de navegar por el asistente de configuración, el dispositivo se coloca en el modo de evaluación, que te permite realizar una gama completa de comandos de adb y ejecutar diagnósticos adicionales en el dispositivo.
Recopila información general sobre la salud
Para recopilar información general sobre el estado del dispositivo, como la batería, el estado del almacenamiento y los números de identidad internacional de equipo móvil (IMEI), sigue estos pasos:
Asegúrate de que tu dispositivo cumpla con los requisitos previos para el modo de intercambio.
Conecta el dispositivo a una estación de trabajo.
Desde la estación de trabajo, ejecuta el siguiente comando:
adb shell tradeinmode getstatus
Este comando muestra un objeto JSON con información sobre el dispositivo. El siguiente es un ejemplo de resultado de un 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" }
Si
factory_reset_protection
está configurado entrue
, el dispositivo está protegido y no se puede restablecer. Si no se puede restablecer el dispositivo, no se puede evaluar.
Cómo identificar el estado del SO Android
Para recopilar información sobre el estado del sistema operativo Android, por ejemplo, si es una compilación aprobada, sigue estos pasos:
- Conecta el dispositivo a una estación de trabajo.
- Asegúrate de que el dispositivo tenga conexión a Internet.
Desde la estación de trabajo, ejecuta el siguiente comando:
adb shell tradeinmode getstatus --challenge CHALLENGE
CHALLENGE es una cadena alfanumérica generada de forma aleatoria, como
p4tRsuHjWB
. Este comando muestra un JSON que incluye un campo de certificación que contiene un registro de certificación en base64.Este comando agrega información de certificación a la información que muestra el comando
getstatus
. La información de certificación se ve de la siguiente manera:"attestation": { "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw ... }
Los dispositivos que se lancen con Android 16 o versiones posteriores requieren conectividad a Internet para crear un registro de certificación. La certificación se debe realizar en el modo de evaluación, después de configurar una conexión, ya que falla si se realiza en el asistente de configuración.
Analiza la información de certificación con uno de los siguientes métodos:
- Usa la herramienta
parse_tim_attestation
que se compila cuando compilas AOSP. - Usa una biblioteca de certificación de claves de Android.
Por ejemplo, para usar la herramienta
parse_tim_attestation
, ejecuta lo siguiente:parse_tim_attestation --challenge CHALLENGE output_file
El CHALLENGE debe ser el mismo desafío que usaste para obtener la información de certificación.
Si guardaste el resultado del paso 2 en un output_file, puedes proporcionar ese nombre de archivo. De lo contrario, la información de certificación se lee de stdin.
Se muestra un objeto JSON con la información del SO 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"
Si
trustworthy
es igual ayes
, el sistema operativo se considera confiable, la compilación está firmada y el IMEI no está falsificado.Ten en cuenta que se necesita conectividad a Internet para realizar la certificación, tanto en el dispositivo como en el host.
- Usa la herramienta
Prueba el modo de intercambio
Durante el desarrollo, debes probar el dispositivo para asegurarte de que entre y salga correctamente del modo de intercambio. Sigue estos pasos para probar la capacidad de tu dispositivo de ingresar y salir del modo de intercambio:
Conecta el dispositivo a una estación de trabajo.
Desde la estación de trabajo, reinicia el dispositivo en modo de intercambio:
adb shell tradeinmode testing start
Se reinicia el dispositivo y entra en el modo de intercambio. Después de ingresar al modo de intercambio, puedes usar cualquier comando
adb shell tradein
.Asegúrate de que el modo de intercambio esté activo:
adb shell tradeinmode testing status
El dispositivo identifica que las pruebas del modo de intercambio están activas.
Salir del modo de intercambio y restablecer el acceso completo a ADB:
adb shell tradeinmode testing stop
Integración del asistente de configuración personalizado
El comando evaluate
no funcionará en dispositivos con asistentes de configuración personalizados, a menos que se agregue un receptor de emisión. Para agregar un receptor de emisión a la app del asistente de configuración personalizado, haz lo siguiente:
Declara un receptor en el manifiesto de la app:
<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>
Crea un receptor de emisión similar al siguiente:
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. } }
El receptor debe realizar las siguientes acciones en orden.
- Verifica que
persist.adb.tradeinmode
sea2
. - Verifica que no haya protección contra el restablecimiento de la configuración de fábrica ni cerraduras antirrobo.
- Aprovisiona el dispositivo y asegúrate de que
Settings.Secure.USER_SETUP_COMPLETE
ySettings.Global.DEVICE_PROVISIONED
sean1
. - Cancela la actividad del asistente de configuración para que el dispositivo esté en la pantalla principal.
Referencia del modo de intercambio
En esta sección, se explican todos los comandos del modo de intercambio.
evaluar
adb shell tradeinmode evaluate
Para ingresar al modo de evaluación, se omite el asistente de configuración como si el usuario hubiera omitido manualmente cada pantalla de configuración.
Después de omitir el asistente de configuración, puedes ejecutar comandos ADB adicionales o pruebas funcionales en el dispositivo.
Después de salir del modo de evaluación, se restablece la configuración de fábrica para garantizar que no se transfieran accidentalmente artefactos de las pruebas a ningún cliente.
getstatus
adb shell tradeinmode getstatus [--challenge CHALLENGE]
Muestra una cadena JSON con información del sistema, incluida la información de estado de la batería y el almacenamiento, del dispositivo.
Incluye el parámetro --challenge
seguido de una clave de desafío alfanumérica generada de forma aleatoria para mostrar un campo de certificación adicional. Analiza esta respuesta para identificar información clave del sistema operativo, como el estado del bootloader (bloqueado o desbloqueado) y la validez de los números de serie del IMEI.
poweroff
adb shell tradeinmode poweroff
Apaga el dispositivo. Usa este comando para evitar que se agote la batería mientras el dispositivo no se está probando o evaluando de forma activa.
reiniciar
adb shell tradeinmode reboot
Reinicia el dispositivo.
inicio de las pruebas
adb shell tradeinmode testing start
Reinicia el dispositivo en modo de intercambio. Este comando solo funciona dentro del asistente de configuración. Cuando se emite este comando, se omite la autorización y solo funcionan los comandos del modo de intercambio.
Este comando solo funciona en dispositivos con compilaciones userdebug
, eng
o user
. La compilación de user
debe tener ro=debuggable=1
configurado.
estado de la prueba
adb shell tradeinmode testing status
Identifica si las pruebas del modo de intercambio están activas.
Este comando solo funciona en dispositivos con compilaciones userdebug
, eng
o user
. La compilación de user
debe tener ro=debuggable=1
configurado.
parada de prueba
adb shell tradeinmode testing stop
Devuelve el dispositivo al modo en el que se encontraba antes de que emitieras el comando adb shell tradeinmode testing start
.
Este comando solo funciona en dispositivos con compilaciones userdebug
, eng
o user
. La compilación de user
debe tener ro=debuggable=1
configurado.
limpieza de prueba
adb shell tradeinmode testing wipe
Restablece la configuración de fábrica del dispositivo.
Este comando solo funciona en dispositivos con compilaciones userdebug
, eng
o user
. La compilación de user
debe tener ro=debuggable=1
configurado.
wait-until-ready
adb shell tradeinmode wait-until-ready
Espera hasta que los servicios del sistema estén listos para que el modo de intercambio pueda funcionar por completo. Usa este comando en tu automatización para asegurarte de que los comandos del modo de intercambio se realicen correctamente.
Puedes agregar wait-until-ready
antes de otros comandos del modo de intercambio. Por ejemplo, aquí se muestra wait-until-ready
encadenado a getstatus
:
adb shell tradeinmode wait-until-ready getstatus