Actualmente estamos trabajando en un conjunto de pruebas de instrumentación que se ejecuta en nuestro servidor de compilación, pero mientras las pruebas pasan a un equipo de desarrollo usando un emulador normal de Android, las construcciones fallan en el servidor de compilación ya que solo ejecutamos un emulador sin -no-window
bandera.¿Cómo enviar eventos clave a un emulador sin cabeza en una prueba de instrumentación?
La falla se produce al intentar invocar el método InstrumentationTestCase.sendKeys()
para abrir el menú de opciones mediante programación. El error es:
Permiso denegado: inyectar evento clave de PID 646 uid 10026 para ventana Ventana {43d55100 pausa = false} propiedad de UID 1000
continuación, descubrimos que hay un permiso INJECT_EVENTS
, pero establecerlo en el manifiesto no tuvo ningún efecto. De hecho, en el registro que vimos esta salida:
No conceder permisos para empaquetar android.permission.INJECT_EVENTS com.qype.radar (ProtectionLevel = 2 banderas = 0x6644)
¿Eso significa que este permiso es inútil?
También intentamos que la aplicación de prueba de instrumentación y la aplicación bajo prueba compartan la misma ID de usuario de Linux usando android:sharedUserId
y se ejecuten en el mismo proceso (android:process
- no estábamos seguros si ese era el caso), pero Todavía no hay suerte.
¿Esto significa que actualmente es imposible ejecutar instrumentaciones que contengan eventos clave en un emulador sin cabeza, o nos falta algo?
'INJECT_EVENTS' es un permiso perfectamente válido, pero que solo puede ser retenido por firmware, no por aplicaciones SDK. – CommonsWare
bummer. Entonces, ¿cuál es nuestra mejor apuesta? ¿Google no pensó en ejecutar pruebas en un servidor de compilación? – Matthias
Acabo de reiniciar el emulador usando el indicador -wipe-data, luego la compilación pasó UNA VEZ, luego el emulador se colgó, lo reinicié nuevamente, ahora la compilación está fallando de nuevo ... todo esto es tan escamoso :-( – Matthias