【问题分析】放大镜影响权限弹窗接收事件【Android14】

2024-08-30 10:04

本文主要是介绍【问题分析】放大镜影响权限弹窗接收事件【Android14】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

1 问题描述

在这里插入图片描述

如图,打开google的放大镜功能,然后将该放大镜和权限弹窗部分重合,会发现权限弹窗的按钮如“Allow”,点击无响应。

顺便一提,如果放大镜和权限弹窗完全重合或者完全不重合,是没问题的。

2 问题分析

2.1 分析1

首先权限弹窗View层级结构为:

在这里插入图片描述

对应的按钮为“SecureButton”。

打开一些log开关,首先是正常的log:

在这里插入图片描述

MotionEvent传到“SecureButton”并且也被这个Buttion处理了。

再看异常log为:

在这里插入图片描述

这里的很多log信息都是MTK的log打印的,能知道的信息是,MotionEvent已经传到“SecureButton”了,但是“SecureButton”没有处理,最终处理MotionEvent的是一个父View,LinearLayout。

2.2 分析2

既然事件已经传到了SecureButton了,那么再看具体的View类处理MotionEvent的代码,View.dispatchTouchEvent:

在这里插入图片描述

很值得怀疑的一个点就是View.onFilterTouchEventForSecurity是不是拦截了MotionEvent发给onTouch以及onTouchEvent来处理事件,打个断点看看:

在这里插入图片描述

果然,这里的View.onFilterTouchEventForSecurity走进了“SecureButton”自己重写的onFilterTouchEventForSecurity方法中,并且返回了false,导致MotionEvent没有被“SecureButton”处理。

反编译apk看到“SecureButton”重写的onFilterTouchEventForSecurity方法为:

在这里插入图片描述

看下这里的MotionEvent的flag:

在这里插入图片描述

FLAG_WINDOW_IS_OBSCURED和FLAG_WINDOW_IS_PARTIALLY_OBSCURED都表示接收MotionEvent的窗口被另外一个位于它之上的可见窗口遮挡了,但是不同点的是:

1)、FLAG_WINDOW_IS_OBSCURED表示MotionEvent落在了被遮挡的区域。

2)、FLAG_WINDOW_IS_PARTIALLY_OBSCURED表示MotionEvent落在了被遮挡区域以外的区域,也就是没被遮挡的区域。

那么回头再看看异常的log,果然:

在这里插入图片描述

这里的MotionEvent的flag为0x2,那么也就是包含了FLAG_WINDOW_IS_PARTIALLY_OBSCURED这个flag,所以传入“SecureButton”自己重写的onFilterTouchEventForSecurity方法后会返回false。

2.3 分析3

最后看下FLAG_WINDOW_IS_PARTIALLY_OBSCURED这个flag是在哪里添加的。

在InputDispatcher.findTouchedWindowTargetsLocked:

在这里插入图片描述

如果InputDispatcher.isWindowObscuredLocked返回true,那么就表示找个窗口被遮挡,就要为找个窗口对应的WindowInfo添加WINDOW_IS_PARTIALLY_OBSCURED标志位。

在这里插入图片描述

这里的逻辑也比较简单,从上到下找能够遮挡当前Window的WindowInfoHandle,找到当前窗口的时候就结束。

根据我添加的log,看到遮挡的WindowInfoHandle为请求权限弹窗的那个界面窗口克隆出的窗口,被遮挡的自然就是权限弹窗:

在这里插入图片描述

符合我们dumpsys input的信息:

在这里插入图片描述

input大概示意图为:

在这里插入图片描述

1)、开启放大镜后,会为每一个Layer克隆一个Layer出来,并且这些克隆体的层级整体都比真身高。

2)、根据InputDispatcher.canBeObscuredBy的逻辑,如果WindowInfo包含以下信息,则不遮挡:

  • NOT_VISIBLE的窗口不遮挡。
  • NOT_TOUCHABLE的窗口不遮挡。
  • TRUSTED_OVERLAY的窗口不遮挡。
  • 相同uid的窗口不遮挡。
  • 相同token的窗口不遮挡。
  • 不同displayId的窗口不遮挡。

排除以上条件的WindowInfoHandle后,第一个遮挡的窗口就是申请权限弹窗的那个界面的窗口的克隆窗口。

但是pixel没有问题,查看信息后发现,pixel似乎对每一个克隆出来的InputWindowHandle都添加了TRUSTED_OVERLAY这个flag:

在这里插入图片描述

下一步需要继续查找这个差异。

2.4 分析4

搜索代码,查看为WindowInfo添加TRUSTED_OVERLAY的位置主要是两处:

1)、一个是旧的流程:在Layer.fillInputInfo中:

在这里插入图片描述

2)、一个是新的流程:在LayerSnapshotBuilder.updateInput中:

在这里插入图片描述

具体走哪个流程,则是和SurfaceFlinger.commit的以下逻辑有关,受SurfaceFlinger.mLayerLifecycleManagerEnabled的控制:

在这里插入图片描述

如果SurfaceFlinger.mLayerLifecycleManagerEnabled为true,那么走新流程,否则走旧流程。

从目前的信息来看:

1)、我们的Android14的机器走的是SurfaceFlinger的旧流程,有问题。

2)、Android14的pixel走的是SurfaceFlinger的新流程,没问题。

3)、我们的Android15的机器走的是SurfaceFlinger的新流程,没问题。

根据是SurfaceFlinger.dumpAll中,可以输出SurfaceFlinger.mLayerLifecycleManagerEnabled的值:

在这里插入图片描述

并且Android14的pixel的SF是有这个信息的:

在这里插入图片描述

而我们的机器则没有。

因此这个问题应该是原生问题。

2.5 小延伸一下

现在已经知道了权限弹窗没有办法响应MotionEvent是因为,它被请求权限弹窗的那个Activity的窗口的克隆窗口盖住了,即我们刚刚的示意图:

在这里插入图片描述

另外如我们最开始提到的,如果放大镜和权限弹窗完全重合或者完全不重合,是没问题的。

完全不重合没问题,这个很好理解,既然不重合了,那就不存在遮挡的情况了,那完全重合为啥也没问题呢?

打印了log后发现其实原理很简单,完全重合后,点击的区域就是权限弹窗的克隆窗口,这个克隆窗口同样也能接收事件,因此事件直接被权限弹窗的克隆窗口接收了:

在这里插入图片描述

这篇关于【问题分析】放大镜影响权限弹窗接收事件【Android14】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120511

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT