透过systrace工具看dex2oat对应用启动性能的影响

不可忘记用爱心接待客旅,因为曾有接待客旅的,不知不觉就接待了天使。---希伯来书13:2

问题描述

chrome应用冷启动缓慢,跟参考机相比在luncher界面点击chrome图标,有一个明显的延迟,然后chrome才被启动起来。从点击图标到第一个界面加载完全显示,问题机相对参考机要慢3s左右。

初步分析

Android 平台侧性能优化之应用启动 一文里遇到过假冷启动引发的类似问题,按照这个思路检查排除了假冷启动的可能。
因为chrome都是通过play store跟新到最新版本v58.0.3029.83的。这也排除了chrome版本不同照成的因素。
参考机问题机的硬件参数有差异,问题机硬件是工程机的标准,而参考机是出货的硬件标准。这个可能存在影响,但直觉告诉我不应该有3s这么大的影响。

systrace分析

经过初步分析,该用systrace进一步深入分析。采用命令:

./run_systrace.py -a com.android.chrome gfx input view am app dalvik sched freq idle load -o trace.html

分别抓取参考机和问题机启动chrome的systrace。

问题机启动chrome systrace如下:


问题机systrace

参考机启动chrome systrace如下:


参考机systrace

注意以上获取的systrace图,高亮的部分bindApplication问题机相对参考机多耗时1s以上,这个是非常不合理的。
放大高亮的bindApplication区域:


bindApplication对比图

通过上图可以看到问题机OpenDexFilesFromOat方法把大部分时间都消耗在了打开base.apk,这个base.apk是未经过oat优化过的chrome apk,而参考机打开的是base.odex。怀疑问题机上系统对chrome未做oat优化。但oat优化是默认开启的啊,怎么在问题机上chrome没有生成对应的odex文件呢?

为了进一步确认问题,我们需要去/data/app/com.android.chrome-1目录下查看到底有没有odex文件生成。坑爹的是user版本没有root权限查看不了,只能去单独烧录一个eng版本的bootimg了。
烧录eng的boot获取root权限查看/data/app/com.android.chrome-1竟然有base.odex,这遇到了什么鬼。。。
再次抓取此时问题机的systrace查看。


烧录eng boot抓取systrace图

可以看到bindApplication由之前的1.888s变成现在的0.848s。已经靠近了参考机bindApplication花费的0.699s,如果再计算上eng boot对性能的影响,此时问题机bindApplication耗时应该很接近参考机了。

问题猜想

只是换了一个boot,不应该出现这种变化。有没有可能通过play store更新的chrome需要重启或者等待一段时间oat优化才会完成呢?因为更新完chrome后马上开始了问题分析,从之前的systrace看确实没有odex文件生成,而烧录eng boot后该odex文件就有了,eng boot应该不会影响odex文件的生成,烧录的过程重启了手机,重启过程很有可能左右该问题的主因。为了验证这个猜想,将参考机问题机的chrome都卸载更新的版本,重新通过play store 更新chrome,抓取systrace做对比参考。

结果发现参考机更新完成后直接测试没有出现OpenDexFilesFromOat耗时过长问题。
在看问题机同样也没有出现OpenDexFilesFromOat耗时过长问题。

卸载新版本,重新更新chrome,没有重启手机竟然没有出现启动异常。难道猜想错了,odex的生成压根与重启手机没有关系?这就有点费解了,跟预期的不一样啊,让人抓狂.


这里写图片描述

会不会是刚刷完机就复现问题,此时后台任务过多,导致chrome的oat操作没有完成呢?
会不会是JIT的问题呢?
会不会是虽然卸载掉了更新的apk,但某些地方还保留了记录,再次更新后,odex会自动生成呢?
在不成难道这是偶现问题?
满脑子的疑问飞过来,为了解决这些疑问,只有在刷机一次,从新做实验。

刷完机更新完chrome后,为防止偶现问题,多次抓取了冷启动的systrace,都复现问题。


二次确认

等待30分钟后,再次抓取systrace


等待30分钟后

看来不是后台任务过多,导致chrome的oat操作没有完成。
多次使用chrome,在抓取systrace分析。同样还是有问题,这里图就不贴了。看来也不是JIT的问题。
在看重启手机后的现象,启动时间终于正常了。


重启手机odex文件生成

终于找到了问题的表因,原来通过play store更新chrome应用,只有重启系统才会去做odex优化。而如果先卸载掉更新的chrome,在重新更新则没有问题。

刨根溯源

问题原因找到了,那这个问题是play store的问题还是说系统本身的问题,无法完全确认,但猜测很可能是系统本身的问题,google 不会留下这么明显的bug。因此还需要追溯没有做odex的原因。
odex的详细过程这里不展开讲述。后续在单独起一篇做总结。先给出主要的调用关系。


dex2oat调用关系图

沿着上图最终发现了问题所在。原来之前的同事在做开机优化时做了一个功能,将非重要应用的dex2oat操作放在了开机之后。可是没有考虑好更新应用时的逻辑处理,导致了问题的发生。本质原因找到了,那么该问题解起来就有方向了。这里涉及到具体的功能,不在赘述。

总结

程序员总爱给程序员挖坑,越向底层的改动越要小心,牵一发而动全身啊。
性能问题涉及的模块确实很多,许多问题总是那么的扑朔迷离,一定要有耐心去分析。
通过分析过程,我们也可以看到dex2oat对应用启动的性能确实提升巨大。systrace的好处就是能量化出这种性能差异。

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

推荐阅读更多精彩内容

  • 上一篇文章Android 平台侧性能优化之应用启动采用多个命令分析了平台的cpu/memory等方面对Email启...
    小草凡阅读 3,068评论 5 11
  • 注意事项: 布局优化;尽量使用include、merge、ViewStub标签,尽量不存在冗余嵌套及过于复杂布局(...
    HarryXR阅读 5,147评论 1 19
  • 请保持淡定,分析代码,记住:性能很重要。 启动时间优化 毫无疑问,应用的启动速度越快越好。 本文可以帮助你优化应用...
    Mupceet阅读 11,367评论 5 19
  • 小狗见到响尾蛇,冲过去照头上就舔,蛇直接被扑面而来的热情击晕,三个疑问直击它的灵魂:这货想干啥?它咋看上我了??我...
    流浪老顽童阅读 109评论 0 0
  • 记得小学四年级的时候,学过一篇文章————《幸福是什么》,文章的大意是一个女神引领三个男孩体会幸福的含义,十年之后...
    清浅光阴阅读 263评论 0 0