2010-07-09 10 views
8

Obecnie pracujemy nad pakietem testów oprzyrządowania, który działa na naszym serwerze budowania, ale podczas gdy testy przechodzą na maszynie programistycznej przy użyciu normalnego emulatora systemu Android, kompilacje kończą się niepowodzeniem na serwerze kompilacji, ponieważ uruchamiamy tylko emulator bezgłowy z Flaga -no-window.Jak wysłać kluczowe zdarzenia do bezgłowego emulatora w teście instrumentacji?

Awaria występuje podczas próby wywołania metody InstrumentationTestCase.sendKeys(), aby programowo otworzyć menu opcji. Błąd jest:

Permission denied: wstrzykiwanie kluczową imprezę z pid 646 uid 10026 do Window {43d55100 wstrzymane = false} własnością uid 1000

Następnie okazało się, że istnieje zgoda INJECT_EVENTS, ale ustawienie go w manifeście nie przyniosło efektu. W rzeczywistości w dzienniku widzieliśmy to wyjście:

nieprzyznania android.permission.INJECT_EVENTS uprawnienia do spakowania com.qype.radar (ProtectionLevel = 2 flags = 0x6644)

ma znaczyć to uprawnienie jest bezużyteczny?

Staraliśmy się również, aby aplikacja do testowania oprzyrządowania i testowana aplikacja miały ten sam identyfikator użytkownika Linuksa, używając android:sharedUserId i działały w tym samym procesie (android:process - nie byliśmy pewni, czy to już miało miejsce), ale wciąż nie ma szczęścia.

Czy to oznacza, że ​​obecnie nie można uruchamiać instrumentów, które zawierają kluczowe zdarzenia na bezgłowym emulatorze, czy coś nam brakuje?

+2

'INJECT_EVENTS' to całkowicie poprawne zezwolenie, ale takie, które może być przechowywane tylko przez oprogramowanie układowe, a nie przez aplikacje SDK. – CommonsWare

+0

bummer. więc jaki jest nasz najlepszy zakład? Czy Google nie pomyślał o uruchomieniu testów na serwerze kompilacji? – Matthias

+0

Właśnie zrestartowałem emulator za pomocą flagi -wipe-data, a następnie kompilacja przeszła na RAZ, następnie emulator się zawiesił, zrestartował ponownie, teraz kompilacja znów się nie udaje ... to wszystko jest tak kruche :-( – Matthias

Odpowiedz

1

Miałem podobny problem z moim testem na serwerze Hudson. W moim przypadku problem rozwiązałem za pomocą sugestii z Android SDK: http://developer.android.com/guide/topics/testing/testing_android.html#UITestTroubleshooting

Ważne było to, że musiałem włączyć uprawnienia dla głównej aplikacji.

+0

hej, świetnie, Wydaje nam się, że problemem jest właśnie blokada klawiatury - uniemożliwia to działanie sendKeys() – Matthias

+3

Jakie było rozwiązanie? Sekcja została usunięta z tej strony :( –

+1

Jeśli dobrze pamiętam, rozwiązanie było aby programowo wyłączyć blokadę klawiatury, ponieważ będzie ona aktywna po każdym uruchomieniu emulatora/telefonu.Zobacz ten fragment: http://pastebin.com/v0deQGpT Oczywiście będziesz chciał usunąć ten kod z aplikacji produkcyjnej, to wyłącza keyguard na stałe aż do następnego rozruchu – Matthias

17

Uruchamiam emulator bez -no-window na maszynach bezgłowych, uruchamiając najpierw instancję Xvnc (np. Fałszywy serwer X), a następnie uruchamiając emulator w tym DISPLAY.

Dokładniej, dostaję wtyczki Jenkins Xvnc i Android Emulator, aby zrobić to za mnie.

Niestety, odblokowywania ekranu jest wciąż obawa przed wstrzyknięciem zdarzenia UI, ale jest to (hackily) rozwiązane przez automatyczne uruchomienie polecenia takiego (podobnego do this other answer you've seen):
echo "event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0" | nc -q1 localhost 5554


Edycja :
odkryłem, że ta metoda jest o wiele bardziej wiarygodne:
adb shell input keyevent 82

Some info o kod 82.

+0

to brzmi naprawdę interesująco, sprawdzimy to, dzięki! – Matthias