ActivityRecordInputSink深入剖析全网独家分析

Android四大组件之Activity(三)—— Activity启动中涉及到的重要的数据结构,ActivityRecord等 1、使用的是Android 7.1.2的源代码: https://pan.baidu.com/s/1XcVD68cC_2wKtm8jJkdNQA przv 2、感谢IT先森的系列博客: Android应用进程创建流程大揭秘 Android四大组件之bindService源码实现详解 Android四大组件之Activity启动流程源码实现详解概要 Activity启动流程(一)发起端进程请求启动目标Activity Activity启动流程(二)system_server进程处理启动Activity请 阅读详情
AI摘要

文章探讨了ActivityRecordInputSink在Android框架中的角色,它如何捕获穿透Activity的触摸事件,以及在Activity窗口大小小于屏幕时其重要性。通过代码示例和gitlog分析,解释了该图层在不同场景下的行为和功能限制。,

背景:

学员粉丝朋友们在学习马哥的android framework实战高级课程时候,有一些细心的学员提出了一个无问题,那就是再看dumpsys SurfaceFlinger的图层或者是dumpsys input相关信息时候发现了一个叫做ActivityRecordInputSink的图层。

如下图所示:
dumpsys input可以看到一个ActivityRecordInputSink在Activity的下面
在这里插入图片描述
再看看sf的相关:

在这里插入图片描述以上都看到了一个ActivityRecordInputSink的图层,那么这个图层到底有啥作用呢?其实网络上基本上也没有资料,我这边blog算是一个开疆扩土的探索。。。

线索寻找1:

找到这个类看看有没有相关注释:
在这里插入图片描述
个人翻译理解:

* Creates a InputWindowHandle that catches all touches that would otherwise pass through an
 * Activity.

字面翻译就是ActivityRecordInputSink会捕获所有本身会穿透Activity的触摸,即ActivityRecordInputSink就相当于一张大网,Activity有点相当于大网上面有一张小网。
即正常情况下Activity这个小网和手机屏幕都是一样大小,所以这个时候其实ActivityRecordInputSink就没啥存在感,因为本身Activity的任何事件都会捕获,根本不会有漏网之鱼事件到ActivityRecordInputSink。
在这里插入图片描述
上图展示的Activity大小和手机屏幕大小一样,所以手机触摸事件根本到达不了ActivityRecordInputSink这个地方。
其实这个也就是ActivityRecordInputSink为啥没引起大家重视原因,因为我们大部分情况下都遇不到它。
可以看看正常情况下两者的dumpsys input的touch区域:

      5: name='8bdb43d com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity', id=567, displayId=0, inputConfig=0x0, alpha=1.00, frame=[0,0][1080,2160], globalScale=1.000000, applicationInfo.name=ActivityRecord{4e0ab6e u0 com.android.messaging/.ui.conversationlist.ConversationListActivity} t201}, applicationInfo.token=0x792c4556f0, touchableRegion=[0,0][1080,2160], ownerPid=3580, ownerUid=10127, dispatchingTimeout=5000ms, hasToken=true, touchOcclusionMode=BLOCK_UNTRUSTED
        transform (ROT_0) (IDENTITY)
      6: name='a06edb3 ActivityRecordInputSink com.android.messaging/.ui.conversationlist.ConversationListActivity', id=210, displayId=0, inputConfig=NO_INPUT_CHANNEL | NOT_FOCUSABLE, alpha=1.00, frame=[0,0][0,0], globalScale=0.000000, applicationInfo.name=, applicationInfo.token=<null>, touchableRegion=[-10799,-21599][10800,21600], ownerPid=1887, ownerUid=1000, dispatchingTimeout=0ms, hasToken=false, touchOcclusionMode=BLOCK_UNTRUSTED
        transform (ROT_0) (IDENTITY)

可以看到Activity的窗口显示大小就是touchableRegion=[0,0][1080,2160]即和屏幕大小一样,而ActivityRecordInputSink大小是touchableRegion=[-10799,-21599][10800,21600]明显比手机屏幕大很多,这种Activity大小和手机手机屏幕一样,触摸事件正常都不可能到这里。

线索寻找2

那么什么情况下下这个ActivityRecordInputSink才会有相关的作用的呢?
继续寻找一下ActivityRecordInputSink这个类提交log线索:

git log提交

commit 1bc541e8950824f223dc2aba43f09c20f96189a9
Author: Linus Tufvesson <lus@google.com>
Date:   Wed Nov 3 13:56:24 2021 +0000

    Block touches from passing through activities
    
    By setting an InputWindowHandle for ActivityRecord it is no longer
    possible for Activities to shrink their own window size to allow touches
    to pass through to activities behind. The touchable region is cropped by
    the parent, meaning that it will occupy all availble space.
    
    Feature is disabled by default and can be enabled per package using adb
    shell am compat enable ENABLE_TOUCH_OPAQUE_ACTIVITIES <package>
    
    Test: Manually enabled appcompat feature and verified with sample from
    b/194480991 that touches are blocked.

核心语句翻译:
By setting an InputWindowHandle for ActivityRecord it is no longer
possible for Activities to shrink their own window size to allow touches
to pass through to activities behind. The touchable region is cropped by
the parent, meaning that it will occupy all availble space.

即一旦有了ActivityRecordInputSink后就没有可能出现Activity自己窗口缩小允许触摸事件传递到Activity底部的窗口情况,所有的触摸都会被ActivityRecordInputSink获取。

在这里插入图片描述
如上图activity可能比屏幕小,但是触摸在activity外的触摸不会被传递给底部的window,因为会被ActivityRecordInputSink收走。

通过实际dumpsys来验证看看是否真的是这么一回事?

      5: name='4d95871 com.example.myapplication11/com.example.myapplication11.MainActivity', id=1974, displayId=0, inputConfig=0x0, alpha=1.00, frame=[0,0][864,1536], globalScale=1.000000, applicationInfo.name=ActivityRecord{596e7da u0 com.example.myapplication11/.MainActivity} t51}, applicationInfo.token=0x6f95368f10, touchableRegion=[0,0][864,1536], ownerPid=12666, ownerUid=10138, dispatchingTimeout=5000ms, hasToken=true, touchOcclusionMode=BLOCK_UNTRUSTED
        transform (ROT_0) (SCALE )
            1.2500  -0.0000  0.0000
            -0.0000  1.2500  0.0000
            0.0000  0.0000  1.0000
      6: name='1b027ef ActivityRecordInputSink com.example.myapplication11/.MainActivity', id=1979, displayId=0, inputConfig=NO_INPUT_CHANNEL | NOT_FOCUSABLE, alpha=1.00, frame=[0,0][0,0], globalScale=0.000000, applicationInfo.name=, applicationInfo.token=<null>, touchableRegion=[-10799,-19199][10800,19200], ownerPid=9926, ownerUid=1000, dispatchingTimeout=0ms, hasToken=false, touchOcclusionMode=BLOCK_UNTRUSTED
        transform (ROT_0) (IDENTITY)
      7: name='9fe7939 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher', id=1952, displayId=0, inputConfig=DUPLICATE_TOUCH_TO_WALLPAPER, alpha=1.00, frame=[0,0][1080,1920], globalScale=1.000000, applicationInfo.name=ActivityRecord{228f121 u0 com.android.launcher3/.uioverrides.QuickstepLauncher} t45}, applicationInfo.token=0x6f95359f70, touchableRegion=[0,0][1080,1920], ownerPid=10363, ownerUid=10111, dispatchingTimeout=5000ms, hasToken=true, touchOcclusionMode=BLOCK_UNTRUSTED
        transform (ROT_0) (IDENTITY)
      8: name='ada6de9 ActivityRecordInputSink com.android.launcher3/.uioverrides.QuickstepLauncher', id=1851, displayId=0, inputConfig=NO_INPUT_CHANNEL | NOT_FOCUSABLE, alpha=1.00, frame=[0,0][0,0], globalScale=0.000000, applicationInfo.name=, applicationInfo.token=<null>, touchableRegion=[-10799,-19199][10800,19200], ownerPid=9926, ownerUid=1000, dispatchingTimeout=0ms, hasToken=false, touchOcclusionMode=BLOCK_UNTRUSTED
        transform (ROT_0) (IDENTITY)

上面可以看到4d95871 com.example.myapplication11/com.example.myapplication11.MainActivity 这个Activity触摸大小区域:
touchableRegion=[0,0][864,1536]

屏幕大小是1080x1920
但是底下的ActivityRecordInputSink的大小如下
ActivityRecordInputSink com.example.myapplication11/.MainActivity

touchableRegion=[-10799,-19199][10800,19200],
所以有ActivityRecordInputSink在触摸事件不会传递给下面的Launcher

在这里插入图片描述

更多framework干货请关注“千里马学框架”

[Android 13]Input系列--获取触摸窗口 Android 13。 阅读详情

相关推荐

Python深度学习基于Tensorflow(17)基于Transformer的图像处理实例VIT和Swin-T

定义窗口注意力机制,与普通的注意力机制不同,其是在各个窗口中执行注意力机制。从中可以看到,其创新点主要是将图片进行拆分作为序列数据带入。差不多,主要实现的是一个下采样的算法过程;相同位置的像素绑定到一起构成一张新的。模型定义完毕后,初始化模型并开始训练。由于层之间重复性出现,可以定义一个。中,这里先实现拆分图片类。进行操作时我们定义三个类。定义一个多头注意力机制类。的数据,导入数据如下。导入数据,这里同样用。

bigcrab的博客 1634

android认识窗口

这里我按照自己的理解画了一下Android架构图,主要是对看下Framework这块:顶层是基于ApplicationFramework层的Apps层,ApplicationFramework是运行在App进程的Framework代码,如四大组件,各种Manager。在这一层,屏幕上的一块显示区域,典型代表是Activity,但是Activity毕竟是一个综合性比较强的概念,具体到内容显示这块还是由Window类负责,Window则是容纳View对象的容器。

Rainman博的专栏 832

解决TextMeshPro在AB打包中的字体冗余问题:源码修改全记录

本文详细介绍了如何解决TextMeshPro在AB打包中的字体冗余问题,通过源码改造和工程实践优化Unity项目的性能。内容包括资源加载路径重构、AB打包策略优化及运行时加载方案,有效减少包体体积和构建时间,提升内存效率。

weixin_42558257的博客 185

InputMethodManager输入法窗口为啥dumpsys是全屏?千里马带你疑难解惑输入法相关

可以看到的它的画面大小确实是frame=[0,84][1440,2960],但是有一个touchableRegion=[0,1759][1440,2960],这个区域才是真正的触摸区域,这里我们就看出了猫腻,这里y是从1759的位置才开始可以触摸了,也就是我们上面看到的输入法的键盘区域。层级结构看输入法应该是盖在Activity的窗口上面,而且输入法又是全屏的,那么理论上所有的触摸事件就应该到输入法的窗口,而不应该到Activity的窗口。可以看出这里的setTouchableRegion设置是由触发。

learnframework的博客 778

Jetson Orin NX 单目标跟踪算法实战

本文对比了NanoTrack和MixFormerV2两种目标跟踪算法在Jetson Orin NX边缘设备上的实际表现。通过天空小目标跟踪场景测试发现,NanoTrack虽然表征能力较弱,但具有目标身份一致性强、失败模式可控、计算负担小等优势,更适合作为边缘端默认算法。MixFormerV2则适用于高速运动等特定场景。实验数据显示NanoTrack在Orin NX上可达200FPS,远高于MixFormerV2的38-120FPS。建议先采用NanoTrack构建稳定系统,后续再评估复杂算法的适用性。

karmueo46的博客 625

RHCA ---RH442-4

这题考试中是没有的,但我做ex的判分脚本里做了,主要是lab环境swap只有512M的,这样后续改了某几个参数后会造成内存不够用导致异常.这里记得是双>,如果没自信的小伙伴可以在考试开始后第一时间把/etc/fstab先备份一个或者vi进入后手动敲一下。根据题意我们需要分2个768M的分区给swap。用free看swap大小是2.0Gi即可。留意红框中的内容即可,最后w保存退出。这个时候可以重启下机器。

Q先生 641

ActivityRecordInputSink的触摸区域TouchRegion详细解读

到这里就完美解释清楚了ActivityRecordInputSink巨大区域是哪里来的,本质还是因为replaceTouchableRegionWithCrop设置成了true

learnframework的博客 1567

CEEMDAN算法及其应用

本博文主要介绍CEEMDAN算法的原理及其在信号去噪方面的应用

总结论文中的算法并给出论文的复现代码 6万+

四大组件之ActivityRecord

一. 引言 BroadcastRecord,ServiceRecord都继承于Binder对象,而ActivityRecord并没有继承于Binder。 但ActivityRecord的成员变量appToken的数据类型为Token,Token继承于IApplicationToken.Stub。 appToken:system_server进程通过调用scheduleLaunchActivit...

淡淡的宁静的博客 7728

PCIE2.0/PCIE3.0/PCIE4.0/PCIE5.0接口的带宽、速率计算

一、PCIE接口速率: 二、PCIE相关概念: 传输速率为每秒传输量GT/s,而不是每秒位数Gbps,因为传输量包括不提供额外吞吐量的开销位; 比如 PCIe 1.x和PCIe 2.x使用8b / 10b编码方案,导致占用了20% (= 2/10)的原始信道带宽。 GT/s —— Giga transation per second (千兆传输/秒),即每一秒内传输的次数。重点在于描述物理层通信协议的速率属性,可以不和链路宽度等关联。 Gbps —— Giga Bits Per Second

技术联盟 1万+

EMC中的RE测试与整改

测试主要测试电子、电气设备或系统在正常工作时自身对外界的辐射干扰强度,包括来自电路板、机箱、电缆及连接线等所有部件的辐射骚扰。分为:磁场辐射和。其中后者较为应用普遍。测试频段根据不同标准要求不一致。手机测试的频段主要为30-1000MHZ。需要注意的是设备在进行RE测试时要求尽可能满配置,满负荷的运行。同时RE也是EMC中的难点。

学海无涯的专栏 1670

Android Input 系列专题【dumpsys input解读】

Android IMS原理解析 - 简书Android 输入事件分发全流程梳理(一)_android input事件分发流程-优快云博客Android 输入事件分发全流程梳理(二)_android输入事件流程图-优快云博客inputflinger模块与surfaceflinger模块在同级目录之下,即aosp/frameworls/native/services,放在这个目录下面,是因为和fw里面的ims存在大量的交互,其结构如下:

qq_27672101的博客 493

家庭弱电最实用的功能,网线面板如何接线

按照规范,我国宽带入户线按B接法,即568B标准,从后面看,从左到右:1橙白,2橙,3绿白,4蓝,5蓝白,6绿,7棕白,8棕,即和水晶头的接法一致。做水晶头的时候,要注意排好线序,把8根线的头剪齐,留下大约1.8公分,插入水晶头的时候,水晶头要尾巴向下,把线插到水晶头的底端,用网线钳子夹紧。具体是:第1脚——橙白、第2脚——橙色、第3脚——绿白、第4脚——蓝色、第5脚——蓝白、第6脚——绿色、第7脚——棕白、第8脚——棕色,除了四根带颜色的线橙、绿、蓝、棕外,每一根白线上都有线标橙、绿、蓝、棕。

qq_43416206的博客 1674

[Android] 输入系统(一)

Android输入系统是人与机器交互最主要的手段。我们通过按键或者触碰屏幕,会先经由linux产生中断,进行统一的处理过后,转换成Android能识别的事件信息,然后Android的输入系统去获取事件,分发给上层用户程序进行处理。 下面在细分一下输入事件在Android系统中的流程: 从图上能看到,输入事件有四个处理的地方: InputReaderThread InputDispa...

weixin_34018202的博客 238

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

安卓窗口wms/input小知识NO_INPUT_CHANNEL剖析

NO_INPUT_CHANNEL主要给一些窗口完全不需要消费任何输入事件的情况,经典使用该flag窗口有SnapshotStatingWindow,ActivityRecordInputSink等。

learnframework的博客 1137

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android开发浅谈之ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord

ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord,这几个关键的类,我以前一直搞不清其具体关系,看了android里面的Activity体系结构(1)_ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord这篇文章后,才有了一点点明白,对应也做一个笔记。 整体关系图如下 我直接复制他的图片: 通过adb shell dumpsys activity activities 命令可以看到如下打印:

hfreeman2008的专栏 3383

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android studio问题求救

本人小白,刚开始自学安卓,请大佬们帮忙看一下,为什么做侧滑的时候找不到SlidingPaneLayout类,一直标红,非常感谢????????

t_7662的博客 309

Android Input之InputChannel

mWindowSession.addToDisplay()最终会调用WMS的addWindow()方法。

探索未知,成就非凡 973

android输入函数,Android输入系统(4)——InputStage

.使用Java写的Activity程序主要关注输入法处理之前的ViewPreIme和输入法之后的ViewPostIme的处理。2.输入事件传给的控件称为输入焦点。3.每一个Window都有一个DecorView也有一个ViewRootImpl4.java源代码分析使用SourceInsight进行跳转是不合适的,因为跳转是跳转到基类里面去了,调用的函数却是n级派生类的。分析的时候更注重的是哪个类的...

weixin_33181159的博客 357

MirrorLayer可以正常触摸屏幕原理分析

在多屏互动时候有一个屏幕的画面是一个MirrorLayer,另一个屏幕画面是真实的,即2个屏幕上有一个是MirrorLayer,这个时候疑问就来了,经过在aosp13上体验发现,两个屏幕画面都可以正常接受触摸事件进行正常的事件响应。到这里就可以理解为啥两个屏幕各自的mirrorlayer和正常layer都可以正常接受触摸事件的原因,因为在input派发选择窗口,遍历window时候,都对应是同一个windowinfo。这里的inputInfo就是最为关键的信息,也就是最后传递给input端的关键点。

learnframework的博客 1390

conda config包含无效channel解决办法

通过这些步骤,你应该能够解决因无效渠道导致的问题。如果问题仍然存在,请检查网络连接或考虑使用其他镜像源。这个命令会显示当前配置的所有渠道。),你需要将其移除。如果你看到无效的渠道(如。确保配置中只有有效的渠道。

Flemington7的博客 9269

Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问

延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。

Easyhood的博客 289

Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存

二十多个模块业务高度相似却各有差异,核心矛盾在于“统一与灵活”的平衡。通过角色接口组合(如IProjectAware、IVoiceAware)实现能力按需注入,新增功能零侵入;用模板方法锁定生命周期流程,确保顺序一致;结合@CallSuper与工厂方法,既约束关键逻辑,又保留子类自由。最终实现:骨架统一、填空自由,管得住业务,又不侵入业务。

mmsx990的博客 397

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 324
上一篇: 安卓14/aosp14相比安卓13录屏多了MirrorRoot深入剖析解密-千里马android framework实战开发
下一篇: c++基础知识之父类地址和基类地址一定相同?
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值