注意:
- adb应该已经在PC中设置了。
- 对于低于版本4.4.x的Android,可能需要root访问。
- 某些命令在版本5.1之前的Android上不起作用。
- 如果您不熟悉或不熟悉命令行和/或命令行无法解决问题,请跳至标题“ Apps for apps ”。
编辑:在较早的解决方案中进行追踪,仅遵循此编辑部分。
设置adb并运行以下命令:
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设置。
(点击图片放大)