Obtén información sobre el estado del sistema

Cuando se inicia un dispositivo con Android 16 (o una versión posterior), se pone en modo de intercambio, lo que te permite conectarte al dispositivo con adb y usar un comando para obtener información sobre él. Para que el dispositivo entre en el modo de intercambio, deben cumplirse las siguientes condiciones previas:

  • 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 ejecutar una compilación no depurable.

El modo de intercambio te permite consultar información de diagnóstico básica o ingresar al modo de evaluación, que te permite realizar una amplia variedad 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 de tu dispositivo, como información sobre la batería, el estado de almacenamiento y los números de identidad internacional de equipo móvil (IMEI), sigue estos pasos:

  1. Asegúrate de que tu dispositivo cumpla con las condiciones previas para el modo de intercambio.

  2. Conecta el dispositivo a una estación de trabajo.

  3. Desde la estación de trabajo, ejecuta el siguiente comando:

    adb shell tradeinmode getstatus

    Este comando devuelve un objeto JSON con información sobre el dispositivo. A continuación, se muestra un ejemplo del 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 como true, el dispositivo está protegido y no se puede restablecer. Si no se puede restablecer el dispositivo, no se podrá 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:

  1. Conecta el dispositivo a una estación de trabajo.
  2. Asegúrate de que el dispositivo tenga conexión a Internet.
  3. 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 devuelve JSON, incluido 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 devuelve 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 debe realizarse 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.

  4. Analiza la información de la certificación con uno de los siguientes métodos:

    Por ejemplo, para usar la herramienta parse_tim_attestation, ejecuta el siguiente comando:

    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 desde stdin.

    Se devuelve 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 a yes, se considera que el sistema operativo es de confianza, 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.

Modo de prueba de trade-in

Durante el desarrollo, debes probar tu dispositivo para asegurarte de que entre y salga correctamente del modo de intercambio. Sigue estos pasos para probar la capacidad del dispositivo de entrar y salir del modo de intercambio:

  1. Conecta el dispositivo a una estación de trabajo.

  2. Desde la estación de trabajo, reinicia el dispositivo en modo de intercambio:

    adb shell tradeinmode testing start

    Se reinicia el dispositivo y se activa el modo de intercambio. Después de ingresar al modo de intercambio, puedes usar cualquier comando de adb shell tradein.

  3. Asegúrate de que el modo de intercambio esté activo:

    adb shell tradeinmode testing status

    El dispositivo identifica que la prueba del modo de intercambio está activa.

  4. Para salir del modo de intercambio y restablecer el acceso completo a adb, haz lo siguiente:

    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 transmisiones. Para agregar un receptor de emisión a la app del asistente de configuración personalizado, haz lo siguiente:

  1. Declara un receptor en el manifiesto de la app:

    <receiver android:name=".EnterEvaluationModeReceiver"
              android:exported="true"
              android:permission="android.permis>sio<n.ENTER_TRADE>_IN_M<ODE"
      intent-filter
        action android:name="com.google.android>.setu<pwizard.ENTER_TRADE_IN_MODE" /
        category android:>nam<e="androi>d<.intent.c>ategory.DEFAULT" /
      /intent-filter
    /receiver
    
  2. 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.

  1. Comprueba que persist.adb.tradeinmode sea 2.
  2. Verifica que no haya protección contra restablecimiento de la configuración de fábrica ni bloqueos antirrobo.
  3. Aprovisiona el dispositivo y asegúrate de que Settings.Secure.USER_SETUP_COMPLETE y Settings.Global.DEVICE_PROVISIONED sean 1.
  4. Descarta 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

Ingresa al modo de evaluación omitiendo 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 de 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 ningún artefacto de las pruebas se transfiera accidentalmente a los clientes.

getstatus

adb shell tradeinmode getstatus [--challenge CHALLENGE]

Devuelve una cadena JSON con información del sistema del dispositivo, incluida la información sobre el estado de la batería y el almacenamiento.

Incluye el parámetro --challenge seguido de una clave de desafío alfanumérica generada de forma aleatoria para devolver un campo de certificación adicional. Analiza esta respuesta para identificar información clave del sistema operativo, como el estado del cargador de arranque (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 no se prueba ni evalúa el dispositivo de forma activa.

reiniciar

adb shell tradeinmode reboot

Reinicia el dispositivo.

Inicio de la prueba

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 establecido ro=debuggable=1.

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 establecido ro=debuggable=1.

Parada de prueba

adb shell tradeinmode testing stop

Devuelve el dispositivo al modo en el que estaba 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 establecido ro=debuggable=1.

toallita 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 establecido ro=debuggable=1.

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 funcione por completo. Usa este comando en tu automatización para asegurarte de que los comandos del modo de intercambio se ejecuten 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