Мы в настоящее время работаем над набором тестов инструментария, который работает на нашем сервере сборки, но в то время как тесты передают 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
- мы не были уверены, имело ли это уже место), но все еще никакая удача.
Это означает, что в настоящее время невозможно выполнить инструментарии, которые содержат ключевые события на бездисплейном эмуляторе, или мы пропускаем что-то?
У меня была аналогичная проблема с моим тестом на сервере Hudson. В моем случае проблему я решил предложением из Android SDK: http://developer.android.com/guide/topics/testing/testing_android.html#UITestTroubleshooting
Важно то, что мне пришлось включить разрешения и для основного приложения.
Я запускаю эмулятор без -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.