Receber informações de integridade do sistema

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

  • 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 ou uma conta estabelecida.
  • O dispositivo precisa estar executando uma versão não depurável.

O modo de troca permite consultar informações básicas de diagnóstico ou entrar no modo de avaliação, que permite executar uma variedade 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 dados 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 de troca.

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

    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.

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 declaraçã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 de 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 de troca

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

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

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

    adb shell tradeinmode testing start

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

  3. Confira se o modo de troca está ativo:

    adb shell tradeinmode testing status

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

  4. Saia do modo de troca 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 receptor de transmissão 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 pulando 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 para configuração original vai ocorrer 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 alfanumérica de desafio 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 de bateria enquanto o dispositivo não está sendo testado ou avaliado ativamente.

reiniciar

adb shell tradeinmode reboot

Reinicializa o dispositivo.

início do teste

adb shell tradeinmode testing start

Reinicializa o dispositivo no modo de troca. Esse comando só funciona no assistente de configuração. Ao emitir esse comando, a autorização é ignorada e apenas os comandos do modo de troca 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 de troca 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 de troca possa funcionar totalmente. Use esse comando na sua automação para garantir que os comandos do modo de troca sejam bem-sucedidos.

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

adb shell tradeinmode wait-until-ready getstatus