Wie senden Sie wichtige Ereignisse an einen Headless-Emulator in einem Instrumentierungstest?

8

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?

    
Matthias 09.07.2010, 16:15
quelle

2 Antworten

1

Ich hatte ein ähnliches Problem mit meinem Test auf dem Hudson-Server. In meinem Fall habe ich das Problem auf Vorschlag des Android SDK gelöst: Ссылка

Wichtig war, dass ich auch Berechtigungen für die Hauptanwendung aktivieren musste.

    
hsd 22.07.2010, 07:29
quelle
17

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.

    
Christopher Orr 29.07.2010 19:56
quelle