确定哪个应用在其他应用之上?


21

有没有办法确定哪个应用程序在其他应用程序之上?

例如,Facebook Messenger应用程序可以在所有内容上绘制聊天气泡,但是我如何知道哪个应用程序在执行此操作?

我的问题:

我有一个应用程序可以在所有内容上绘制广告,我想知道哪个应用程序正在执行此操作。不仅是为了卸载它,而是警告所有使用此应用程序的人。(我最近没有安装任何应用程序,并且已经验证了最近的更新。)

我尝试从Android Studio 使用UI AutomatorDump View层次结构,但似乎无法以这种方式选择在顶部绘制的应用程序。

(点击图片放大)

Android Studio屏幕


只是为了增加以下答案中指出的问题(尝试使其完整)。在TouchWiz(三星Galaxy,我的笔记本是Note 4)中,关闭侧面按键板为我解决了此问题。
0xc0de

对于非开发人员,只需在此处查看应用列表即可:android.stackexchange.com/questions/154274/…–
Jonathan

Answers:


24

注意:

  • 应该已经在PC中设置了。
  • 对于低于版本4.4.x的Android,可能需要root访问。
  • 某些命令在版本5.1之前的Android上不起作用。
  • 如果您不熟悉或不熟悉命令行和/或命令行无法解决问题,请跳至标题“ Apps for apps ”。

编辑:在较早的解决方案中进行追踪,仅遵循此编辑部分。

设置并运行以下命令:

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

您将在屏幕上获得所有活动覆盖的输出。DU屏幕录像机,Tasker和AZ屏幕录像机的输出示例在屏幕上显示活动覆盖图:

bash-4.3#adb shell“ dumpsys窗口windows | toybox grep -i system_alert_window”
    mOwnerUid = 10087 mShowToOwnerOnly = true包= net.dinglisch.android.tasker appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true包= com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true包= com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10649 mShowToOwnerOnly = true包= com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10649 mShowToOwnerOnly = true包= com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true包= com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true包= com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10638 mShowToOwnerOnly = true包= ninja.sesame.app.edge appop = SYSTEM_ALERT_WINDOW

package =旁边和appop之前突出显示的文本是当前正在屏幕上绘制的应用程序的程序包名称。在您的情况下,包含软件包名称的输出将有所不同。

记下软件包名称(以下称为PKG)并执行以下命令:

adb shell am force-stop PKG

用记下的包装名称替换PKG。如果您有多个软件包名称,请一次重复一个软件包名称的命令。

该命令将强制停止应用程序,从而放弃覆盖。这应该工作。您也可以使用以下命令从应用程序中剥夺“在其他应用程序上绘制”的权限(简称为屏幕叠加):

adb shell appops set PKG SYSTEM_ALERT_WINDOW ignore

同样,根据需要用包装名称替换PKG。此外,您可能必须对PKG重复执行强制停止命令。如果您决定撤销这些修改,替换忽略允许在上述命令。

您也可以使用App Ops从GUI管理权限。

要知道哪个包名称与哪个应用程序相对应,您可以尝试使用“应用程序信息”之类的开源应用程序。通过程序包名称搜索,您将获得应用程序的名称。

编辑完成

现在真的不需要再阅读了。我保留了较早的解决方案(即以下部分),因为21个投票的人确实发现了这一帮助,并且我不想再搞乱了。


一种简单的方法是找出所有具有“覆盖其他应用程序”权限的应用程序,然后从屏幕上当前活动的应用程序中挑选出来。然后,强制停止这些通用应用程序,直到您确定负责活动叠加层的应用程序。

枚举具有覆盖权限的应用

应用创建叠加层所需的权限为android.permission.SYSTEM_ALERT_WINDOW(覆盖其他应用)。

我们需要找出所有具有上述权限的已安装应用。您需要自己找到一种方法。我的答案在这里可以帮助你。

请注意,我们需要应用程序的程序包名称,而不是它们的标签。

从活动窗口中摘樱桃

执行命令

adb shell dumpsys window windows 

这将为您提供有关导致屏幕上显示某些内容的详细信息,包括导致该屏幕显示的应用程序的组件名称。

如何提取名称取决于您。您可以尝试使用此命令

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

如果收到错误:'grep'不被识别为内部或外部命令,请在Windows上尝试以下替代命令:

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

演示输出

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

在上面的输出中,后继 u0 和前置的/都是应用程序的程序包名称。一个应用程序可以具有多个在屏幕上显示内容的组件。

您必须创建这些软件包名称的列表。如果您安装了BusyBox,则可以

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

无论如何,现在您将拥有两个列表:

  • 第一个列表包含所有具有权限的应用android.permission.SYSTEM_ALERT_WINDOW
  • 第二个列表包含所有主动在屏幕上显示内容的应用程序。

比较这两个列表,并找出两个列表中常见的应用程序。该第三列表由具有绘制覆盖图的权限的应用组成,并且当前正在屏幕上绘制活动覆盖图。

杀人时间

逐一杀死第三个列表中的每个应用程序,并注意覆盖状态。您可以使用am force-stop PACKAGE_NAME --user 0或任何其他适合您的方法。PACKAGE_NAME是应用程序的软件包名称。

编辑:没有必要杀死一个应用程序。您可以考虑拒绝该应用绘制其他应用的权限。使用以下命令:

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

恢复的变更,更换否认允许在所述命令并执行它。

如果您运行的是Android Marshmallow,则可以使用Andrew T.给出的答案

注意:上述命令已在Android 5.1.1和6.0.1(CM构建)上成功测试。该命令也有可能在Android 5.0.x上运行,但我不能保证在Lollipop之前发布的 Android版本上执行该命令可能会导致失败。

由于叠加层通常是可感知的,因此它会在导致该叠加层的应用程序被杀死时立即消失,因此,您将知道是哪个应用程序导致了该叠加层。

应用程式

最初由Izzy建议,您可以使用具有列出授予已安装应用程序权限的功能的应用程序,以挑选出具有“覆盖其他应用程序”权限的应用程序。您可以自己搜索此类应用,也可以使用Izzy在其网站上维护的列表权限检查器

您还需要一个流程/应用管理器来强制停止/杀死某些流程。我建议使用OS Monitor,但您可以自由使用任何称职的应用程序。请参阅“ 系统信息”下的相关应用程序。

仅用于演示目的

我尝试使用高级权限管理器列出具有“覆盖其他应用程序”权限的应用程序。之后,我切换到OS Monitor,以查看在前台和后台运行的应用程序。我匹配了两个应用程序的输出,并分别强制停止了这两个应用程序中常见的应用程序。您可以从OS Monitor内终止进程,因此无需切换到App设置。

(点击图片放大)

IMG: IMG: IMG:


1
非常感谢Firelord。我对你的帖子学到了很多东西!
andreroggeri 2015年

1
谢谢,当我试图找到一个似乎可以覆盖所有内容的广告软件应用程序时,该窗口列表是一个救命稻草……而无需“绘制其他应用程序”权限。
Craig Ringer

3

如果您使用的是Android 6.0棉花糖,则可以使用其本机权限管理器。

有关BGR的文章中

Android 6.0 Marshmallow具有许多备受期待的新功能,其中之一就是iPhone用户多年来使用的功能:粒度应用程序权限。Phone Arena安装了Marshmallow的最新开发人员预览版,并发布了一些绝妙的技巧,以帮助Android用户确保他们仅与自己要共享的应用共享数据。

要访问棉花糖的权限管理功能,您需要打开“设置”菜单,然后单击“应用程序”部分。从那里,单击Gear图标,然后将为您提供转到应用程序权限管理器的选项。

要列出可以覆盖其他应用程序的应用程序,请转到设置-应用程序-高级(带有齿轮图标的菜单)-覆盖其他应用程序

您还可以通过点按应用程序,然后切换“允许在其他应用程序上绘图”来临时启用/禁用该功能。

Android M权限管理器

图片由Sebastiano Gottardo在Medium上提供


1
对我而言,高级(带有齿轮图标的菜单)丢失了,但是它位于顶部/右侧的圆点图标,然后是; 应用程序配置。
AnneTheAgile

3

感谢一群@Firelord!我终于找到了阻止我安装apk并执行adb备份的应用程序。

对我来说,我发现它是一个名为Battery MixRead on 的应用程序,可以查看我的工作以及如何做。

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

许多人在安装apk时遇到问题,无法按“安装”。我能找到的所有答案主要是显示调光,着色,节能的应用程序。由于我未使用任何软件或已删除所有类似的应用程序,因此我一直在努力查找正在发生的事情以及哪个应用程序是罪魁祸首。最后!经过一个简单的命令和快速搜索,它已经解决了:D

令人反感的应用程序Battery Mix是一个简单的电池监控应用程序,它具有我用来在屏幕顶部显示一条细线以显示电池电量状态的功能(一个很棒的小应用程序)。

因此,为了进行诊断,我使用了Firelord(上图)中的命令来转储文本文件,然后搜索导致android系统阻止我单击该“安装”按钮的应用程序。

从PC执行命令

adb shell dumpsys window windows > dumpsys-windows.txt

搜索

SYSTEM_ALERT_WINDOW

要查找任何有问题的应用程序,我在上面的字符串中进行了搜索

这给了我电话:

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

(有关文本文件部分,请参见图像上传) 在此处输入图片说明

立即我就能知道它指的是哪个应用程序:jp.smapho。battery_mix

所以现在我知道每当我打算侧载或在adb备份之前杀死该应用程序。


-1

对于Android棉花糖和Oxygen 3.0.2,禁用屏幕布局弹出窗口

转到应用并配置应用,然后选择在其他应用上绘制。

转到并选择该应用程序以将其禁用,以便该应用程序不受屏幕布局权限的限制。该应用程序可以直接获取权限

转到相应的应用和权限,然后启用所需的权限。

请享用

拉吉


2
所有这些信息已经在Andrew T的答案中了。您无需发布新答案即可重复相同的说明。尽力解决尚未解决的问题:-)
Dan Hulme
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.