基于Method Trace工具解决UI卡顿的问题

        很久以前就看过使用Android studio的Method Trace工具调查函数性能或者效率的问题,一直没有在解决日常问题过程中实战过。最近刚好遇到了一个关闭wifi开关时wifi设置页面卡顿的问题,所以就想着尝试一下。虽然解决UI卡顿一般都用systrace工具,但是method trace可以查看各个线程中某个函数执行情况,理论上也是可以用来定位UI卡顿问题的。

首先启动method trace功能,然后关闭wifi,待卡顿过后,停止trace。Android studio会自动打开抓取的内容。 

虽然Eclipse通过ddms抓取的traceview也是可以查看函数调用情况,但是Adroid studio的method trace功能更强大,尤其是可以分线程查看,这就更方便我们查找问题了。由于UI卡顿肯定是主线程被block了,必然我们要看这段时间内主线程的执行情况。选中上图中的主线程,可以看到中间有个很长的长条,鼠标放上去之后,发现该函数执行了约1.5s(注意起始时间,与后面做对比时可以很方便确认多线程调用时函数执行先后顺序),那么可以确认,就是这个函数出的问题了。

定位到源码中的copyAndNotifyListeners函数,去掉其他逻辑后主逻辑如下

private void copyAndNotifyListeners(boolean notifyListeners) {

……1……

     synchronized (mLock) {

        ……2……

    }

……3……

}

直观的怀疑是执行完1处的逻辑之后,主线程要去拿锁,此时由于锁被其他线程占用,所以主线程要一直等待。但是这只是我们的怀疑,要找到证据才行。这又要体现出Method Trace工具的强大之处。图中的每个小方格都代表了函数的执行情况,包括函数名、函数执行时间以及各个函数之间的调用情况。原理上,如果逻辑2中有函数调用的话,必定能在图中体现出来。把图中卡顿地方前后位置放大之后,发现卡顿之前确实在调用1处的函数,而在卡顿之后恰好在调用2处的逻辑。这样,就为我们之前的假设找到了证据。

既然主线程要取的锁被占用,肯定是被其他线程占用着,具体是什么线程,可以通过图中左上角查看每个线程的调用情况来确认。果然,在某个线程中我们发现了与主线程类似的长条。查看函数调用堆栈的情况,确实在该函数中持有对应的锁,且该锁刚好是在主线程之前拿到的。这样卡顿的原因就找到了。进一步分析,该部分卡顿是由于子线程在持锁期间调用了WifiManager的接口,而这个接口在向WifiManager取数据时采用的是同步调用,而WifiManager最终是向WifiStateMachine中取数据,WifiStateMachine线程此时正在忙碌调用driver中的接口,无法及时处理这个请求,因此这就是应用层被卡住的原因。

虽然经过上面的分析,问题是WifiStateMachine引起的,但是一款优秀的应用,还是要首先检查自己能否兼容这种场景,自己的逻辑是否也存在问题。深入分析之后发现,子线程确实存在持锁范围过大的问题,可以进行优化,避免不必要的等待。

补充问题

在解决上面问题时,对android源码的@GuardedBy标记有些疑惑,这个标记有啥作用呢?我直观的以为这个可以当成一把锁来用,但这只是我的假设而已,肯定要验证一下才能踏实。查阅了一些资料,感觉还是云里雾里,所以还是自己做实验看看把。

写了上面的测试代码,编译之后得到.class文件,通过javap -c Test.class后查看编译后的代码

从这个结果可以看出,@GuardedBy标签并没有对编译后的结果产生影响,也就没有同步作用。事实上该标签和@Override标签的功能是一致的,更多的作用是一种标记,标记这个变量或者这个函数是需要同步的,同时编译器在编译时可以根据这些标签做lint检查之类的工作。在日常工作中,可以合理的使用这些标签以增强代码逻辑的可读性,同时也方便其他同学阅读此处逻辑时能更快的领会设计意图。

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

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,371评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 1、2014年8月14号,研究生舍友陈给我打电话,说无聊就给我打个电话。我对她表达了有了爱情之后就忘了我的牢骚,说...
    janet阅读 219评论 0 1
  • 先来个图吧 大概的效果就是这样,代码就一个监听事件,把需要移动的View添加这个监听事件就可以了,具体的参数要根据...
    隔壁老王的杂货铺阅读 392评论 0 0
  • 典韦,东汉末年曹操部将,相貌魁梧,力大过人,一对铁戟,好不霸气。本属张邈,后归曹操。曹操征讨吕布时被募为陷阵,表现...
    老爷子l阅读 748评论 0 0