Permiso de EVENTOS de INYECCIÓN de Android


Estoy tratando de crear una aplicación que tendrá un servicio ejecutándose en segundo plano que será capaz de inyectar eventos de pantalla táctil en cualquier actividad que se esté ejecutando. Puedo inyectar eventos en una Actividad que es parte de mi aplicación llamando a Instrumentation.sendPointerSync(motionEvent); Sin embargo, si intento hacer esto sin una actividad de mi aplicación en ejecución, recibo un error de permiso que dice que no tengo el permiso INJECT_EVENTS. He añadido este permiso a mi manifiesto de esta manera: <uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission> Su sin embargo, sigue lanzando la misma excepción de permiso. Después de un poco de búsqueda, he recibido la respuesta de que para recibir el permiso INJECT_EVENTS, su aplicación debe estar firmada por la misma firma con la que está firmado el sistema. Sin embargo, no estoy claro qué significa exactamente esto. Voy a tener que encontrar una rom personalizada para construirla y firmarla con la misma firma con la que está firmada la aplicación. A continuación, instalar la rom personalizada en mi dispositivo, a continuación, instalar mi aplicación y voy a ser capaz de inyectar el tocar eventos correctamente? Si este es el caso, ¿estoy mejor comenzando con una rom personalizada que ya está lista, como una de esta página O es una situación en la que voy a necesitar tomar una copia de git del proyecto Android y construir todo el myslef? Y de cualquier manera, ¿alguien sabe de un lugar en el que puedas señalarme que me haga trabajar en la dirección correcta para hacer que esto suceda?

Author: FoamyGuy, 2011-03-21

6 answers

En realidad, esto es bastante simple en un dispositivo rooteado. Creo que cualquier aplicación que se está ejecutando fuera / sistema tendrá acceso a los permisos que requiere. Así que simplemente instale manualmente su aplicación en /system (como se describe aquí http://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html ):

Ejecute los siguientes comandos en el emulador de terminal para volver a montar el directorio /system como lectura/escritura e instalar la aplicación en el /system / app directorio de la tarjeta SD:

su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
cp /sdcard/APP.apk /system/app

Si prefiere usar adb desde su computadora, ejecute estos comandos:

adb remount
adb shell cp /sdcard/APP.apk /system/app

Varios usuarios han utilizado root explorer de Google marketplace para simplificar este proceso.


Alternativamente, echa un vistazo a esto: Cómo compilar la aplicación Android con permisos del sistema

 11
Author: Yossi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:00:28

Para inyectar eventos en un separado proceso, es necesario instalar su aplicación en /system/app y firmar su APK con el certificado del sistema.

1. Agregar permiso al manifiesto de la aplicación

<uses-permission android:name="android.permission.INJECT_EVENTS"/>

2. Firme su APK con el certificado del sistema

Esto requiere que tenga la fuente AOSP para construir un almacén de claves con las claves de Google utilizadas para construir el sistema que se ejecuta en el teléfono.

Dado que tiene un directorio AOSP, @Eli hace un excelente trabajo al mostrar cómo construir el almacén de claves usando un buen script llamado 'keytool-importkeypair'

Usando IntelliJ como ejemplo, elija Generar APK firmado.. desde el menú Construir. Busque el almacén de claves creado anteriormente, escriba la contraseña dada (por ejemplo, Android), dé a la clave la misma contraseña, si lo desea. Tenga en cuenta que el apk firmado se escribe en la raíz del proyecto (!) no a la ubicación típica (./out / production//).

3. Instalar en / system / app /

adb root
adb remount
adb push MyApp.apk /system/app

La 'instalación' ocurre automáticamente. Tenga en cuenta, sin embargo, que a diferencia del proceso normal de instalación de la aplicación, cualquier biblioteca nativa en su APK se no copiado en /system/lib/. Tendrá que hacerlo manualmente, si está utilizando el NDK para construir y llamar a sus propias bibliotecas nativas.

 17
Author: Brent Faust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-28 19:41:09

Usando Eventos Táctiles:

  1. Firme la aplicación con la misma firma con la que está firmada la ROM
  2. Descargar keytool-importkeypair para hacer esto
  3. Encuentra platform.pk8 + platform.x509.pem: {Android Source}/build/target/product/security
  4. Luego genera un certificado:

    ./keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform

  5. Ahora exporta tu app desde Eclipse y firma con el nuevo certificado que generaste

  6. Construir ROM, flashear al dispositivo, instalar app

Echa un vistazo http://code.google.com/p/android-event-injector /

 8
Author: wwjdm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 14:31:21

A partir de la API 18 existe la clase UIAutomation, que no está vinculada a los permisos de usuario.

Para más información ver http://developer.android.com/reference/android/app/Instrumentation.html#getUiAutomation()

 5
Author: Sergey Krasilnikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-03 12:10:51

En caso de que alguien esté buscando una solución para omitir este permiso de nivel de firma y desee crear eventos táctiles.

Miré el origen hasta el nivel de C++ donde en realidad se comprueba si permitir que la aplicación para crear eventos táctiles o no. La siguiente es la función que realmente comprueba si la aplicación debe ser permitida o no:

bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
return injectorUid == 0
        || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
}

Por lo que la función devuelve true del id de usuario de la aplicación se establece en 0.

Ahora cambié el uid si mi aplicación a 0 editando el archivo /data/system/packages.xml. Este archivo contiene el uid asignado a cada aplicación. Edite este archivo estableciendo el atributo userId correspondiente a su aplicación en 0.

Ahora todo lo que necesita es forzar el cierre de la aplicación y reiniciar de nuevo. Podrá omitir el permiso INJECT_EVENTS.

 4
Author: omerjerk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-29 11:18:34

Muy bien, tengo esto finalmente. Créanme cuando digo esto, esta es probablemente la peor solución si incluso se puede llamar así. Esto requiere raíz y deshabilitará la verificación de firma de todos los paquetes, en todo el sistema. Esto puede exponerte a un montón de ataques donde una aplicación peligrosa reemplaza a una normal.

De todos modos, con eso fuera del camino aquí vamos:

  1. Instalar Xposed
  2. Instalar el módulo XInstaller para Xposed
  3. En XInstaller opciones, vaya al menú llamado " Instalaciones "y marque la casilla que dice" Comprobación de firmas "y" Verificación de aplicaciones "

Usted debe ser bueno para ir después de un reinicio. Su aplicación ni siquiera tendrá que instalarse como sistema, ahora se puede ejecutar en el espacio de usuario, lo que supongo que hace que el desarrollo sea más fácil ya que ya no necesita copiar a /system/app

 -1
Author: Sirens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-28 03:15:42