日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android ANR视角InputDispatcher

發(fā)布時(shí)間:2023/12/20 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android ANR视角InputDispatcher 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:王小二

前言

有好多人向我咨詢過Input ANR問題,說實(shí)話,我也是一直無法徹底的解釋清楚,我下決心要徹底搞懂這塊知識(shí)點(diǎn)。

話不多說先上圖

一個(gè)event的正常流程

InputReader線程

1.InputReader線程一旦發(fā)現(xiàn)有新的event,判斷mInBoundQueue是否為空,如果為空,設(shè)置wakeup = true

2.添加event到mInBoundQueue,如果wakeup==true,喚醒InputDispatcher的mLooper

InputDispatcher線程

1.沒有事做的時(shí)候,mLooper.pollOnce(timeoutMillis)休眠, timeoutMillis為下次喚醒的delay時(shí)間。

2.mLooper被喚醒

a.發(fā)現(xiàn)mPendingEvnet為空且mInBoundQueue不為空,從mInBoundQueue獲取一個(gè)event,并賦值給mPendingEvnet,走到第3步 b.發(fā)現(xiàn)mPendingEvnet不為空,走第3步 c.發(fā)現(xiàn)mPendingEvnet為空且mInBoundQueue為空,回到第1步休眠

3.檢查當(dāng)前的window是否可以接收mPendingEvnet,正常情況下是OK的,異常的情況,我們后面討論。

4.通過InputChannel分發(fā)mPendingEvnet到APP層后, mPendingEvnet保存到waitQueue

5.發(fā)送成功后releasePendingEventLocked(mPendingEvnet == null),并將mLooper的nextWakeupTime設(shè)置LONG_LONG_MIN,然后回到第1步。

6.當(dāng)App層處理完event后會(huì)發(fā)送一個(gè)finish信號(hào)過來,然后移除waitQueue中event,并喚醒mLooper,觸發(fā)第2步

Input ANR的發(fā)生的原因:主線程的卡頓

怎么理解這句話如何導(dǎo)致的ANR?

主線程卡頓主要是導(dǎo)致的InputDispatcher線程中的正常流程第6步無法完成。

假設(shè)event1的沒有完成第6步,這時(shí)候來了一個(gè)event2這個(gè)流程是怎么樣子的:

第1步,第2步是一樣的

第3步:

waitQueue不為空,導(dǎo)致checkWindowReadyForMoreInputLocked返回值不為空,觸發(fā)handleTargetsNotReadyLocked,然后將當(dāng)前時(shí)間+5s作為mInputTargetWaitTimeoutTime,并設(shè)置mInputTargetWaitTimeoutTime為mLooper下一次喚醒的時(shí)間

std::string reason = checkWindowReadyForMoreInputLocked(currentTime, touchedWindow.windowHandle, entry, "touched"); if (!reason.empty()) {//reason不等于空 injectionResult = handleTargetsNotReadyLocked(currentTime, entry, NULL, touchedWindow.windowHandle, nextWakeupTime, reason.c_str()); goto Unresponsive; } std::string InputDispatcher::checkWindowReadyForMoreInputLocked(nsecs_t currentTime, const sp<InputWindowHandle>& windowHandle, const EventEntry* eventEntry, const char* targetType) { //省略好多代碼,因?yàn)椴恢挂环N請(qǐng)款,我們只分析一種 if (!connection->waitQueue.isEmpty() && currentTime >= connection->waitQueue.head->deliveryTime + STREAM_AHEAD_EVENT_TIMEOUT) { return StringPrintf("Waiting to send non-key event because the %s window has not " "finished processing certain input events that were delivered to it over " "%0.1fms ago. Wait queue length: %d. Wait queue head age: %0.1fms.", targetType, STREAM_AHEAD_EVENT_TIMEOUT * 0.000001f, connection->waitQueue.count(), (currentTime - connection->waitQueue.head->deliveryTime) * 0.000001f); } return ""; } int32_t InputDispatcher::handleTargetsNotReadyLocked(nsecs_t currentTime, const EventEntry* entry, const sp<InputApplicationHandle>& applicationHandle, const sp<InputWindowHandle>& windowHandle, nsecs_t* nextWakeupTime, const char* reason) { //省略好多代碼 if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) { //省略好多代碼 //設(shè)置第一次卡頓的flag后面進(jìn)來就不會(huì)設(shè)置了 mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY; mInputTargetWaitStartTime = currentTime; //設(shè)置mInputTargetWaitTimeoutTime為當(dāng)前時(shí)間+5s mInputTargetWaitTimeoutTime = currentTime + timeout;//timeout = 5s //省略好多代碼 } //如何當(dāng)前的時(shí)候大于mInputTargetWaitTimeoutTime就出現(xiàn)ANR,默認(rèn)第一次進(jìn)來是走else if (currentTime >= mInputTargetWaitTimeoutTime) { onANRLocked(currentTime, applicationHandle, windowHandle, entry->eventTime, mInputTargetWaitStartTime, reason); *nextWakeupTime = LONG_LONG_MIN; return INPUT_EVENT_INJECTION_PENDING; } else { //將mInputTargetWaitTimeoutTime下一次wakeup的時(shí)間 if (mInputTargetWaitTimeoutTime < *nextWakeupTime) { *nextWakeupTime = mInputTargetWaitTimeoutTime; } return INPUT_EVENT_INJECTION_PENDING; } }

第4步:

因?yàn)闊o法發(fā)送event2,releasePendingEventLocked就不會(huì)觸發(fā),mPendingEvnet就會(huì)保留發(fā)送失敗的event2。

第5步:

情況A:在mInputTargetWaitTimeoutTime之前event1完成了常規(guī)的操作中的第6步,發(fā)送finish信號(hào),就會(huì)喚醒mLooper,然后繼續(xù)處理mPendingEvnet,也就是event2,因?yàn)閣aitQueue已經(jīng)為空了,那么event2就會(huì)按照正常流程的處理了

情況B:在mInputTargetWaitTimeoutTime之前event1沒有完成常規(guī)的操作第6步,這時(shí)候mLooper被handleTargetsNotReadyLocked中設(shè)置的wakeuptime所喚醒,然后繼續(xù)處理mPendingEvnet,也就是event2,因?yàn)閣aitQueue不為空,event1還在,所以又會(huì)觸發(fā)handleTargetsNotReadyLocked,這一次只會(huì)走以下代碼,然后觸發(fā)ANR

if (currentTime >= mInputTargetWaitTimeoutTime) { onANRLocked(currentTime, applicationHandle, windowHandle, entry->eventTime, mInputTargetWaitStartTime, reason); *nextWakeupTime = LONG_LONG_MIN; return INPUT_EVENT_INJECTION_PENDING; }

總結(jié)

Input ANR是所有ANR中最難理解的一種ANR,我只分析了其中一種情況的Input ANR,想要了解所有Input ANR,只需要在源碼中搜索handleTargetsNotReadyLocked出現(xiàn)的位置,結(jié)合代碼看就知道了。

記住一句話:InputDispatcher永遠(yuǎn)只能單線程處理一個(gè)mPendingEvent,如果分發(fā)失敗,下一次會(huì)繼續(xù)分發(fā)同一個(gè)mPendingEvent。


掃碼或長(zhǎng)按關(guān)注

回復(fù)「?加群?」進(jìn)入技術(shù)群聊

總結(jié)

以上是生活随笔為你收集整理的Android ANR视角InputDispatcher的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人影院综合在线 | 91制服诱惑 | 女女互慰吃奶互揉调教捆绑 | 欧美最顶级a∨艳星 | 精品人妻一区二区三区浪潮在线 | 欧美 日韩 国产一区 | 成人av动漫在线 | 涩涩成人网 | 另类视频在线观看 | 国产精品羞羞答答在线 | 日av中文字幕| 91精品人妻互换一区二区 | 美女av网| 欧美精品一二 | 国产高清免费在线播放 | av免费在线电影 | 美女三级黄色 | 亚洲福利视频一区二区三区 | 狠狠久久综合 | 久久精品一二三 | 一区二区三区免费毛片 | 精品久久久在线观看 | 视频在线中文字幕 | 色香蕉av | 日本东京热一区二区三区 | av香港经典三级级 在线 | www.色图 | 男人用嘴添女人下身免费视频 | 色播综合网 | 日韩av视屏 | 欧美亚州 | 久久22 | 国产肥熟 | 国产一av | 风间由美在线视频 | 激情综合av| 中国美女乱淫免费看视频 | 精国产品一区二区三区a片 国产精品第一 | 秋霞福利片 | 天堂最新资源在线 | 亚洲天堂一区在线 | 一区二区三区免费在线视频 | 精品国产18久久久久久二百 | 色xxxxxx| 99久久精品无码一区二区毛片 | 女人和拘做爰正片视频 | 亚洲国产精品久久精品怡红院 | 中国字幕av| 国产一区二区三区影院 | 日韩国产91 | 久草视频免费在线播放 | 99综合久久 | 呦呦视频在线观看 | 国产精品扒开腿做爽爽爽视频 | 婷婷综合另类小说色区 | 国产免费自拍视频 | √天堂资源地址在线官网 | 中文字幕日韩一区二区三区 | 国产综合av | 国产免费黄色av | 国产肥熟| 天天艹日日艹 | 羞羞涩涩网站 | 香蕉网站视频 | 无遮挡又爽又刺激的视频 | 麻豆 美女 丝袜 人妻 中文 | 无码人妻精品一区二区三区温州 | 日韩三级在线播放 | 国产精品久久久久久亚洲影视 | 男人用嘴添女人下身免费视频 | 国产免费又粗又猛又爽 | 野花社区视频在线观看 | 在线一区二区不卡 | 黄色一级黄色片 | 中国 免费 av | 97超碰人人模人人人爽人人爱 | 成人久久久久久久 | 国产精品久久久久久福利 | 日韩黄色三级 | 夜夜操操操 | 九九视屏 | 777久久| 欧美毛茸茸 | 国产精品一区二区三区四 | 免费成人小视频 | 色综合中文综合网 | 视频免费在线观看 | www.一区 | 天堂网一区| 东北少妇不戴套对白第一次 | 欧美无马| 午夜精品av | 黑人操少妇| 竹菊影视日韩一区二区 | 日本囗交做爰视频 | 超碰蜜臀| 亚洲精品动漫在线观看 | 激情四虎 | 九月婷婷丁香 |