Comandos do shell do dispositivo

Durante o teste VTS, comandos shell são usados ​​para executar um binário de teste do lado do destino, para obter/definir propriedades, variáveis ​​de ambiente e informações do sistema, e para iniciar/parar a estrutura Android. Você pode executar comandos shell do dispositivo VTS usando o comando adb shell ou o driver shell VTS em execução no dispositivo (recomendado).

Usar shell ADB

Os testes que exigem o desligamento da porta USB ou a reinicialização do dispositivo durante o teste devem usar o shell ADB, pois o driver do shell VTS não está disponível sem uma conexão USB persistente. Você pode invocar o shell ADB do objeto AndroidDevice no script de teste Python. Exemplos:

  • Obtenha um objeto de dispositivo Android:
    self.device = self.android_devices[0]
    
  • Emita um único comando shell:
    result = self.device.adb.shell(‘ls')
    

Use o driver shell VTS

O driver shell VTS é um agente binário que é executado no dispositivo e executa comandos shell. Por padrão, o VTS usa o driver shell se o driver estiver sendo executado no dispositivo porque esse método tem menos latência do que usar o comando adb shell .

Figura 1. Driver shell VTS.

A estrutura VTS oferece suporte a testes de vários dispositivos, onde cada dispositivo Android é representado como um objeto AndroidDevice no executor base. Por padrão, a estrutura VTS envia binários do agente VTS e do driver shell VTS para cada dispositivo Android e estabelece conexões TCP com os agentes VTS nesses dispositivos.

Para executar um comando shell, o script Python do lado do host faz uma chamada de função para o objeto ShellMirror dentro do objeto AndroidDevice. O objeto ShellMirror empacota os textos do comando shell em uma mensagem protobuf e a envia (por meio do canal TCP) para o agente VTS no dispositivo Android. O agente em execução no dispositivo encaminha o comando shell para o driver shell VTS por meio do soquete Unix.

Quando o driver shell VTS recebe um comando shell, ele executa o comando via nohup no shell do dispositivo para evitar congelamento. Stdout, stderr e código de retorno são então recuperados do nohup e enviados de volta ao agente VTS. Finalmente, o agente responde ao host agrupando os resultados do comando em uma mensagem protobuf .

Vantagens

As vantagens de usar o driver shell VTS em vez do adb shell incluem:

  • Confiabilidade. O driver shell VTS usa nohup para executar comandos na configuração padrão. Como os testes VTS são em sua maioria testes HAL e de kernel de nível inferior, nohup garante que os comandos shell não travem durante a execução.
  • Desempenho . Embora o comando adb shell armazene em cache alguns resultados (como listar arquivos em um diretório), ele tem uma sobrecarga de conexão ao executar tarefas como executar um binário de teste. O driver shell VTS mantém uma conexão ativa durante todo o teste, portanto a única sobrecarga é a comunicação USB. Em nossos testes, usar o driver shell VTS para executar um comando com 100 chamadas para um binário gtest vazio é cerca de 20% mais rápido do que usar adb shell ; a diferença real é maior, pois a comunicação do shell VTS possui registro extensivo.
  • Manutenção do Estado . O driver shell VTS mantém uma sessão de terminal para cada nome de terminal (o nome do terminal padrão é default ). As variáveis ​​de ambiente definidas em uma sessão de terminal estão disponíveis apenas para comandos subsequentes na mesma sessão.
  • Extensível . As comunicações de comando Shell entre a estrutura VTS e o driver de dispositivo são agrupadas em protobuf para permitir possível compactação, comunicação remota, criptografia, etc. Outras possibilidades para melhorar o desempenho também estão disponíveis, incluindo a análise de resultados no lado do dispositivo quando a sobrecarga de comunicação se torna maior do que a análise da cadeia de resultados.

Desvantagens

As desvantagens de usar o driver shell VTS em vez do adb shell incluem:

  • Binários adicionais . Os arquivos do agente VTS devem ser enviados para o dispositivo e limpos após a execução do teste.
  • Requer conexão ativa . Se a conexão TCP entre o host e o agente for perdida durante o teste (devido à desconexão do USB, desligamento da porta, falha do dispositivo, etc.), intencionalmente ou não, um comando shell não poderá ser transmitido ao agente VTS. Mesmo com a mudança automática para adb shell , o resultado e o estado do comando antes da desconexão seriam desconhecidos.

Exemplos

Exemplos de uso de comandos shell em um script de teste Python do lado do host VTS:

  • Obtenha um objeto de dispositivo Android:
    self.device = self.android_devices[0]
    
  • Obtenha um objeto shell para o dispositivo selecionado:
    self.shell = self.device.shell
    
  • Emita um único comando shell:
    results = self.shell.Execute(‘ls')
    
  • Emita uma lista de comandos shell:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Objeto de resultado de comando

O objeto de retorno da execução do comando shell é um dicionário contendo as chaves stdouts , stderrs e return_codes . Independentemente de o comando shell ser fornecido como uma única string ou uma lista de strings de comando, cada valor do dicionário de resultados é sempre uma lista.

Para verificar o código de retorno de uma lista de comandos, o script de teste deve verificar os índices. Exemplo:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

Alternativamente, o script pode verificar cada índice de comando individualmente. Exemplo:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')