Команды оболочки устройства

Во время тестирования VTS команды оболочки используются для выполнения тестового двоичного файла на целевой стороне, для получения/установки свойств, переменных среды и системной информации, а также для запуска/остановки платформы Android. Вы можете выполнять команды оболочки устройства VTS с помощью команды adb shell или драйвера оболочки VTS, запущенного на устройстве (рекомендуется).

Использовать оболочку ADB

В тестах, требующих отключения USB-порта или перезагрузки устройства во время тестирования, необходимо использовать оболочку ADB, поскольку оболочка VTS недоступна без постоянного USB-подключения. Вы можете вызвать оболочку ADB из объекта AndroidDevice в тестовом скрипте Python. Примеры:

  • Получите объект устройства Android:
    self.device = self.android_devices[0]
    
  • Выполните одну команду оболочки:
    result = self.device.adb.shell(‘ls')
    

Как использовать драйвер оболочки VTS

Драйвер оболочки VTS – это исполняемый файл агента, который работает на устройстве и выполняет команды оболочки. По умолчанию VTS использует драйвер оболочки, если он запущен на устройстве, поскольку этот метод имеет меньшую задержку, чем команда adb shell.

Рисунок 1. Драйвер оболочки VTS.

Платформа VTS поддерживает тестирование нескольких устройств, при котором каждое устройство Android представлено в базовом исполнителе как объект AndroidDevice. По умолчанию фреймворк VTS отправляет двоичные файлы агента VTS и драйвера оболочки VTS на каждое устройство Android и устанавливает TCP-подключения к агентам VTS на этих устройствах.

Чтобы выполнить команду оболочки, скрипт Python на стороне хоста вызывает функцию объекта ShellMirror внутри объекта AndroidDevice. Объект ShellMirror упаковывает тексты команд оболочки в сообщение protobuf и отправляет его (через канал TCP) агенту VTS на устройстве Android. Агент, работающий на устройстве, пересылает команду оболочки драйверу оболочки VTS через сокет Unix.

Когда драйвер оболочки VTS получает команду оболочки, он выполняет ее с помощью nohup в оболочке устройства, чтобы предотвратить зависание. Затем stdout, stderr и код возврата извлекаются из nohup и отправляются обратно агенту VTS. Наконец, агент отвечает хосту, помещая результаты команды в сообщение protobuf.

Преимущества

Преимущества использования драйвера оболочки VTS вместо adb shell:

  • Надежность. Драйвер оболочки VTS использует nohup для выполнения команд с настройками по умолчанию. Поскольку тесты VTS в основном проверяют HAL и ядро на низком уровне, nohup гарантирует, что команды оболочки не зависнут во время выполнения.
  • Эффективность. Хотя команда adb shell кеширует некоторые результаты (например, список файлов в каталоге), при выполнении таких задач, как запуск тестового двоичного файла, возникают накладные расходы на подключение. Драйвер оболочки VTS поддерживает активное подключение на протяжении всего тестирования, поэтому единственные накладные расходы связаны с обменом данными по USB. В ходе тестирования мы обнаружили, что использование драйвера оболочки VTS для выполнения команды со 100 вызовами пустого двоичного файла gtest примерно на 20 % быстрее, чем использование adb shell. Фактическая разница больше, поскольку связь с оболочкой VTS включает обширное ведение журнала.
  • Сохранение состояния. Драйвер оболочки VTS поддерживает сеанс терминала для каждого имени терминала (по умолчанию используется имя default). Переменные среды, заданные в одном сеансе терминала, доступны только для последующих команд в том же сеансе.
  • Расширяемость. Команды оболочки, передаваемые между фреймворком VTS и драйвером устройства, упаковываются в protobuf, чтобы в будущем можно было использовать сжатие, удаленное управление, шифрование и т. д. Также можно улучшить производительность другими способами, например анализировать результаты на стороне устройства, если затраты на передачу данных превышают затраты на анализ строки результата.

Недостатки

Недостатки использования драйвера оболочки VTS вместо adb shell:

  • Дополнительные двоичные файлы. Файлы агента VTS должны быть отправлены на устройство и удалены после выполнения теста.
  • Требуется активное подключение. Если во время тестирования TCP-соединение между хостом и агентом будет потеряно (из-за отключения USB-кабеля, закрытия порта, сбоя устройства и т. д.) намеренно или случайно, то команду оболочки нельзя будет передать агенту VTS. Даже при автоматическом переключении на adb shell результат и состояние команды до отключения будут неизвестны.

Примеры

Примеры использования команд оболочки в тестовом скрипте Python на стороне хоста VTS:

  • Получите объект устройства Android:
    self.device = self.android_devices[0]
    
  • Получите объект оболочки для выбранного устройства:
    self.shell = self.device.shell
    
  • Выполните одну команду оболочки:
    results = self.shell.Execute(‘ls')
    
  • Выполните список команд оболочки:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Объект результата команды

Объект, возвращаемый при выполнении команды оболочки, представляет собой словарь, содержащий ключи stdouts, stderrs и return_codes. Независимо от того, указана ли команда оболочки в виде одной строки или списка строк команд, каждое значение словаря результатов всегда является списком.

Чтобы проверить код возврата списка команд, тестовый скрипт должен проверить индексы. Пример:

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

Также скрипт может проверять каждый индекс команды по отдельности. Пример:

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