Как отправить ключевые события в бездисплейный эмулятор в тесте инструментария?

Мы в настоящее время работаем над набором тестов инструментария, который работает на нашем сервере сборки, но в то время как тесты передают dev машину с помощью нормального эмулятора Android, сбоя сборок на сервере сборки с тех пор там, мы только выполняем бездисплейный эмулятор с -no-window флаг.

Отказ происходит при попытке вызвать InstrumentationTestCase.sendKeys() метод, чтобы программно открыть меню параметров. Ошибка:

Разрешение отклонило: введение ключевого события от pid 646 uid 10026 до окна Window {43d55100 paused=false} принадлежавший uid 1000

Мы затем узнали, что существует a INJECT_EVENTS разрешение, но установка его в декларации не имело никакого эффекта. На самом деле в журнале мы видели этот вывод:

Не предоставление разрешения android.permission. INJECT_EVENTS к пакету com.qype.radar (protectionLevel=2 flags=0x6644)

Это означает, что это разрешение бесполезно?

Мы также пытались позволить тестовому приложению инструментария, и приложение под тестом совместно используют то же идентификационное использование пользователя Linux android:sharedUserId и выполненный в том же процессе (android:process - мы не были уверены, имело ли это уже место), но все еще никакая удача.

Это означает, что в настоящее время невозможно выполнить инструментарии, которые содержат ключевые события на бездисплейном эмуляторе, или мы пропускаем что-то?

8
задан Vadim Kotov 24 July 2017 в 10:21
поделиться

2 ответа

У меня была аналогичная проблема с моим тестом на сервере Hudson. В моем случае проблему я решил предложением из Android SDK: http://developer.android.com/guide/topics/testing/testing_android.html#UITestTroubleshooting

Важно то, что мне пришлось включить разрешения и для основного приложения.

1
ответ дан 5 December 2019 в 09:24
поделиться

Я запускаю эмулятор без -no-window на безголовых машинах, сначала запуская экземпляр Xvnc (т.е. поддельный X-сервер), затем запуская эмулятор в этом DISPLAY.

Точнее говоря, я заставляю Xvnc и Android Emulator плагины Jenkins делать это за меня.

К сожалению, разблокировка экрана все еще является проблемой перед инъекцией событий пользовательского интерфейса, но это (хакерски) решается автоматическим выполнением команды, подобной этой (аналогично этому другому ответу, который вы видели):
echo "event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0" | nc -q1 localhost 5554


Edit:
Я обнаружил, что этот метод намного надежнее:
adb shell input keyevent 82

Некоторая информация о ключевом коде 82.

17
ответ дан 5 December 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: