Wir arbeiten gerade an einer Instrumentierungstest-Suite, die auf unserem Build-Server läuft, aber während die Tests einen Dev-Rechner mit einem normalen Android-Emulator weitergeben, scheitern die Builds auf dem Build-Server, da wir dort nur einen Headless-Emulator laufen haben das -no-window
-Flag.
Der Fehler tritt auf, wenn versucht wird, die Methode InstrumentationTestCase.sendKeys()
aufzurufen, um das Optionsmenü programmgesteuert zu öffnen. Der Fehler ist:
Berechtigung verweigert: Schlüsselereignis von pid 646 uid 10026 in Fenster window {43d55100 paused = false} im Besitz von uid 1000
Wir haben dann herausgefunden, dass es eine INJECT_EVENTS
-Erlaubnis gibt, aber die Einstellung im Manifest hatte keine Wirkung. Im Protokoll haben wir diese Ausgabe tatsächlich gesehen:
Erteilen der Berechtigung android.permission.INJECT_EVENTS für das Paket com.qype.radar (protectionLevel = 2 flags = 0x6644) nicht erteilt
Bedeutet das, dass diese Erlaubnis nutzlos ist?
Wir haben auch versucht, die Instrumentierungstest-App und die zu testende App die gleiche Linux-Benutzer-ID mit android:sharedUserId
teilen zu lassen und sie im selben Prozess laufen zu lassen ( android:process
- wir waren nicht sicher, ob das schon der Fall war) ), aber immer noch kein Glück.
Bedeutet das, dass es momentan unmöglich ist, Instrumentierungen auszuführen, die wichtige Ereignisse auf einem kopflosen Emulator enthalten, oder fehlt etwas?
Ich betreibe den Emulator ohne -no-window
auf Headless-Rechnern, indem ich zuerst eine Xvnc-Instanz (d. h. gefälschten X-Server) starte und dann den Emulator in diesem DISPLAY
starte.
Genauer gesagt, bekomme ich Xvnc und Android Emulator Jenkins Plugins, um dies für mich zu tun.
Leider ist das Entsperren des Bildschirms nach wie vor ein Problem, bevor UI-Ereignisse eingefügt werden. Dies wird jedoch (hacky) durch automatisches Ausführen eines Befehls wie diesem behoben (ähnlich wie bei diese andere Antwort, die Sie gesehen haben ):
echo "event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0" | nc -q1 localhost 5554
Bearbeiten:
Ich entdeckte, dass diese Methode viel zuverlässiger ist:
adb shell input keyevent 82
Einige Informationen zu Schlüsselcode 82.
Tags und Links android testing build-automation emulation instrumentation