23 votes

Déterminer quelle application se dessine au-dessus des autres applications ?

Existe-t-il un moyen de déterminer quelle application s'affiche au-dessus d'autres applications ?

Par exemple, l'application Facebook Messenger peut dessiner les bulles de chat par-dessus tout, mais comment savoir quelle application fait cela ?

Mon problème :

J'ai une application qui affiche des publicités par-dessus tout et je veux savoir quelle application fait ça. Pas seulement pour la désinstaller, mais pour avertir tous ceux qui utilisent cette application. (Je n'ai pas installé d'application récemment et j'ai déjà vérifié les mises à jour récentes).

J'ai essayé d'utiliser le Dump View Hierarchy for UI Automator (en anglais) à partir d'Android Studio, mais il semble que les applications qui s'affichent au dessus ne peuvent pas être sélectionnées de cette façon.

(Cliquez sur l'image pour l'agrandir)

Android Studio Screen

0 votes

Juste pour ajouter aux problèmes notés dans les réponses ci-dessous (pour essayer de rester complet). Dans TouchWiz (Samsung Galaxy, le mien est le Note 4), désactiver le panneau de touches latérales a résolu ce problème pour moi.

0 votes

Pour les non-développeurs, il suffit de consulter ici la liste des applications : Android.stackexchange.com/questions/154274/

29voto

Firelord Points 23064

Note :

  • adb devrait déjà être configuré dans le PC.
  • Pour les systèmes Android antérieurs à la version 4.4.x, un accès Root peut être nécessaire.
  • Certaines commandes ne fonctionnent pas sur Android avant la version 5.1.
  • Sauter à la rubrique " Des applications pour des applications "si vous n'êtes pas familier ou mal à l'aise avec la ligne de commande et/ou si la ligne de commande ne résout pas votre problème.

Edit : couper court à la solution précédente et suivre uniquement cette section éditée.

Configuration adb et lancez cette commande :

adb shell "dumpsys window windows | toybox grep -i system_alert_window"

Vous obtiendrez la sortie de tous les superpositions actives sur l'écran. Exemple d'une sortie avec DU Screen Recorder, Tasker et AZ Screen Recorder montrant les superpositions actives à l'écran :

bash-4.3# adb shell "dumpsys window windows| toybox grep -i system\_alert\_window"
    mOwnerUid=10087 mShowToOwnerOnly=true package=**net.dinglisch.android.tasker** appop=SYSTEM\_ALERT\_WINDOW
    mOwnerUid=10604 mShowToOwnerOnly=true package=**com.hecorat.screenrecorder.free** appop=SYSTEM\_ALERT\_WINDOW
    mOwnerUid=10604 mShowToOwnerOnly=true package=com.hecorat.screenrecorder.free appop=SYSTEM\_ALERT\_WINDOW
    mOwnerUid=10649 mShowToOwnerOnly=true package=**com.duapps.recorder** appop=SYSTEM\_ALERT\_WINDOW
    mOwnerUid=10649 mShowToOwnerOnly=true package=com.duapps.recorder appop=SYSTEM\_ALERT\_WINDOW
    mOwnerUid=10604 mShowToOwnerOnly=true package=com.hecorat.screenrecorder.free appop=SYSTEM\_ALERT\_WINDOW
    mOwnerUid=10604 mShowToOwnerOnly=true package=com.hecorat.screenrecorder.free appop=SYSTEM\_ALERT\_WINDOW
    mOwnerUid=10638 mShowToOwnerOnly=true package=**ninja.sesame.app.edge** appop=SYSTEM\_ALERT\_WINDOW

Le texte en surbrillance à côté de paquet= et avant appop est le(s) nom(s) de paquet(s) de la (des) application(s) la superposition du dessin actuel sur l'écran. Dans votre cas, la sortie incluant le(s) nom(s) de paquet(s) serait différente.

Notez le(s) nom(s) de paquet (désormais PKG) et exécutez cette commande :

adb shell am force-stop PKG

Remplacer PKG avec le nom du paquet que vous avez noté. Si vous aviez plusieurs noms de paquets, répétez la commande avec un seul nom de paquet à la fois.

La commande arrêterait de force l'application et supprimerait ainsi la superposition. Cela devrait fonctionner. Vous pouvez également supprimer l'autorisation de "Dessiner sur d'autres applications" (superposition d'écran en bref) des applications en utilisant cette commande :

adb shell appops set PKG SYSTEM_ALERT_WINDOW ignore

Là encore, remplacez PKG par le nom du paquet si nécessaire. De plus, vous devrez peut-être répéter la commande force-stop pour le PKG. Si vous décidez de revenir sur les modifications, remplacez ignorer avec permettre dans le commandement susmentionné.

Vous pouvez également utiliser App Ops pour gérer les permissions à partir de l'interface graphique.

Pour savoir quel nom de paquet correspond à quelle application, vous pouvez essayer une application open source comme Informations sur les applications . Recherchez par nom de paquet et vous obtiendrez le nom de l'application.

Édition terminée

Vous avez vraiment besoin de ne plus lire maintenant . Je laisse la solution précédente (c'est-à-dire la section suivante) intacte parce que 21 personnes qui l'ont votée l'ont trouvée utile et je ne veux pas faire d'autres erreurs.


Un moyen simple serait de trouver toutes les applications ayant la permission de "dessiner sur d'autres applications", puis de les distinguer parmi celles qui sont actuellement actives sur l'écran. Ensuite, arrêtez de force ces applications communes jusqu'à ce que vous trouviez l'application responsable de la superposition active.

Enumérer les applications ayant l'autorisation de superposition

L'autorisation requise par une application pour créer une superposition est la suivante android.permission.SYSTEM_ALERT_WINDOW (dessiner sur d'autres applications).

Nous devons trouver toutes les applications installées qui ont cette permission. C'est à vous de trouver une méthode pour cela. Ma réponse aquí peut vous aider.

Nota que nous avons besoin des applications noms des paquets et non leurs étiquettes.

Choisir parmi les fenêtres actives

Exécuter la commande

adb shell dumpsys window windows 

Vous obtiendrez ainsi des détails sur ce qui a provoqué l'affichage de quelque chose à l'écran, y compris le nom du composant d'une application qui en est à l'origine.

La façon dont vous extrairez le nom vous appartient. Vous pouvez cependant essayer cette commande

adb shell 'dumpsys window windows | grep "Window #"'

Si vous recevez l'erreur : grep' n'est pas reconnu comme une commande interne ou externe sous Windows, essayez cette commande alternative :

adb shell "dumpsys window windows | grep 'Window #'"

Sortie démo

Window #4 Window{42065d50 u0 com.android.phone/com.mediatek.phone.UssdAlertActivity}:
Window #5 Window{42197468 u0 ginlemon.flowerpro/ginlemon.flower.HomeScreen}:
Window #6 Window{420fdb58 u0 com.android.systemui.ImageWallpaper}:
Window #7 Window{421e3b88 u0 com.android.contacts/com.android.contacts.activities.DialtactsActivity}:

Dans la sortie ci-dessus, tout ce qui succède à u0 et précédant / est le nom du paquet d'une application. Une application peut avoir plusieurs composants qui affichent quelque chose à l'écran.

Vous devez créer une liste de ces noms de paquets. Si vous avoir BusyBox installé vous pouvez faire

adb shell 'dumpsys window windows | grep "Window #" | sed -e "s/.*u0 //g" -e "s/\/.*//g" -e "s/}://g"'

De toute façon, vous auriez maintenant deux listes :

  • La première liste contient toutes les applications ayant la permission android.permission.SYSTEM_ALERT_WINDOW .
  • La deuxième liste contient toutes les applications qui affichent activement quelque chose à l'écran.

Comparez ces deux listes et identifiez les applications qui sont communes aux deux listes. Cette troisième liste serait constituée d'applications ayant la permission de dessiner une superposition et qui dessinent actuellement une superposition active à l'écran.

Le temps de tuer

Supprimez chacune des applications de la troisième liste une par une et remarquez l'état de la superposition. Vous pouvez utiliser am force-stop PACKAGE_NAME --user 0 ou toute autre méthode qui vous convient. PACKAGE_NAME est le nom du paquet de l'application.

EDITAR : Il n'est pas nécessaire de tuer une application. Vous pouvez envisager de refuser à l'application la permission de tirer sur d'autres applications. Utilisez cette commande :

adb shell 'appops set PACKAGE SYSTEM_ALERT_WINDOW deny'   # replace PACKAGE with package name of the app

Pour annuler les changements, remplacez refuser avec permettre dans ladite commande et l'exécuter.

Si vous utilisez Android Marshmallow, cette réponse par Andrew T. peut être utilisé.

Note : La commande susmentionnée a été testée avec succès sur Android 5.1.1 et 6.0.1 (CM builds). Il est aussi possible que la commande fonctionne sur Android 5.0.x mais Je ne peux pas garantir . Exécution de cette commande sur la version Android publié avant Lollipop provoquerait un échec.

Comme la surimpression est souvent perceptible, elle disparaîtrait instantanément dès que l'application qui la provoque serait tuée, ce qui vous permettrait de savoir quelle application est à l'origine de cette surimpression.

Des applications pour des applications

Comme suggéré à l'origine par Izzy, vous pouvez utiliser une application qui a la fonctionnalité de lister les permissions accordées aux applications installées, afin d'isoler les applications ayant la permission "dessiner sur les autres applications". Vous pouvez rechercher une telle application par vous-même ou utiliser la liste suivante Contrôleur de permission maintenu par Izzy sur son site web.

Vous aurez également besoin d'un gestionnaire de processus/applications pour forcer l'arrêt/la fermeture de certains processus. Je recommande Moniteur OS mais vous êtes libre d'utiliser n'importe quelle application compétente. Voir les applications connexes sous Informations sur le système .

À des fins de démonstration uniquement

J'ai essayé Gestionnaire de permissions avancé pour lister les applications ayant la permission de "dessiner sur d'autres applications". Ensuite, j'ai basculé vers OS Monitor pour voir les applications en cours d'exécution au premier plan et en arrière-plan. J'ai fait correspondre les résultats des deux applications et j'ai forcé l'arrêt des applications communes aux deux. Vous pouvez tuer un processus depuis l'OS Monitor, il n'est donc pas nécessaire de passer par les paramètres de l'application.

(Cliquez sur l'image pour l'agrandir)

IMG: IMG: IMG:

1 votes

Merci, la liste des fenêtres m'a sauvé la vie lorsque j'essayais de trouver une application adware qui semblait pouvoir dessiner sur tout... sans avoir la permission de "dessiner d'autres applications".

4voto

Andrew T. Points 12017

Si vous utilisez Android 6.0 Marshmallow, vous pouvez utiliser son gestionnaire de permissions natif.

De un article sur BGR ,

Android 6.0 Marshmallow comporte un grand nombre de nouvelles fonctionnalités très attendues et l'une d'entre elles est quelque chose que les utilisateurs d'iPhone ont depuis des années : Les autorisations d'applications granulaires. Phone Arena a installé la dernière version préliminaire de Marshmallow pour les développeurs et a publié quelques conseils fantastiques pour aider les utilisateurs d'Android à s'assurer qu'ils ne partagent des données qu'avec les applications qu'ils souhaitent spécifiquement partager.

Pour accéder à la fonction de gestion des permissions de Marshmallow, vous devez ouvrir le menu Paramètres, puis cliquer sur la section Apps. De là, cliquez sur l'icône de l'engrenage qui vous donnera ensuite l'option d'aller au gestionnaire de permissions des applications.

Pour obtenir la liste des applications qui peuvent dessiner par-dessus d'autres applications, rendez-vous à l'adresse suivante Paramètres - Apps - Avancé (menu avec icône en forme d'engrenage) - Dessiner sur d'autres apps .

Vous pouvez également activer/désactiver temporairement cette fonction en appuyant sur l'application et en basculant l'option "Autoriser le dessin sur d'autres applications".

Android M permission manager

Avec l'aimable autorisation de Sebastiano Gottardo sur Medium

1 votes

Pour moi, le menu avancé (avec l'icône en forme d'engrenage) était absent, mais à la place il se trouve en haut/à droite de l'icône en forme de point, puis ; app configurations.

3voto

mitchbw Points 41

Merci beaucoup @Firelord ! J'ai enfin trouvé l'application qui m'empêchait d'installer des apk's et d'effectuer des sauvegardes adb.

Pour moi, il s'agissait d'une application appelée Battery Mix Lisez la suite pour savoir ce que j'ai fait et comment je l'ai fait.

https://play.google.com/store/apps/details?id=jp.smapho.battery_mix

De nombreuses personnes ont eu des problèmes avec l'installation d'apk et l'impossibilité d'appuyer sur "Installer". Toutes les réponses que j'ai pu trouver étaient principalement liées à l'obscurcissement de l'écran, aux teintes, aux applications d'économie d'énergie. Comme je n'en utilisais aucune ou que j'avais supprimé toutes les applications similaires, j'ai eu du mal à trouver ce qui se passait et quelle application était le coupable. Et finalement ! Après une simple commande et une recherche rapide, le problème a été résolu :D

L'application incriminée Battery Mix est une application simple de surveillance de la batterie qui avait la fonction que j'utilisais pour afficher une fine ligne en haut de l'écran pour montrer l'état du niveau de la batterie (une petite application géniale).

Donc pour diagnostiquer, j'ai utilisé une commande de Firelord (ci-dessus) pour vider un fichier texte et rechercher l'application qui empêchait le système Android de cliquer sur le bouton Installer.

Exécuter la commande depuis le PC

adb shell dumpsys window windows > dumpsys-windows.txt

Recherche de

SYSTEM_ALERT_WINDOW

Pour trouver les applications incriminées, j'ai recherché la chaîne ci-dessus

Ce qui m'a donné la réplique :

mOwnerUid=10129 mShowToOwnerOnly=true package=jp.smapho.battery_mix appop=SYSTEM_ALERT_WINDOW

(Voir l'image à télécharger pour la section du fichier texte) enter image description here

J'ai immédiatement pu reconnaître l'application à laquelle il faisait référence : jp.smapho. mélange de batteries

Maintenant je sais qu'il faut tuer cette application quand je prévois de faire un sideload ou avant les sauvegardes adb.

0 votes

Et si la fenêtre d'alerte est affichée par com.android.systemui ? :) Mon Oukitel Y4800 (Android 9) refuse d'activer les services d'accessibilité à cause de cette fenêtre obscurcissante

-1voto

DILLIRAJ PD Points 9

Pour Android Marshmallow et Oxygen 3.0.2, désactivation de la fenêtre contextuelle de mise en page de l'écran.

Allez dans Apps et configurez les Apps et sélectionnez Draw plutôt que d'autres apps.

Allez et sélectionnez l'application pour la désactiver afin que l'application soit débloquée de la persmission de mise en page de l'écran. et l'application peut directement obtenir des permissions

Allez dans l'application respective et dans Permissions et activez les permissions que vous voulez.

Profitez de

Raj

2 votes

Toutes ces informations sont déjà dans la réponse d'Andrew T. Vous n'avez pas besoin de poster une nouvelle réponse pour répéter les mêmes instructions. Gardez vos efforts pour les questions qui n'ont pas encore reçu de réponse :-)

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X