Exécuter un service avec les privilèges de Root ou de l'ajout d'autorisations root
Je suis actuellement en train de développer une application qui lit les SMS/e-Mails pendant la conduite. De nombreux utilisateurs support souhaité pour WhatsApp /KakaoTalk.
Cependant, comme il n'est pas "officiel" de la façon de recevoir leurs messages, il n'y aurait que trois options, tous exigeant racine:
La façon la plus facile de la numérisation de leur base de données dans un intervall.
- Facile à mettre en œuvre.
- Cependant pas de batterie efficace
- Également les messages ne sont pas lus immédiatement.
Un autre moyen serait de lancer un service avec des droits root et enregistrer un récepteur qui est à l'écoute de leurs notifications push. Cela doit être fait avec de la racine, comme les deux paquets ont besoin d'une signature basée sur l'autorisation de recevoir leurs notifications push.
- Plus difficile à mettre en œuvre
- Meilleure expérience utilisateur
Aussi une autre chose est venu à mon esprit: Serait-il possible d'ajouter manuellement des autorisations à un APK après l'installation? Dans ce cas, je pourrais ajouter la c2dm autorisations à mon colis.
- Ce serait rendre les choses très facile
- Cependant, je suis un peu peur de mon changement d'application des autorisations, ce qui est totalement contre l'Android Sandbox principe.
- Encore, si il serait possible, faites le moi savoir!
Le problème est, comment exactement puis-je faire fonctionner un service avec des droits root (est-il réellement possible)? Je sais comment faire pour exécuter des commandes shell ou binaires avec la racine, mais je n'ai aucune idée de comment démarrer une partie d'un APK en tant que root.
Aussi, serait-il possible d'intégrer un BroadcastReceiver dans un fichier binaire? En fait, j'ai pas d'expérience avec C/C++, en particulier dans un environnement android.
Pouvez-vous m'aider?
Merci.
edit: Comme je l'ai dit dans le commentaire, je ne souhaitez pas utiliser un AccesibilityService, car il ne correspond pas à mes besoins (par exemple, il va me donner "2 messages non lus" si plus d'un est non lus, également de ne pas inclure l'ensemble du corps).
edit2: Juste pour clarifier les choses: je sais comment exécuter des commandes avec les privilèges root. Ce que j'ai besoin de savoir, c'est comment enregistrer un Broadcastreceiver, qui reçoit spécifiques émission "normal" récepteurs ne comprends pas que l'Émission elle-même exige une signature basée permission, je n'en ai pas.
OriginalL'auteur Force | 2012-02-03
Vous devez vous connecter pour publier un commentaire.
C'est loin d'être trivial, mais devrait fonctionner lorsque les applications que vous souhaitez contrôler à l'utilisation de bases de données sqlite ou, plus générique, écrire des messages dans un fichier quand ils arrivent.
Vous aurez en effet besoin d'avoir accès à la racine de l'appareil, car cela viole l'androïde de système de sécurité:
Écrire un natif processus qui s'exécute comme un démon avec le NDK et le frayer une fois après le démarrage en tant que root. Vous avez maintenant 3 problèmes majeurs à résoudre:
Comment savoir si quelque chose a changé?
C'est la partie facile. Vous devez utiliser le linux inotify interface qui doit être accessible sur tous les téléphones android comme le kit de développement a un FileObserver depuis API 1, de sorte que vous êtes sur le enregistrer côté d'ici.
Une autre chose intéressante peut-être pour prendre la C2DM messages. J'ai trouvé un NDK classe qui est appelée BroadcastReceiver, de sorte que le NDK peut être en mesure de les rattraper. Mais personnellement, je ne le ferais pas, il se sent mal à voler de ses intentions. Aussi, vous auriez à les redistribuer ou les laisser voyager au destinataire réel, donc je ne vais pas décrire en détail ici. Ça peut fonctionner, mais il peut être plus difficile et ne devrait être qu'une solution de repli.
Alors, quand vous avez résolu ce problème, le problème suivant se pose:
Comment lire les changements dans un enregistrer?
Vous avez un problème, un gros, ici. Le fichier ne vous appartient pas, vous n'avez même pas le droit de savoir où il est (normalement). Afin de surveiller l'application n'est pas conscient de vous et agira comme le fichier est exclusivement détenue par elle. Si ils utilisent un bon vieux fichier de texte pour écrire des messages, vous devez trouver un moyen de lire en toute sécurité car il peut être remplacé ou complété à tout moment. Mais vous pouvez avoir de la chance quand ils l'utilisation de sqlite, selon cette c'est tout à fait valable d'avoir plus d'une simultanée lecteur, qu'un seul écrivain. Nous sommes dans les specs, tout est rentré dans l'ordre. Lorsque vous avez lu aujourd'hui les nouvelles données, plus de problèmes à résoudre:
Comment obtenir les nouvelles données dans l'application principale?
Vous devriez le faire que le strict minimum dans ce programme c/c++ car il s'exécute en tant que root. Vous devez également protéger vos utilisateurs de l'application de violations de la sécurité, de sorte s'il vous plaît programme le démon avec cela à l'esprit. Je n'ai aucune idée réelle de ce qui pourrait fonctionner très bien, mais voici quelques-uns:
Comme indiqué dans le texte ci-dessus, veuillez faire attention lorsque vous écrivez ce démon que c'est un risque de sécurité. Aussi, il peut être difficile de le faire quand vous n'avez aucune connaissance en c/c++, et même si vous avez écrit des programmes simples, cela devrait être une tâche non triviale.
Sur ma recherche à travers le web, j'ai trouvé ce NDK des classes c++ je l'ai mentionné ci-dessus. Il peut être trouvé à google code. Je n'ai aucune expérience avec le NDK, ni avec le wrapper c++, mais il peut être vaut la peine un coup d'oeil quand vous envisagez d'écrire cela.
OriginalL'auteur Luminger
Force, je dois vous dire qu'une Android Service ne nécessite pas d'accès à la racine à la place de certaines actions(par exemple, d'Accéder, de Lire, d'Écrire des ressources du système) nécessite les droits Root. Chaque Android Service fourni dans le kit SDK d'Android peut être exécuté sans ACCÈS ROOT.
Vous pouvez effectuer les actions à exécuter avec les privilèges de root avec l'aide des commandes du shell.
J'ai créé une classe abstraite pour vous aider avec ce que
Étendre votre classe avec RootAccess ou de créer une instance de RootAccess classe et Substituer runCommandsWithRootAccess() la méthode.
Avez-vous essayé
adb push
:ing votre APK dans un enracinée & remontage de l'appareil dans lesystem/app
dossier & puis redémarrer l'appareil?Je voudrais changer le ci-dessus pour
rootBoolean = (process.waitFor() != 0) ? false : true;
comme enraciné dispositifs de retour à zéro et une pour les non-enracinée appareils.255
ne fonctionne pas dans toutes les situations. 🙂OriginalL'auteur Vivek
l'exécution de quelque chose en tant que root est pas la bonne façon de résoudre.
au lieu de cela, envisager une accessibilité service qui permet de regarder pour de nouvelles notifications:
AccessibilityEvent
OriginalL'auteur Jeff Sharkey
Il n'est pas possible d'exécuter un Service (ou de tout autre composant de l'application) en tant que root, si vous ciblez les inchangée, la non-enracinée appareils. Permettant pour que les mécanismes de sécurité dans Android inutile.
Il n'est pas possible de modifier les autorisations d'un fichier APK au moment de l'exécution. Les autorisations sont toujours acceptée ou rejetée à l'installation d'APK-temps. Veuillez vous référer à http://developer.android.com/guide/topics/security/security.html pour plus d'info sur le sujet.
Et, évidemment, le Guide du Développeur de ne pas donner des conseils sur la racine de choses liées, on ne peut donc pas se référer à elle comme une source valide.
Si vous ciblez les enracinée périphériques, vérifiez les accepté de répondre à stackoverflow.com/questions/5293615/... et en particulier le lien dans la réponse.
Veuillez lire l'ensemble de la question! J'ai déjà dit que je sais comment faire pour exécuter des commandes shell ou binaires avec la racine.
Je m'excuse si je ne comprends pas votre question, mais en suivant les ci-dessus, vous pouvez écrire un service qui s'exécute avec les droits root, ce qui semble être ce que vous voulez. Après avoir fait
Runtime.getRuntime().exec("su")
(et, éventuellement, en attente de la confirmation par l'utilisateur), le processus qui fait de l'appel sera exécuté avec les privilèges de root par la suite. En faisant l'appel dans le même processus de votre service, le service sera exécuté avec les privilèges de root. N'est-ce pas ce que vous voulez?OriginalL'auteur Martin Nordholts
"Ce que j'ai besoin de savoir, c'est comment enregistrer un Broadcastreceiver, qui reçoit spécifiques émission "normal" récepteurs ne comprends pas que l'Émission elle-même exige une signature basée permission, je n'en ai pas."
Vous ne pouvez pas. Période. Fin de l'histoire. Et merci à ghod.
Oui, si vous utilisez le plus effrayant dispositif enracinée installations d'avoir un peu de code exécuté en tant que root, vous pouvez, en théorie, faire ce que vous voulez. Dans la pratique, il peut être assez difficile à contourner cette restriction, et la plate-forme est souvent conçu pour être de cette façon. Vous aurez au moins besoin de retoucher l'état maintenu et/ou stockées par le gestionnaire de paquets, et sera probablement nécessaire de forcer l'utilisateur à redémarrer l'appareil pour obtenir les changements que vous faites en tant que root pour réellement avoir un impact. Et bien entendu, vous pouvez alors jouer avec interne profondément détails de mise en œuvre de la plate-forme, ce qui signifie la rupture de tous sur la place à travers les différentes versions de la plate-forme et les différentes construit à partir de différents fabricants.
OriginalL'auteur hackbod
vous pouvez utiliser
comme une commande shell pour accorder des autorisations supplémentaires à votre application.
Je pense que la commande a été ajouté très récemment, donc, si vous ciblez les anciennes versions, vous pouvez avoir à modifier directement l' 'packages.xml'.
Il est possible d'exécuter une application/dex fichier en tant que root avec la app_process de commande, mais je n'ai pas encore appris comment à obtenir un contexte valide (avec cela, vous pouvez utiliser le java.io.Fichier api pour accéder à tous les fichiers, mais non statique android méthodes comme bindService etc. va échouer parce que vous êtes en cours d'exécution sans une application de contexte).
Alors, comment devrions-nous faire pour ces autorisations?!
OriginalL'auteur user765269
Bien sûr, vous pouvez modifier les autorisations de vos applications. Si les autorisations sera modifié, l'utilisateur aura juste à mettre à jour manuellement l'application, et la nouvelle autorisation sera affichée à l'utilisateur. Mais je ne sais pas exactement comment l'évolution de votre application l'autorisation de vous aider dans la résolution de ce problème.
Une autre chose que je peux vous dire, c'est que vous ne pouvez pas exécuter un
Service
ou quoi queroot
, uniquement sur les appareils enracinées, et ce ne sera pas une tâche facile à la racine les appareils par le biais de votre application, et aussi il ne sera pas quelque chose que beaucoup d'utilisateur voudra.Comment êtes-vous en train d'accéder à la
SMS
?Si vous avez un
BroadcastReceiver
vous pouvez définir laMAX_PRIORITY
pour votrereceiver
et peut-être qu'il va intercepter les messages avant d'autres applications. Cela peut être fait comme suit:Vous pouvez également utiliser la
SMS Provider
, ce qui n'est pas public, mais peut-être que si vous interrogez à un intervalle donné cetteProvider
vous pouvez vérifier les nouveaux messages. Vous pouvez également jeter un oeil à ce fil : Android SMS Fournisseur si vous ne l'avez pas fait déjà.OriginalL'auteur Ovidiu Latcu