android anr input 流程分析

embedded/2024/11/14 16:32:03/


我这里将input anr分两大部分,一个是焦点窗口相关,一个是焦点事件相关

1 焦点窗口

在每次监测anr的时候,最先检查的是焦点窗口的获取情况
在监测事件是否超时之前有一个方法监测焦点窗口的,findFocuseWindowTargetsLocked()
这个主要处理无焦点的情况。
比如 有焦点app无焦点window的情况
比如 无焦点app无焦点window的情况
比如 焦点窗口paused状态的情况,代码里都打印了对应的log说明,这些都可以归为无焦点问题
而这些问题往往出现在monkey,后台冻结,快速切换页面等情况下产生,有些问题是不需要解决的(用户不会在快速切换的时候,还能快速的点击
这里简单概况下这类anr问题,切换或启动app时候,当前进程被杀死,被freeze,被降频(或cpu被低内存交换操作占用,大量文件读写)导致变慢等都会引起anr
还有一种是焦点窗口快速的切换,导致事件卡在了一个已经进入pause状态的页面,也会导致anr
这种的情况主要排查event log及 进程状态及进程号是否,这里要注意的是 页面更新的流程是surfaceflinger那边发来的消息。

2 焦点事件


整个输入事件流是一个生产者消费者的waitQueue,而且这个queue只能有一个成员,多的就要等待
超过等待时间就会报anr。这类问题比较常见,总之就是整条链路依次排查卡住的地方。
这里由于没有关于surfacefinger的一环,流程大概就是
开始于:inputdispater.cpp类里dispatchOnceInnerLocked-
结束于:(viewrootimpl里面的finishinputevent流程)app进程的InputTransport.cpp sendFinishedSignal到inputdispater.cpp进行消除

3 最后列下两种流程对应的system_server端调用流程

1 页面切换(sf通过binder的方式发过来)

mystack : #00 pc 00000000000359cc  /system/lib64/libinputflinger.so (android::inputdispatcher::InputDispatcher::setInputWindowsLocked(std::__1::vector<android::sp<android::InputWindowHandle>, std::__1::allocator<android::sp<android::InputWindowHandle> > > const&, int)+88)
01-01 14:12:42.490  1079  1995 D mystack : #01 pc 0000000000035920  /system/lib64/libinputflinger.so (android::inputdispatcher::InputDispatcher::setInputWindows(std::__1::unordered_map<int, std::__1::vector<android::sp<android::InputWindowHandle>, std::__1::allocator<android::sp<android::InputWindowHandle> > >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::vector<android::sp<android::InputWindowHandle>, std::__1::allocator<android::sp<android::InputWindowHandle> > > > > > const&)+64)
01-01 14:12:42.490  1079  1995 D mystack : #02 pc 000000000002675c  /system/lib64/libinputflinger.so (android::InputManager::setInputWindows(std::__1::vector<android::InputWindowInfo, std::__1::allocator<android::InputWindowInfo> > const&, android::sp<android::ISetInputWindowsListener> const&)+408)
01-01 14:12:42.490  1079  1995 D mystack : #03 pc 0000000000026a08  /system/lib64/libinput.so (android::BnInputFlinger::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+804)
01-01 14:12:42.490  1079  1995 D mystack : #04 pc 000000000004982c  /system/lib64/libbinder.so (android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+232)
01-01 14:12:42.490  1079  1995 D mystack : #05 pc 0000000000052210  /system/lib64/libbinder.so (android::IPCThreadState::executeCommand(int)+1032)
01-01 14:12:42.490  1079  1995 D mystack : #06 pc 0000000000051d58  /system/lib64/libbinder.so (android::IPCThreadState::getAndExecuteCommand()+156)
01-01 14:12:42.490  1079  1995 D mystack : #07 pc 0000000000052590  /system/lib64/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+60)
01-01 14:12:42.490  1079  1995 D mystack : #08 pc 0000000000078618  /system/lib64/libbinder.so (android::PoolThread::threadLoop()+24)
01-01 14:12:42.490  1079  1995 D mystack : #09 pc 00000000000154d0  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+260)
01-01 14:12:42.490  1079  1995 D mystack : #10 pc 00000000000a1be0  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+144)
01-01 14:12:42.490  1079  1995 D mystack : #11 pc 0000000000014d94  /system/lib64/libutils.so (thread_data_t::trampoline(thread_data_t const*)+412)
01-01 14:12:42.490  1079  1995 D mystack : #12 pc 00000000000afecc  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
01-01 14:12:42.490  1079  1995 D mystack : #13 pc 0000000000050408  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)


2 发送消息的调用流程(inputchannal的sorctpair方式)
01-01 14:16:11.753  1079  1149 D mystack2: #00 pc 0000000000032994  /system/lib64/libinputflinger.so (android::inputdispatcher::InputDispatcher::handleReceiveCallback(int, int, void*)+80)
01-01 14:16:11.753  1079  1149 D mystack2: #01 pc 0000000000019dac  /system/lib64/libutils.so (android::Looper::pollInner(int)+916)
01-01 14:16:11.753  1079  1149 D mystack2: #02 pc 00000000000199b0  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112)
01-01 14:16:11.753  1079  1149 D mystack2: #03 pc 00000000000286d4  /system/lib64/libinputflinger.so (android::inputdispatcher::InputDispatcher::dispatchOnce()+200)
01-01 14:16:11.753  1079  1149 D mystack2: #04 pc 0000000000006718  /system/lib64/libinputflinger_base.so (android::(anonymous namespace)::InputThreadImpl::threadLoop()+24)
01-01 14:16:11.753  1079  1149 D mystack2: #05 pc 0000000000015598  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+460)
01-01 14:16:11.753  1079  1149 D mystack2: #06 pc 00000000000a1be0  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+144)
01-01 14:16:11.753  1079  1149 D mystack2: #07 pc 0000000000014d94  /system/lib64/libutils.so (thread_data_t::trampoline(thread_data_t const*)+412)
01-01 14:16:11.753  1079  1149 D mystack2: #08 pc 00000000000afecc  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
01-01 14:16:11.753  1079  1149 D mystack2: #09 pc 0000000000050408  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
01-01 14:16:11.781  1079  1149 D mystack2: #00 pc 0000000000032994  /system/lib64/libinputflinger.so (android::inputdispatcher::InputDispatcher::handleReceiveCallback(int, int, void*)+80)
01-01 14:16:11.781  1079  1149 D mystack2: #01 pc 0000000000019dac  /system/lib64/libutils.so (android::Looper::pollInner(int)+916)
01-01 14:16:11.781  1079  1149 D mystack2: #02 pc 00000000000199b0  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112)
01-01 14:16:11.781  1079  1149 D mystack2: #03 pc 00000000000286d4  /system/lib64/libinputflinger.so (android::inputdispatcher::InputDispatcher::dispatchOnce()+200)
01-01 14:16:11.781  1079  1149 D mystack2: #04 pc 0000000000006718  /system/lib64/libinputflinger_base.so (android::(anonymous namespace)::InputThreadImpl::threadLoop()+24)
01-01 14:16:11.781  1079  1149 D mystack2: #05 pc 0000000000015598  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+460)
01-01 14:16:11.781  1079  1149 D mystack2: #06 pc 00000000000a1be0  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+144)
01-01 14:16:11.781  1079  1149 D mystack2: #07 pc 0000000000014d94  /system/lib64/libutils.so (thread_data_t::trampoline(thread_data_t const*)+412)
01-01 14:16:11.781  1079  1149 D mystack2: #08 pc 00000000000afecc  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
01-01 14:16:11.782  1079  1149 D mystack2: #09 pc 0000000000050408  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)


http://www.ppmy.cn/embedded/136842.html

相关文章

【学习笔记】SAP ABAP——OPEN SQL(一)【INTO语句】

【INTO语句】 结构体插入(插入一条语句时) SELECT...INTO [CORRESPONDING FIELDS OF] <wa> FROM <db> WHERE <condition>.内表插入(插入多条语句时) SELECT...INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE <itab>FROM <db> WHERE <con…

【日常经验】RPC 调用的分类及示例

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;日常经验 ⏰️创作时间&#xff1a;2024年11月6日09点23分 文章目录 RPC调用的分类及示例一、RPC调用的分类&#xff08;一&#xff09;基于传统HTTP协议的RPC&#xff08;二&#xff09;基…

在vscode中如何利用git 查看某一个文件的提交记录

在 Visual Studio Code (VSCode) 中&#xff0c;你可以使用内置的 Git 集成来查看某个文件的提交历史。以下是具体步骤&#xff1a; 使用 VSCode 内置 Git 功能 打开项目&#xff1a; 打开你的项目文件夹&#xff0c;确保该项目已经是一个 Git 仓库&#xff08;即项目根目录下…

Redux的简介及其在React中的应用

Redux Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行。 作用&#xff1a;通过集中管理的方式管理应用的状态。 使用步骤&#xff1a; 定义一个 reducer 函数 &#xff08;根据当前想要做…

PostgreSQL 性能优化全方位指南:深度提升数据库效率

PostgreSQL 性能优化全方位指南&#xff1a;深度提升数据库效率 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 在现代互联网应用中&#xff0c;数据库性能优化是系统优化中至关重要的一环&#xff0c;尤其对于数据密集型和高并发的应用而言&am…

融云:社交泛娱乐出海机会尚存,跨境电商异军突起

近年来&#xff0c;直播、语聊房、游戏社区&#xff0c;这些中国网友熟悉的网络社交形式&#xff0c;正在海外市场爆发出新的生命力。无论是被炒到几百人民币一个的 Clubhouse 邀请码&#xff0c;还是先后登顶中东下载榜的 Yalla、JACO&#xff0c;这些快速掀起体验浪潮的社交娱…

React Native使用axios会不会有问题

React Native 编译成原生应用后&#xff0c;是会进行原生应用的编译&#xff0c;生成 iOS 或 Android 的应用包。但 Axios 作为一个 JavaScript 库&#xff0c;它的工作机制与传统的浏览器环境有所不同&#xff0c;因此需要进一步澄清。 Axios 在 React Native 中的工作原理&a…

《深度学习》bert自然语言处理框架

目录 一&#xff0c;关于bert框架 1、什么是bert 2、模型结构 自注意力机制&#xff1a; 3、预训练任务 4、双向性 5、微调&#xff08;Fine-tuning&#xff09; 6、表现与影响 二、Transformer 1、传统RNN网络计算时存在的问题 1&#xff09;串联 2&#xff09;并行…