有没有办法确定哪个应用程序在其他应用程序之上绘制?例如,Facebook Messenger应用程序可以在所有内容上绘制聊天气泡,但是我怎么知道哪个应用程序正在执行此操作?

我的问题:

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

我尝试使用Android Studio中的UI Automator的Dump View层次结构,但似乎绘制的应用程序

(单击图像放大)



评论

只是添加到以下答案中指出的问题(以尝试使其完整)。在TouchWiz(三星Galaxy,我的笔记本是Note 4)中,关闭侧面键盘对我来说解决了这个问题。

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

#1 楼

注意:


adb应该已经在PC中设置。
对于低于版本4.4.x的Android,可能需要root访问权限。
某些命令不起作用在低于5.1版的Android上运行。
如果您对命令行不熟悉或不满意和/或命令行无法解决问题,请跳至标题“应用程序为应用程序”。


编辑:在较早的解决方案中减少追逐并仅遵循此编辑的部分。
设置adb并运行以下命令:
adb shell "dumpsys window windows | toybox grep -i system_alert_window"

您将获得所有活动目录的输出。叠加在屏幕上。带有DU Screen Recorder,Tasker和AZ Screen Recorder的输出示例显示了屏幕上的活动覆盖: s)当前在屏幕上绘制叠加层。在您的情况下,包含软件包名称的输出会有所不同。
记下软件包名称(此后称为PKG)并执行以下命令:
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

用以下命令替换PKG您记下的包装名称。如果您有多个软件包名称,请一次用一个软件包名称重复该命令。
该命令将强制停止应用程序,从而丢弃覆盖。这应该工作。您也可以使用以下命令从应用程序中剥夺“在其他应用程序上绘制”的权限(简称为屏幕覆盖):
adb shell am force-stop PKG

再次,根据需要用程序包名称替换PKG。此外,您可能必须对PKG重复执行强制停止命令。如果您决定恢复更改,请在上述命令中用allow替换ignore。
您也可以使用App Ops从GUI管理权限。
要知道哪个包名称对应于哪个应用,您可以尝试开源应用程序(如“应用程序信息”)。按程序包名称搜索,您将获得应用程序的名称。
编辑完成
您真的不需要再阅读了。我保留了较早的解决方案(即以下部分),因为21个投票的人确实找到了帮助,并且我不想再搞砸了。

一种简单的方法是找出所有具有“绘制其他应用程序”权限的应用程序,然后从屏幕上当前活动的应用程序中挑选出来。然后,强制停止这些常见的应用程序,直到您确定负责活动叠加层的应用程序。
枚举具有叠加层许可的应用程序
应用程序创建叠加层所需的权限为android.permission.SYSTEM_ALERT_WINDOW(绘制其他应用程序。)
我们需要找出所有具有上述权限的已安装应用程序。您需要自己找到一种方法。我在这里的答案可能会对您有所帮助。
请注意,我们需要应用程序的软件包名称而不是它们的标签。 >这将为您提供导致屏幕上显示某些内容的详细信息,包括引起该问题的应用程序的组件名称。
如何提取名称取决于您。但是,您可以尝试使用此命令
adb shell appops set PKG SYSTEM_ALERT_WINDOW ignore

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

演示输出
adb shell 'dumpsys window windows | grep "Window #"'

在上面的输出中,在u0 之后和在/之前的所有内容都是应用的程序包名称。一个应用程序可以具有多个在屏幕上显示内容的组件。
您必须创建这些包名称的列表。如果已安装BusyBox,则可以执行
adb shell "dumpsys window windows | grep 'Window #'"

,现在,您将拥有两个列表:

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

比较这两个列表,并找出两个列表中常见的应用程序。该第三列表将由具有绘制叠加层权限的应用组成,并且当前正在屏幕上绘制活动的叠加。
杀死时间
逐一杀死第三列表中的每个应用并注意其状态覆盖。您可以使用am force-stop PACKAGE_NAME --user 0或其他适合您的方法。 PACKAGE_NAME是应用程序的程序包名称。
编辑:没有必要终止应用程序。您可以考虑拒绝该应用绘制其他应用的权限。使用以下命令:
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}:

要还原更改,请在上述命令中将allow替换为allow并执行。
如果您运行的是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设置。
(单击图片放大)




评论


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

– andreroggeri
2015年11月3日23:29



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

–克雷格·林格(Craig Ringer)
16-10-23在12:35

#2 楼

如果您使用的是Android 6.0 Marshmallow,则可以使用其本机权限管理器。
从BGR上的文章中,

Android 6.0 Marshmallow具有许多备受期待的新功能,其中之一iPhone用户多年来拥有的东西:精细的应用程序权限。 Phone Arena安装了Marshmallow的最新开发人员预览版,并发布了一些绝妙的技巧,以帮助Android用户确保他们仅与自己要共享的应用共享数据。
要访问Marshmallow的权限管理功能,您需要打开“设置”菜单,然后单击“应用程序”部分。在此处,单击Gear图标,然后将为您提供转到应用程序权限管理器的选项。 (带有齿轮图标)-绘制其他应用程序。
您还可以通过点击应用程序临时启用/禁用该功能,然后切换“允许在其他应用程序上绘制图形”。塞巴斯蒂亚诺·戈塔多(Sebastiano Gottardo)在Medium上的

评论


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

–AnneTheAgile
17年7月10日在4:02

#3 楼

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

对我来说,我发现它是一个名为Battery Mix的应用程序,请继续阅读以了解我的工作方式和工作方式。

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

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

这给了我以下信息: br />(请参见上载图像以获取文本文件部分)


我立即可以识别出它所指的是哪个应用程序:jp.smapho.battery_mix

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

#4 楼

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

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

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

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

享受

拉吉

评论


所有这些信息已经在Andrew T的答案中了。您无需发布新答案即可重复相同的说明。尽力解决尚未解决的问题:-)

–丹·赫尔姆
16年6月9日在9:09