studio - Permiso de Android INJECT_EVENTS
request permission android (6)
Intento crear una aplicación que tenga un servicio ejecutándose en segundo plano que sea capaz de inyectar eventos de pantalla táctil en cualquier actividad que se esté ejecutando. Puedo insertar eventos en una actividad que es parte de mi aplicación llamando a Instrumentation.sendPointerSync(motionEvent);
Sin embargo, si trato de 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 agregado este permiso a mi manifiesto de esta manera: <uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>
Aún arroja la misma excepción de permiso. Después de buscar un poco, recibí la respuesta de que para recibir el permiso INJECT_EVENTS, su aplicación debe estar firmada por la misma firma con la que se firmó el sistema. No estoy claro, sin embargo, qué significa exactamente esto. Tendré que encontrar una ROM personalizada y compilarla y firmarla con la misma firma con la que se firmó la aplicación. Luego, instale la rom personalizada en mi dispositivo, luego instale mi aplicación y podré inyectar los eventos táctiles correctamente. Si este es el caso, es mejor que empiece con una rom personalizada que ya está lista, como una de esta página. O es una situación en la que voy a tener que tomar una copia de Git del proyecto de Android y construir todo myslef? Y de cualquier forma, ¿alguien sabe de un lugar donde podría señalarme que me ayudaría a trabajar en la dirección correcta para que esto suceda?
A partir de la API 18 existe la clase UiAutomation, que no está vinculada a los permisos del usuario.
Para obtener más información, consulte http://developer.android.com/reference/android/app/Instrumentation.html#getUiAutomation()
Bien, tengo esto finalmente. Créanme cuando digo esto, esta es probablemente la peor solución si pueden llamarla así. Esto requiere root y deshabilitará la verificación de firma de todos los paquetes, 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:
- Instalar Xposed
- Instalar el módulo XInstaller para Xposed
- En las opciones de XInstaller, vaya al menú llamado "Instalaciones" y marque la casilla "Comprobar firmas" y "Verificar aplicaciones"
Deberías ser bueno para ir después de un reinicio. Su aplicación ni siquiera necesitará instalarse como sistema, ahora se puede ejecutar en el espacio de usuario, lo que supongo que hace que sea más fácil desarrollarlo ya que ya no necesita copiarlo a / system / app.
En realidad, esto es bastante simple en un dispositivo rooteado. Creo que cualquier aplicación que se esté ejecutando / system obtendrá acceso a los permisos que requiera. 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 directorio / system / app desde el SDCARD:
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 el explorador de raíz del mercado de Google para simplificar este proceso.
Alternativamente, mira esto: Cómo compilar aplicaciones de Android con permisos del sistema
Para insertar eventos en un proceso separado , 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 tengas 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ú Compilar. Localice el almacén de claves creado arriba, escriba la contraseña dada (por ej., Android), proporcione a la clave la misma contraseña, si lo desea. Tenga en cuenta que la aplicación firmada se escribe en la raíz del proyecto (!) No en 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. Sin embargo, tenga en cuenta que, a diferencia del proceso normal de instalación de aplicaciones, las bibliotecas nativas de su APK no se copian en / system / lib /. Tendrá que hacer eso manualmente, si está utilizando el NDK para compilar y llamar a sus propias bibliotecas nativas.
Usando Touch Events:
- Firme la aplicación con la misma firma con la que está firmado el ROM
- Descargue keytool-importkeypair para hacer esto
- Encuentra platform.pk8 + platform.x509.pem: {Android Source} / build / target / product / security
Luego genera un certificado:
./keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
Ahora exporta tu aplicación desde Eclipse y firma con el nuevo certificado que has generado
- Construye ROM, flash en el dispositivo, instala la aplicación
En caso de que alguien esté buscando una solución para eludir este permiso de nivel de firma y desea crear eventos táctiles.
Miré la fuente hasta el nivel de C ++ donde realmente se verifica si permitir que la aplicación cree eventos táctiles o no. La siguiente es la función que realmente verifica si la aplicación debe permitirse o no:
bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
return injectorUid == 0
|| mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
}
Por lo tanto, la función devuelve verdadera de la identificación de usuario de la aplicación se establece en 0.
Ahora cambié el uid si mi aplicación está en 0 editando el archivo /data/system/packages.xml
. Este archivo contiene el uid asignado a cada aplicación. Edite este archivo configurando 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 nuevamente. Podrá omitir el permiso INJECT_EVENTS
.