背景:
同学们经常在分析systrace或者perfetto时候,都会面临一个分析iq,oq,wq的问题,这个iq,oq,wq,到底是指的什么呢?
其实这个在input专题的源码分析时候就有讲解过,不过那时候是完全基于源码分析的,没有和systrace或者perfetto结合起来分析,今天马哥就来补充一下这块知识。
复习源码解析iq,oq,wq:
这里可以先看一张网图概况复习一下:
input正常流程如下:
一般都是
1、驱动先写入到字节节点
2、systemserver的InputReader线程监听读取节点转换数据,通知InputDispatcher
3、InputDispatcher接受到了数据,然后寻找对应合适窗口进行派发
这里3个过程中,离我们app处理最近的当然是第三个步骤,经常说的iq,oq,wq其实也是属于InputDispatcher类里面的变量
InboundQueue队列(“iq”)中一般放着InputDispatcher从inputreader中拿到的input事件,当然也可以不是inputreader因为有可能事件属于注入的,对应的代码如下:
代码路径:
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
void InputDispatcher::traceInboundQueueLengthLocked() {
if (ATRACE_ENABLED()) {
ATRACE_INT("iq", mInboundQueue.size());
}
}
可以看到其实这里的iq就是代表InputDispatcher中mInboundQueue大小
OutboundQueue(“oq”)队列里面放的是即将要被派发给各个目标窗口App的事件
注意啦,这里的oq是带着有具体的目标窗口的
void InputDispatcher::traceOutboundQueueLength(const Connection& connection) {
if (ATRACE_ENABLED()) {
char counterName[40];
snprintf(counterName, sizeof(counterName), "oq:%s", connection.getWindowName().c_str());
ATRACE_INT(counterName, connection.outboundQueue.size());
}
}
WaitQueue队列里面记录的是已经派发给 App(“wq”),但是 App还在处理没有返回处理成功的事件;
这里基本上和oq一样的
void InputDispatcher::traceWaitQueueLength(const Connection& connection) {
if (ATRACE_ENABLED()) {
char counterName[40];
snprintf(counterName, sizeof(counterName), "wq:%s", connection.getWindowName().c_str());
ATRACE_INT(counterName, connection.waitQueue.size());
}
}
perfetto分析手动触摸
前提抓取perfetto条件:
在桌面触摸一个app的图标打开
总体systrace流程图如下:
再进行挨个详细对照源码复习:
iq部分
代码地方:
inputreader触发notifyMotion
oq部分
需要对事件进行派发,会调用dispatchMotionLocked方法
dispatchEvnentLocked会调用到prepareDispatchCycleLocked
prepareDispatchCycleLocked又会调用到enqueueDispatchEntriesLocked
在这里的enqueueDispatchEntriesLocked中会调用到enqueueDispatchEntryLocked
这里面会进行调用
connection->outboundQueue.push_back(dispatchEntry.release());
traceOutboundQueueLength(*connection);
wq部分
看看详细trace图
再看看代码:
enqueueDispatchEntriesLocked执行了enqueueDispatchEntryLocked后会进行调用startDispatchCycleLocked
startDispatchCycleLocked会进行相关的触摸事件派发
到此也基本吧iq,oq,wq的代码和trace结合起来看
更多framework实战干货,请关注下面“千里马学框架”