web-dev-qa-db-fra.com

Android INJECT_EVENTS permission

J'essaye de créer une application qui aura un service fonctionnant en arrière-plan qui sera capable d'injecter des événements d'écran tactile dans n'importe quelle activité en cours d'exécution. Je peux injecter des événements dans une activité qui fait partie de mon application en appelant Instrumentation.sendPointerSync(motionEvent); Cependant, si j'essaie de le faire sans qu'une activité de mon application ne s'exécute, j'obtiens une erreur d'autorisation indiquant que je n'ai pas l'autorisation INJECT_EVENTS. J'ai ajouté cette autorisation à mon manifeste comme ceci: <uses-permission Android:name="Android.permission.INJECT_EVENTS"></uses-permission> Il émet toujours la même exception d'autorisation cependant. Après un peu de recherche, j'ai obtenu la réponse selon laquelle pour recevoir l'autorisation INJECT_EVENTS, votre application doit être signée par la même signature que celle avec laquelle le système est signé. Je ne sais pas cependant ce que cela signifie exactement. Je vais devoir trouver une rom personnalisée pour la construire et la signer avec la même signature que celle avec laquelle l'application est signée. Ensuite, installez la rom personnalisée sur mon appareil, puis installez mon application et je pourrai injecter les événements tactiles correctement? Si tel est le cas, est-ce que je ferais mieux de commencer avec une rom personnalisée qui est déjà montée, comme une à partir de cette page Ou est-ce une situation où je vais avoir besoin de récupérer une copie git de la Android projetez et construisez tout cela moi-même? Et de toute façon, est-ce que quelqu'un connaît un endroit où vous pourriez me pointer qui me ferait travailler dans la bonne direction pour y arriver?

41
FoamyGuy

En fait, c'est assez simple sur un appareil rooté. Je pense que toute application en cours d'exécution/système aura accès aux autorisations dont elle a besoin. Il vous suffit donc d'installer manuellement votre application sur/system (comme décrit ici http://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html ) :

Exécutez les commandes suivantes dans l'émulateur de terminal pour remonter le répertoire/system en lecture/écriture et installer l'application dans le répertoire/system/app à partir de la SDCARD:

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

Si vous préférez utiliser adb depuis votre ordinateur, exécutez ces commandes:

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

Plusieurs utilisateurs ont utilisé l'explorateur racine du marché Google pour simplifier ce processus.


Sinon, vérifiez ceci: Comment compiler Android Application avec autorisations système

12
Yossi

Pour injecter des événements dans un processus séparé , il est nécessaire de les deux installent votre application dans/system/app et signez votre APK avec le certificat système.

1. Ajouter une autorisation au manifeste de l'application

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

2. Signez votre APK avec le certificat système

Cela nécessite que vous ayez la source AOSP afin de créer un magasin de clés avec les clés Google utilisées pour construire le système fonctionnant sur le téléphone.

Étant donné que vous avez un répertoire AOSP, @Eli fait un excellent travail pour montrer comment construire le magasin de clés en utilisant un script Nice appelé 'keytool-importkeypair'

En utilisant IntelliJ comme exemple, choisissez Generate Signed APK .. dans le menu Build. Localisez le magasin de clés créé ci-dessus, saisissez le mot de passe donné (par exemple, Android), donnez à la clé le même mot de passe, si vous le souhaitez. Notez que l'apk signé est écrit à la racine du projet (!) Et non à l'emplacement typique (./out/production//).

3. Installez dans/system/app /

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

L '"installation" se produit automatiquement. Notez cependant que contrairement au processus d'installation normal d'une application, toutes les bibliothèques natives de votre APK ne sont pas pas copiées dans/system/lib /. Vous devrez le faire manuellement, si vous utilisez le NDK pour créer et appeler vos propres bibliothèques natives.

18
Brent Faust

Utilisation des événements tactiles:

  1. Signez l'application avec la même signature que la ROM est signée avec
  2. Téléchargez keytool-importkeypair pour ce faire
  3. Recherchez platform.pk8 + platform.x509.pem: {Android Source}/build/target/product/security
  4. Générez ensuite un certificat:

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

  5. Maintenant, exportez votre application depuis Eclipse et signez avec le nouveau certificat que vous avez généré

  6. Créer une ROM, flasher sur l'appareil, installer l'application

Découvrez http://code.google.com/p/Android-event-injector/

8
wwjdm

À partir de l'API 18, il existe une classe UiAutomation, qui n'est pas liée aux autorisations des utilisateurs.

Pour plus d'informations, voir http://developer.Android.com/reference/Android/app/Instrumentation.html#getUiAutomation ()

6

Dans le cas où quelqu'un cherche une solution pour contourner cette autorisation au niveau de la signature et souhaite créer des événements tactiles.

J'ai regardé la source jusqu'au niveau C++ où il est effectivement vérifié si autoriser l'application à créer des événements tactiles ou non. Voici la fonction qui vérifie réellement si l'application doit être autorisée ou non:

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

Ainsi, la fonction renvoie vrai de l'ID utilisateur de l'application est défini sur 0.

Maintenant, j'ai changé l'uid de mon application en 0 en modifiant le fichier /data/system/packages.xml. Ce fichier contient l'uid attribué à chaque application. Modifiez ce fichier en définissant l'attribut userId correspondant à votre application sur 0.

Maintenant, tout ce dont vous avez besoin est de forcer la fermeture de l'application et de redémarrer à nouveau. Vous pourrez contourner le INJECT_EVENTS autorisation.

3
omerjerk