Receber informações de integridade do sistema

Quando um dispositivo Android 16 (ou mais recente) é inicializado, ele é colocado no modo revenda, que permite conectar o dispositivo usando o adb e usar um comando para obter informações sobre ele. As seguintes condições prévias precisam existir para que o dispositivo entre no modo revenda:

  • O dispositivo precisa ser redefinido para a configuração original.
  • O dispositivo não pode ter serviço de rede celular.
  • O dispositivo não pode ter conectividade nem uma conta estabelecida.
  • O dispositivo precisa estar executando uma versão não depurável.

O modo revenda permite consultar informações básicas de diagnóstico ou entrar no modo de avaliação, que permite executar uma gama completa de comandos adb e diagnósticos adicionais no dispositivo.

Reunir informações gerais de saúde

Para coletar informações gerais de saúde do dispositivo, como informações sobre a bateria, a integridade do armazenamento e os números de identificação internacional de equipamento móvel (IMEI), siga estas etapas:

  1. Confira se o dispositivo atende aos pré-requisitos para o modo revenda.

  2. Conecte o dispositivo a uma estação de trabalho.

  3. Na estação de trabalho, execute o seguinte comando:

    adb shell tradeinmode getstatus

    Esse comando retorna um objeto JSON com informações sobre o dispositivo. Confira a seguir um exemplo de saída de um 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
        }
      ]
    }
    

    Se factory_reset_protection estiver definido como true, o dispositivo estará seguro e não poderá ser redefinido. Se não for possível redefinir o dispositivo, ele não poderá ser avaliado.

    Os campos cameras e uiccs estão presentes no Android 17 ou versões mais recentes.

Identificar o estado do SO Android

Para coletar informações sobre o estado do sistema operacional Android, como se é um build aprovado, siga estas etapas:

  1. Conecte o dispositivo a uma estação de trabalho.
  2. Verifique se o dispositivo tem conectividade com a Internet.
  3. Na estação de trabalho, execute o seguinte comando:

    adb shell tradeinmode getstatus --challenge CHALLENGE

    O CHALLENGE é uma string alfanumérica gerada aleatoriamente, como p4tRsuHjWB. Esse comando retorna JSON, incluindo um campo de atestado com um registro de atestado base64.

    Esse comando anexa uma informação de atestado às informações retornadas pelo comando getstatus. As informações de atestado têm esta aparência:

    "attestation": {
      "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n
        EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n
        MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n
        KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw
        ...
    }
    

    Os dispositivos lançados com o Android 16 ou versões mais recentes precisam de conectividade com a Internet para criar um registro de atestado. A atestação precisa ser feita no modo de avaliação, depois de configurar uma conexão, porque ela falha se for feita no assistente de configuração.

  4. Analise as informações de atestado usando um dos seguintes métodos:

    Por exemplo, para usar a ferramenta parse_tim_attestation, execute:

    parse_tim_attestation --challenge CHALLENGE output_file

    O CHALLENGE precisa ser o mesmo desafio usado para receber as informações de atestado.

    Se você salvou a saída da etapa 2 em um output_file, forneça esse nome de arquivo. Caso contrário, as informações de atestado serão lidas do stdin.

    Um objeto JSON com as informações do SO Android é retornado:

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

    Se trustworthy for igual a yes, o sistema operacional será considerado confiável, o build será assinado e o IMEI não será falsificado.

    É necessário ter conectividade com a Internet para realizar a comprovação, tanto no dispositivo quanto no host.

Testar o modo revenda

Durante o desenvolvimento, teste o dispositivo para garantir que ele entre e saia do modo revenda corretamente. Siga estas etapas para testar a capacidade do dispositivo de entrar e sair do modo revenda:

  1. Conecte o dispositivo a uma estação de trabalho.

  2. Na estação de trabalho, reinicialize o dispositivo no modo revenda:

    adb shell tradeinmode testing start

    O dispositivo é reinicializado e entra no modo revenda. Depois de entrar no modo de troca, você pode usar qualquer comando adb shell tradein.

  3. Confira se o modo revenda está ativo:

    adb shell tradeinmode testing status

    O dispositivo identifica que o teste do modo revenda está ativo.

  4. Saia do modo revenda e restaure o acesso total ao adb:

    adb shell tradeinmode testing stop

Integração do assistente de configuração personalizada

O comando evaluate não funciona em dispositivos com assistentes de configuração personalizados a menos que um broadcast receiver seja adicionado. Para adicionar um broadcast receiver ao app do assistente de configuração personalizada:

  1. Declare um receptor no manifesto do 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. Crie um broadcast receiver semelhante a este:

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

O receptor precisa realizar as ações a seguir em ordem.

  1. Verifique se persist.adb.tradeinmode é 2.
  2. Verifique se não há proteção contra redefinição de fábrica ou bloqueios antirroubo.
  3. Provisione o dispositivo e verifique se Settings.Secure.USER_SETUP_COMPLETE e Settings.Global.DEVICE_PROVISIONED são 1.
  4. Dispensar a atividade do assistente de configuração para que o dispositivo fique na tela inicial.

Referência do modo revenda

Esta seção explica todos os comandos do modo de troca.

evaluate

adb shell tradeinmode evaluate

Entra no modo de avaliação ignorando o assistente de configuração como se cada tela de configuração tivesse sido ignorada manualmente pelo usuário.

Depois de pular o assistente de configuração, é possível executar outros comandos do ADB ou testes funcionais no dispositivo.

Depois que você sair do modo de avaliação, uma redefinição de fábrica será realizada para garantir que nenhum artefato de teste seja transferido acidentalmente para os clientes.

getstatus

adb shell tradeinmode getstatus [--challenge CHALLENGE]

Retorna uma string JSON com informações do sistema, incluindo informações de integridade da bateria e do armazenamento, para o dispositivo.

Inclua o parâmetro --challenge seguido por uma chave de desafio alfanumérica gerada aleatoriamente para retornar um campo de atestado adicional. Analise essa resposta para identificar informações importantes do sistema operacional, como o status do carregador de inicialização (bloqueado ou desbloqueado) e a validade dos números de série do IMEI.

poweroff

adb shell tradeinmode poweroff

Desliga o dispositivo. Use esse comando para evitar o consumo elevado da bateria enquanto o dispositivo não está sendo testado ou avaliado ativamente.

reinicializar

adb shell tradeinmode reboot

Reinicializa o dispositivo.

início do teste

adb shell tradeinmode testing start

Reinicializa o dispositivo no modo revenda. Esse comando só funciona no assistente de configuração. Ao emitir esse comando, a autorização é ignorada e apenas os comandos do modo revenda funcionam.

Esse comando só funciona em dispositivos com builds userdebug, eng ou user. A build user precisa ter ro=debuggable=1 definido.

status do teste

adb shell tradeinmode testing status

Identifica se o teste do modo revenda está ativo.

Esse comando só funciona em dispositivos com builds userdebug, eng ou user. A build user precisa ter ro=debuggable=1 definido.

interrupção do teste

adb shell tradeinmode testing stop

Retorna o dispositivo ao modo em que estava antes de você emitir o comando adb shell tradeinmode testing start.

Esse comando só funciona em dispositivos com builds userdebug, eng ou user. A build user precisa ter ro=debuggable=1 definido.

teste de limpeza

adb shell tradeinmode testing wipe

Redefine o dispositivo para a configuração original.

Esse comando só funciona em dispositivos com builds userdebug, eng ou user. A build user precisa ter ro=debuggable=1 definido.

wait-until-ready

adb shell tradeinmode wait-until-ready

Aguarde até que os serviços do sistema estejam prontos para que o modo revenda possa funcionar totalmente. Use esse comando na sua automação para garantir que os comandos do modo revenda sejam bem-sucedidos.

Você pode adicionar wait-until-ready antes de outros comandos do modo revenda. Por exemplo, aqui está wait-until-ready encadeado a getstatus:

adb shell tradeinmode wait-until-ready getstatus