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:
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 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 comotrue
, 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:
- 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 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.
Analise as informações de atestado usando um dos seguintes métodos:
- Use a ferramenta
parse_tim_attestation
que é criada quando você cria 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 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 ayes
, 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.
- Use a ferramenta
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:
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, é possível usar qualquer comando
adb shell tradein
.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.
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:
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>
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.
- Verifique se
persist.adb.tradeinmode
é2
. - Verifique se não há proteção contra redefinição de fábrica ou bloqueios antifurto.
- Provisione o dispositivo, garantindo que
Settings.Secure.USER_SETUP_COMPLETE
eSettings.Global.DEVICE_PROVISIONED
sejam1
. - 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