Detecção de dispositivos no Tradefed

Uma nova conexão de dispositivo aciona uma série de eventos assíncronos que ainda não são óbvios, mas que 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 pelo adb
  • deviceDisconnected: quando um dispositivo não está mais se comunicando com o adb
  • deviceChanged: quando ocorre um estado principal do dispositivo (como 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 arcabouço de testes, precisamos de um estado mais forte do que esse para garantir que um dispositivo esteja realmente pronto para iniciar a execução de testes. Ele não deve ser afetado por uma possível instabilidade de estado que pode ocorrer com um dispositivo conectado recentemente.

Esta é a sequência de eventos no Tradefed:

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

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

    • OFFLINE: o dispositivo será alternado para o estado CONNECTED_OFFLINE do Tradefed, que ainda não permite que ele execute testes. Se o dispositivo ficar on-line mais tarde, ele vai passar pelo ciclo ONLINE. Se recebermos um evento deviceDisconnect, o dispositivo será removido da lista.

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

  4. Se a verificação de availability for bem-sucedida, o dispositivo será marcado como disponível para alocação de testes 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. Portanto, é possível que um dispositivo desapareça de adb devices enquanto ainda está listado pelo Tradefed. Isso pode acontecer quando um teste está reinicializando 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 aciona a exibição do dispositivo em adb devices como <some ip>:<port number> e segue a mesma sequência dos dispositivos conectados fisicamente.

Rastreamento de dispositivos quando ocorre um evento deviceConnected

Quando deviceConnected ocorre, ddmlib cria uma nova referência IDevice para rastrear o dispositivo conectado recentemente.

O Tradefed usa essa referência e a envolve na própria implementação da interface de dispositivo interface ITestDevice para fornecer um serviço mais avançado. No entanto, 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).