【问题分析】放大镜影响权限弹窗接收事件【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

相关文章

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首