Obtén información sobre el estado del sistema

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:

  1. Asegúrate de que tu dispositivo cumpla con los requisitos previos 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 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 en true, 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:

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

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

    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 a yes, 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.

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:

  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 entra en el modo de intercambio. Después de ingresar al modo de intercambio, puedes usar cualquier comando adb shell tradein.

  3. 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.

  4. 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:

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