《AndroidPerformanceMonitor》一个检测UI线程处理每个message时间的工具,并分析其局限性

感觉这是一个很有意思的工具,可以检测UI线程处理每个message时间。如果时间长了,那么就发个通知,通知开发者哪里可能存在问题。原理并不难,不过作者能想出来这种方法来检测手机app的一些性能问题,还是挺有心的,应该给作者点个赞。

开源库的地址是 戳这里

哪些卡顿检查不出来

首先说下这个工具只能检测一些性能问题。卡顿的问题不只是因为message的执行时间过长。比如:界面的渲染是在Render Thread线程。主线程会把view#draw()方法的指令解析成GPU能读懂的指令,然后传给Render Thread线程。 GPU再根据这些指令进行渲染。绘制是一个很复杂的过程。虽然有了Render Thread线程来做渲染工作,大部分时间Render Thread 和主线程是并发进行的,但是还是会有一个点 两个线程是互相依赖的。他们需要相互等待来交换数据,以便将数据写入到 back buffer中。back buffer是从SurfaceFlinger 服务的buffer队列请求来的。当把渲染的数据写到back buffer后,会返回给SurfaceFlinger 服务的buffer队列。SurfaceFlinger会根据硬件屏幕刷新时钟Async来把buffer(这里叫frame buffer)给到android系统中进行屏幕展示。这里的要展示的frame buffer来自于back buffer。所以如果绘制不及时(>16ms), back buffer在16ms内没有装载完毕。那么SurfaceFlinger只能把之前的back buffer当成frame buffer提交给屏幕进程呈现。因此卡顿就产生了。

因此,绘制不及时有很多种。比如上面说的Render Thread线程绘制了一个很复杂的view(比如给view添加蒙层,就会导致绘制的复杂),因为主线程与Render Thread线程存在依赖,那么主线程需要等待,导致back buffer不能完成,进而产生卡顿。这时候UI线程中处理msg的时间并不长,只是一直在block等待。这种卡顿AndroidPerformanceMonitor并不能处理。

原理分析

原理就不贴代码了,几句话就能说完。贴代码反而影响问题的阐述。
我们知道,主线程的Looper工作在一个for循环中,每次从队列中拿到一个meesage进行处理。在处理每一个message时,在开始处理,到处理完成都会使用Printer来打印一些东西。开始时打印:
'' logging.println(">>>>> Dispatching to " + msg.target + " " +
'' msg.callback + ": " + msg.what);

结束时打印:
'' logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);

这个Printer是Looper的mLogging成员变量,我们可以设置。原理就在这里。我们可以设置一个自定义的Printer。重写Printer的println(String)方法。在重写的println(String)方法中判断,如果参数string中包含“Dispatching to”,那么就往HandleThread线程的队列中添加一个延时300ms的runnable,runnable中处理卡顿信息的逻辑。如果判断参数string中包含“Finished“,那么如果HandleThread线程的队列 中的runnable还在,就清除这个runnable。即,说明这个message执行完还不到300ms,那么就认为处理这个message没有发生卡顿。当然如果打印”Finished“时,与”Dispatching“的时间差已经大于了300ms,那么runnable便已经执行了处理卡顿信息的逻辑。

大致原理就是这样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容