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

news2024/11/16 1:35:38

在这里插入图片描述

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

create-react-app 移除 ESLint 语法检查

ESLint 的作用: ESLint 是一个流行的 JavaScript 代码静态检查工具,旨在帮助开发者识别和修复代码中的问题。以下是关于 ESLint 的一些关键信息: 主要功能: 1.代码风格检查:ESLint 可以检查代码是否符合特定的编码风…

基于STM32开发的智能农业监测与控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集与处理自动灌溉与环境控制数据融合与决策算法OLED显示与状态提示Wi-Fi通信与远程监控应用场景 温室环境的智能监控与自动化控制农田土壤与作物生长的实时监测常见问题…

2017年系统架构师案例分析试题四

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(9 分) 【问题 3】(7 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于数据库设计的叙述,在答题纸上回答问题 1 至问题 3。 【题目】 某制造企业为拓展网上销售业…

强化学习,第 6 部分:n 步 Bootstrapping

一、介绍 1.1 概述 R强化学习是机器学习中的一个领域,它引入了智能体在复杂环境中学习最佳策略的概念。代理从其操作中学习,从而根据环境的状态获得奖励。强化学习是一个具有挑战性的话题,与机器学习的其他领域有很大不同。 强化学习的显着…

Linux--实现U盘,SD卡的自动挂载

1. 编辑/etc/init.d/rsC或S10mdev文件 在/etc/init.d/rsC或S10mdev中加入以下语句: echo /sbin/mdev > /proc/sys/kernel/hotplug 当有热插拔事件产生时,内核会调用/proc/sys/kernel/hotplug文件里指定的应用程序来处理热插拔事件。把/sbin/mdev写…

数据结构---双向链表---循环链表---栈

目录 一、双向链表 1.1.创建双向链表 1.2.头插法 1.3.尾插法 1.4.查询节点 1.5.修改节点 1.6.删除节点 1.7.打印节点 1.8.销毁链表 二、循环链表 2.1.单循环链表 2.2.双循环链表 三、栈 3.1.顺序栈 1.创建栈 2.判断栈是否满 3.判断栈是否为空 4.进栈 5.出栈…

深度解读SGM41511电源管理芯片I2C通讯协议REG0A寄存器解释

REG0A 是 SGM41511 的第十一个寄存器,地址为 0x0A。这个寄存器包含了只读(R)和可读写(R/W)的位。上电复位值(PORV)为 xxxxxx00,其中 x 表示不确定的初始状态。这个寄存器提供了充电器…

microsoft微软excel或WPS表格打开vivado逻辑分析仪ILA保存的csv文件,自动转换科学计数法损失精度的bug

问题 vivado的逻辑分析仪ILA,可以方便的把数据导出成CSV(Comma-Separated Values)文件,实际是逗号作为分隔符的数据文件。 导出数据文件用文本编辑器打开,第74行有如下数据: 但是使用excel打开这个csv文件,则这个数…

基于Python的机器学习系列(15):AdaBoost算法

简介 AdaBoost(Adaptive Boosting)是一种提升(Boosting)算法,旨在通过组合多个弱分类器来提高整体模型的性能。AdaBoost的核心思想是通过加权结合多个表现较弱的分类器(通常是深度为1的决策树,称…

Spring Boot Web开发实践:响应参数的使用方法、IOC、DI和Bean基本介绍

主要介绍了SpringBootWeb响应参数的基本使用和spring框架的控制反转(IOC)和依赖注入(DI)以及Bean对象的声明、扫描、注入!!! 目录 前言 响应参数 分层解耦 三层架构 分层解耦 IOC & …

MVC与设计模式理解-lnmp学习之路

一、MVC 前言: MVC是一种应用架构模式,也可以说是一种业务架构或是一种应用设计思想,用于组织业务逻辑并分离代码的。 MVC组成结构是Model-View-Controller,Model是管控数据层,View是管控视图层,Controlle…

【Unity-UGUI组件拓展】| ContentSizeFitter 组件拓展,支持设置最大宽高值

🎬【Unity-UGUI组件拓展】| ContentSizeFitter 组件拓展,支持设置最大宽高值一、组件介绍二、组件拓展方法三、完整代码💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲…

图新地球桌面端-给地块贴纹理都是正北方向如何调整

0序 有部分做农保、农业管理的客户,需要结合GIS做一些方案效果,有时候会直接把面对象贴上作物类型的纹理,看上去会比纯色块更好看一些。而又不需要去做复杂的人工建模。 本文的重点是对导入的纹理进行角度调整,让纹理和地块的方向…

UE5开发——射击游戏

1. 枪支拾取动画 创建Text Block 编译保存 在h文件写入 &#xff0c;属性 private:UPROPETY(VisibleAnywhere, Category "Weapon Properties")class UWidgetComponent* PickupWidget; 先写这个&#xff1a; CreateDefaultSubobject<UWidgetComponent>(TEXT(…

JavaWeb——介绍(什么是Web、Web网站的开发模式)、初始Web前端(Web标准、学习内容)

目录 介绍 什么是Web Web网站的开发模式 初识Web前端 Web标准 学习内容 介绍 JavaWeb学习路线 &#xff08;仅用作参考&#xff09; 什么是Web Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;www World Wide Web)&#xff0c;能够通过浏览器访问的…

数据结构之内核链表,栈,队列

今天主要学习了内核链表&#xff0c;顺序栈&#xff0c;链式栈&#xff0c;顺序队列&#xff0c;链式队列的相关内容。 一.内核链表 内核链表和之前的单向&#xff0c;双向链表有所不同的是内核链表的结构是数据包含节点&#xff0c;特点如下&#xff1a; 1.一种链表结构能够操…

系统架构设计师——系统工程学

概述. 系统工程是一种跨学科的方法论&#xff0c;旨在通过系统方法组织管理技术来实现系统的规划、研究、设计、制造、试验和使用。它的核心在于从整体的角度出发&#xff0c;合理地开发、设计、实施和运用系统科学和技术&#xff0c;确保系统能够成功地实现其预定目的。以下是…

适用于车队管理和试验验证的数据记录仪-IPE853

IPE853是一款可扩展的数据记录仪&#xff0c;支持整车质量保证中的各项测量任务。它具有CAN/CAN FD、LIN、以太网等众多测量输入接口&#xff0c;并支持CCP/XCPonCAN、XCPonETH、J1939、OBD、WWH-OBD、KWPonCAN、UDS/ODX/PDX和CAN-send等多种协议&#xff0c;因此其可轻松访问汽…

vscode在html中的使用

目录 一、安装插件二、通过live Server 小型服务器运行项目三、其他常见设置 一、安装插件 ● Auto Rename Tag 自动修改标签对插件 ● Chinese Language Pack 汉化包 ● HTML CSS Support HTML CSS 支持 ● Intellij IDEA Keybindings IDEA快捷键支持 ● Live Server 实时加载…

解决线程中使用线程锁

问题&#xff1a;多线程操作同一个对象&#xff0c;利用锁保证数据操作的原子性 解决方案&#xff1a;使用线程锁 简要说明&#xff1a;线程锁本质上就是添加一个公共状态量&#xff0c;当线程拿到状态量后&#xff0c;则继续执行&#xff0c;否则就等待 扩展1&#xff1a;自…