Receber informações de integridade do sistema

Quando um dispositivo com o Android 16 (ou mais recente) é inicializado, ele é colocado no modo de troca, que permite conectar ao dispositivo usando o adb e usar um comando para receber 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 um build não depurável.

Depois de navegar pelo assistente de configuração, o dispositivo é colocado no modo de avaliação, que permite executar uma gama completa de comandos adb e executar outros diagnósticos no dispositivo.

Coletar informações gerais de saúde

Para coletar informações gerais de integridade 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 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 abaixo 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á protegido 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 ele é 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 que contém um registro de atestado base64.

    Esse comando anexa informações de atestado às informações retornadas pelo comando getstatus. As informações de atestado são assim:

    "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 exigem conexão à Internet para criar um registro de atestado. A atestação precisa ser realizada no modo de avaliação, depois de configurar uma conexão, porque ela falha se for realizada 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 extrair 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.

    A conectividade de Internet é necessária para realizar atestados, tanto no dispositivo quanto no host.

Testar o modo de troca

Durante o desenvolvimento, teste o dispositivo para garantir que ele entre e saia corretamente do modo de troca. 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, é possível usar qualquer comando adb shell tradein.

  3. Verifique se o modo de troca está ativado:

    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 personalizado

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 personalizado do assistente de configuração:

  1. Declare um receiver 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 seguintes ações 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 antifurto.
  3. Provisione o dispositivo, garantindo que Settings.Secure.USER_SETUP_COMPLETE e Settings.Global.DEVICE_PROVISIONED sejam 1.
  4. Feche a atividade do assistente de configuração para que o dispositivo fique na tela inicial.

Referência do modo de troca

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

avaliar

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 pulada 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ê sai do modo de avaliação, uma redefinição para a configuração original ocorre para garantir que nenhum artefato do teste seja transferido acidentalmente para nenhum cliente.

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

Inclua o parâmetro --challenge seguido por uma chave de desafio alfanumérico gerada aleatoriamente para retornar um campo de atestado adicional. Analise essa resposta para identificar as principais informações 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

Reinicia o dispositivo.

início dos testes

adb shell tradeinmode testing start

Reinicia 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. O 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. O build user precisa ter ro=debuggable=1 definido.

parada de teste

adb shell tradeinmode testing stop

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

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

exclusão de teste

adb shell tradeinmode testing wipe

Redefinir o dispositivo para a configuração original.

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

wait-until-ready

adb shell tradeinmode wait-until-ready

Aguarda até que os serviços do sistema estejam prontos para que o modo de troca funcione totalmente. Use este comando na automação para garantir que os comandos do modo de troca sejam bem-sucedidos.

É possível 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