前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >只需一个命令,快速定位android的启动耗时

只需一个命令,快速定位android的启动耗时

作者头像
用户1263308
发布2018-02-02 11:24:52
1.2K0
发布2018-02-02 11:24:52
举报
文章被收录于专栏:代码GG之家代码GG之家

有兴趣合作,帮忙制作公众号的一些宣传图册的伙伴,可以加我微信,商谈具体事宜。

回顾:

Android 启动过程框架

这节我们讲一个命令,用来定位android启动过程耗时,具体为:

进入shell,cat /proc/bootprof

即可看到一堆类似如下的输出:

首先我们看到的是这几个部分: preload lk

这两个属于uboot的过程,一般这里时间不用关心。

后续进行加载kernel

kernel初始化的时间,会持续到init进程的创建。这里关注的点就是,每个驱动module的加载时间,类似于 initcall: event_trace_init 584.964463ms 这里会打印出哪个模块 耗时多少ms。

这些log,都是可以从代码中找出,因此可以定位到log的地方,去看下驱动模块的加载过程。

比如这里的initcall:

我们继续查找调用,

再向前找一步:

这里我们可以看到,kernel对于驱动module的调用方法,从这里向上追溯,则可以去定位kernel加载起来的一个过程。

(代码,要在一条明确地追踪线下,才能有所收获,有所突破。不能一味的强制自己去阅读代码,而应该自己带着一个线索,去在代码中,先探出一条路来,然后在反复游走在此路,观赏沿途的风景。)

看下这个总时间是否超长,然后去细化看下哪些驱动加载耗时,将一些无用的驱动加载可以移除掉,加快开机时间。kernel启动结束的时间(这个关键字确定Kernel_init_done)

init 进程初始化,会创建一系列的进程

比如 ccci_md3 vold ,这里也会将每个进程的创建开始和结束打印出来。 然后我们进入zygote进程的创建,看到加载预处理的jar so,可以看到这些耗时。

这些,可以去看下是否有无效的库加入进来,进行裁剪移除。 完成后,进入system_server进程

我们看到一系列的线程启动,然后去看哪些比较耗时,进行裁剪或者优化。 这里我们着重需要关注的是pms,第一次开机后,需要一直做odex的预优化

类似于 PMS:performDexOpt:com.mediatek.ims

这个过程变成了启动的最大瓶颈,我们可以进行配置虚拟机的参数,让其默认便优化,可以减少启动耗时。

然后结束后,ams的systemReady 打印出来,进入第一个界面。

总结:从此文件,可以看到整个启动过程,所经历的每个步骤的时间,然后,我们可以去查看哪个阶段耗时,然后着重进行优化处理。

除此之外,我们还需要进行别的方位的优化,这时就需要查看下log信息,看下log中是否出现一些调试信息,kernel中关闭debug的一些开关。比如mtk的默认将libc的mem debug开启,导致内存的申请会变得比较慢,这时我们就可以进行关闭,来保证性能。 还有一些,可以去从log看到,比如有些权限出现异常,导致一直在申请权限,输出log中频繁出现avc同一个类别,那么我们可以将此权限配置进入selinux中,用来降低此进程频繁申请权限,占用的cpu时间。 关于优化,都是细细观察,从对比中,log中发现蛛丝马迹,然后进行查验,定位优化方向。 好了,今天就说到这,更多精彩,敬请期待。

延伸: 深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记 http://blog.csdn.net/forever_2015/article/details/53000643

lk启动流程详细分析 https://www.cnblogs.com/xiaolei-kaiyuan/p/5458145.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码GG之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档