Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Comandos de shell de dispositivo

Durante las pruebas de VTS, los comandos de shell se utilizan para ejecutar un binario de prueba del lado del objetivo, para obtener / establecer propiedades, variables de entorno e información del sistema, y ​​para iniciar / detener el marco de Android. Puede ejecutar comandos de shell de dispositivo VTS mediante el comando adb shell o el controlador de shell VTS que se ejecuta en el dispositivo (recomendado).

Usando el shell ADB

Las pruebas que requieren apagar el puerto USB o reiniciar el dispositivo durante la prueba deben usar el shell ADB ya que el controlador del shell VTS no está disponible sin una conexión USB persistente. Puede invocar el shell ADB desde el objeto AndroidDevice en el script de prueba de Python. Ejemplos:

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

Usando el controlador de shell VTS

El controlador de shell VTS es un agente binario que se ejecuta en el dispositivo y ejecuta comandos de shell. De forma predeterminada, VTS usa el controlador de shell si el controlador se ejecuta en el dispositivo porque este método tiene menos latencia que usar el comando de adb shell .

Figura 1. Controlador de shell VTS.

El marco VTS admite pruebas de dispositivos múltiples donde cada dispositivo Android se representa como un objeto AndroidDevice en el corredor base. De forma predeterminada, el marco VTS envía los archivos binarios del controlador del shell del VTS y del agente VTS a cada dispositivo Android y establece conexiones TCP con los agentes VTS en esos dispositivos.

Para ejecutar un comando de shell, la secuencia de comandos de Python del lado del host realiza una llamada de función al objeto ShellMirror dentro del objeto AndroidDevice. El objeto ShellMirror empaqueta los textos de comandos de shell en un mensaje protobuf y lo envía (a través del canal TCP) al agente VTS en el dispositivo Android. El agente que se ejecuta en el dispositivo reenvía el comando de shell al controlador de shell VTS a través del socket Unix.

Cuando el controlador de shell VTS recibe un comando de shell, ejecuta el comando a través de nohup en el shell del dispositivo para evitar que se cuelgue. Stdout, stderr y el código de retorno se recuperan de nohup y se envían de vuelta al agente VTS. Finalmente, el agente responde al host envolviendo los resultados del comando en un mensaje protobuf .

Ventajas

Las ventajas de utilizar el controlador de shell VTS en lugar de adb shell incluyen:

  • Fiabilidad. El controlador de shell VTS utiliza nohup para ejecutar comandos en la configuración predeterminada. Como las pruebas de VTS son en su mayoría pruebas de kernel y HAL de nivel inferior, nohup garantiza que los comandos de shell no se bloqueen durante la ejecución.
  • Rendimiento . Si bien el comando adb shell almacena en caché algunos resultados (como enumerar archivos en un directorio), tiene una sobrecarga de conexión cuando se realizan tareas como ejecutar un binario de prueba. El controlador de shell VTS mantiene una conexión activa durante la prueba, por lo que la única sobrecarga es la comunicación USB. En nuestras pruebas, usar el controlador de shell VTS para ejecutar un comando con 100 llamadas a un binario gtest vacío es aproximadamente un 20 por ciento más rápido que usar adb shell ; la diferencia real es mayor ya que la comunicación del shell VTS tiene un registro extenso.
  • Mantenimiento del estado . El controlador de shell VTS mantiene una sesión de terminal para cada nombre de terminal (el nombre de terminal predeterminado es el predeterminado ). Las variables de entorno establecidas en una sesión de terminal están disponibles solo para los comandos posteriores en la misma sesión.
  • Extensible . Las comunicaciones de comandos de shell entre el marco VTS y el controlador del dispositivo están envueltas en protobuf para permitir la posible compresión, comunicación remota, cifrado, etc. en el futuro. También están disponibles otras posibilidades para mejorar el rendimiento, incluido el análisis sintáctico de resultados del lado del dispositivo cuando la sobrecarga de comunicación es mayor que el análisis de cadenas de resultados.

Desventajas

Las desventajas de usar el controlador de shell VTS en lugar de adb shell incluyen:

  • Binarios adicionales . Los archivos del agente VTS deben enviarse al dispositivo y limpiarse después de la ejecución de la prueba.
  • Requiere conexión activa . Si la conexión TCP entre el host y el agente se pierde durante la prueba (debido a la desconexión del USB, el cierre del puerto, el bloqueo del dispositivo, etc.) ya sea intencionalmente o no, no se puede transmitir un comando de shell al agente VTS. Incluso con el cambio automático a adb shell , el resultado y el estado del comando antes de la desconexión serían desconocidos.

Ejemplos

Ejemplos de uso de comandos de shell en un script de prueba de Python del lado del host de VTS:

  • Obtener un objeto de dispositivo Android:
    self.device = self.android_devices[0]
    
  • Obtener un objeto de shell para el dispositivo seleccionado:
    self.shell = self.device.shell
    
  • Emita un comando de shell único:
    results = self.shell.Execute(‘ls')
    
  • Emita una lista de comandos de shell:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Objeto de resultado de comando

El objeto de retorno de la ejecución del comando de shell es un diccionario que contiene las claves stdouts , stderrs y return_codes . Independientemente de si el comando de shell se proporciona como una sola cadena o una lista de cadenas de comandos, cada valor del diccionario de resultados es siempre una lista.

Para verificar el código de retorno de una lista de comandos, el script de prueba debe verificar los índices. Ejemplo:

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

Alternativamente, el script puede verificar cada índice de comando individualmente. Ejemplo:

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