Detecção de dispositivos no Tradefed

Uma nova conexão de dispositivo aciona uma série de eventos assíncronos que não são óbvios, mas vale a pena entender.

Conectado fisicamente

O Tradefed usa a biblioteca ddmlib (uma biblioteca Java adb) para fornecer a interação básica com adb e dispositivos. Parte dessa solução é a interface IDeviceChangeListener que permite o recebimento de novos eventos de dispositivo, como:

  • deviceConnected: quando um novo dispositivo é detectado por adb
  • deviceDisconnected: quando um dispositivo não envia mais relatórios para o adb
  • deviceChanged: quando ocorre um estado importante do dispositivo, como ficar off-line ou on-line.

Esses eventos são suficientes no nível adb para decidir se um dispositivo está conectado, on-line ou off-line. No entanto, para o ambiente de teste, precisamos de um estado mais forte do que esse para garantir que um dispositivo esteja realmente pronto para começar a executar testes. Ele não pode ser afetado por uma possível instabilidade de estado que pode surgir com um dispositivo recém-conectado.

Esta é a sequência de eventos no Tradefed:

  1. O dispositivo é reconhecido como deviceConnected e está aberto a eventos regulares de adb
  2. Um evento interno do Tradefed é criado para:

    • Verifique se o dispositivo já é conhecido. O Tradefed mantém uma referência interna a alguns dispositivos (principalmente o que está alocado e executando testes) para evitar que o TF perca o controle deles aleatoriamente.
    • Verifique se o dispositivo é ONLINE ou OFFLINE.
  3. Se o dispositivo for:

    • OFFLINE: o dispositivo será alternado para o estado CONNECTED_OFFLINE do Tradefed, que ainda não permite a execução de testes. Se o dispositivo ficar on-line depois, ele vai passar pelo ciclo de ONLINE. Se um evento deviceDisconnect for recebido, o dispositivo será removido da lista.

    • ONLINE (como visto pelo adb): o dispositivo será colocado no estado CONNECTED_ONLINE e terá a disponibilidade verificada para alocação de teste: checking_availability.

  4. Se a verificação availability for bem-sucedida, o dispositivo será marcado como disponível para alocação de teste e poderá executar testes. Caso contrário, o dispositivo será marcado como unavailable para alocação e não poderá receber testes.

Todos esses estados são refletidos no console do Tradefed ao listar os dispositivos usando: tf> list devices

É importante observar que, quando o dispositivo está alocado para um teste, a maioria das ações acima não ocorre, e o Tradefed determina o estado do dispositivo internamente. Por isso, é possível que um dispositivo desapareça do adb devices, mas ainda seja listado pelo Tradefed. Isso pode acontecer quando um teste está reiniciando o dispositivo, por exemplo.

Dispositivo virtual conectado com adb connect

Quando um dispositivo virtual remoto é criado, o Tradefed se conecta a ele usando adb connect. Isso geralmente faz com que o dispositivo apareça em adb devices como <some ip>:<port number> e siga a mesma sequência dos dispositivos conectados fisicamente.

Rastreamento de dispositivos quando um evento deviceConnected ocorre

Quando deviceConnected ocorre, ddmlib cria uma nova referência IDevice para rastrear o dispositivo recém-conectado.

O Tradefed usa essa referência e a envolve na própria implementação da interface do dispositivo ITestDevice para oferecer um serviço mais avançado. Mas o IDevice subjacente é sempre o que vem de ddmlib.

Isso significa que, se um novo dispositivo for conectado, um novo ITestDevice será criado e associado ao IDevice. Quando isso acontece durante uma invocação e o ITestDevice está sendo usado, o IDevice subjacente ainda é substituído para que o teste possa prosseguir na referência adequada. Isso é feito de maneira integrada sempre que um dispositivo é desconectado/reconectado (por exemplo, durante uma reinicialização).