Comandos do shell do dispositivo

Durante o teste do VTS, os comandos do 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 do Android. Você pode executar comandos de shell de dispositivo VTS usando o comando adb shell ou o driver de shell VTS em execução no dispositivo (recomendado).

Usando shell ADB

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 do Python. Exemplos:

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

Usando o driver de shell VTS

O driver de shell VTS é um agente binário que é executado no dispositivo e executa comandos de 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 de shell VTS.

A estrutura VTS oferece suporte a testes de vários dispositivos em que cada dispositivo Android é representado como um objeto AndroidDevice no runner base. Por padrão, a estrutura VTS envia os binários do agente VTS e do driver do 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 (através 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 travamento. 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 envolvendo o(s) resultado(s) do comando em uma mensagem protobuf .

Vantagens

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

  • Confiabilidade. O driver de shell VTS usa nohup para executar comandos na configuração padrão. Como os testes VTS são principalmente testes de HAL e kernel de nível inferior, nohup garante que os comandos do shell não sejam interrompidos durante a execução.
  • Desempenho . Enquanto o comando adb shell armazena 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 do 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 de shell VTS mantém uma sessão de terminal para cada nome de terminal (o nome padrão do terminal é 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 de shell entre a estrutura VTS e o driver de dispositivo são encapsuladas em protobuf para permitir compressão potencial, comunicação remota, criptografia, etc. no futuro. Outras possibilidades para melhorar o desempenho também estão disponíveis, incluindo a análise de resultado do lado do dispositivo quando a sobrecarga de comunicação se torna maior do que a análise da cadeia de caracteres de resultado.

Desvantagens

As desvantagens de usar o driver de 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 comutação 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 de shell:
    results = self.shell.Execute(‘ls')
    
  • Emita uma lista de comandos do shell:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Objeto de resultado do 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.')

Como alternativa, 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')