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:
Confira se o dispositivo atende aos pré-requisitos para o modo de troca.
Conecte o dispositivo a uma estação de trabalho.
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 comotrue
, 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:
- Conecte o dispositivo a uma estação de trabalho.
- Verifique se o dispositivo tem conectividade com a Internet.
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.
Analise as informações de atestado usando um dos seguintes métodos:
- Use a ferramenta
parse_tim_attestation
criada ao criar o AOSP. - Use uma biblioteca de atestado de chave do Android.
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 ayes
, 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.
- Use a ferramenta
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:
Conecte o dispositivo a uma estação de trabalho.
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
.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.
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:
Declare um receptor no manifesto do 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>a
tegory.DEFAULT" / /intent-filter /receiverCrie 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 activ
ity. } }
O receptor precisa realizar as ações a seguir em ordem.
- Verifique se
persist.adb.tradeinmode
é2
. - Verifique se não há proteção contra redefinição de fábrica ou bloqueios antirroubo.
- Provisione o dispositivo e verifique se
Settings.Secure.USER_SETUP_COMPLETE
eSettings.Global.DEVICE_PROVISIONED
são1
. - 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