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

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

回顾:

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

原文发布于微信公众号 - 代码GG之家(code_gg_home)

原文发表时间:2018-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Linux 软中断机制分析

软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些ta...

4638
来自专栏我是攻城师

多线程基础知识了解一下

作为一名优秀的攻城师,了解多线程的知识非常有必要,尤其在人工智能和机器学习的热潮下,如何提高程序或者算法的运行效率是非常有价值的一件事情。

2473
来自专栏BestSDK

一个“爆款”成功的API,都离不开这8条设计准则

我已经看过很多API设计相关的文章和优秀的REST API设计教程。他们通常讨论的是适当的编码技巧和如何在给定的语言中暴露接口。尽管那些是很有用也是很需要的,但...

3787
来自专栏Ceph对象存储方案

RGW Bucket Shard设计与优化-上

1 bucket index背景简介 bucket index是整个RGW里面一个非常关键的数据结构,用于存储bucket的索引数据,默认情况下单个bucke...

1.1K5
来自专栏F-Stack的专栏

F-Stack Q&A 第三期

Q1:如果在一个阻塞型的socket上执行recv,会不会把相应的线程卡死,调用recv时该socket中没有数据包,导致sleep,sleep导致该线程没办法...

5799
来自专栏信安之路

web测试方法工具篇

之前写过一个文章《web应用渗透测试流程》,这个文章的主要内容是关于一个web应用如何进行测试,测试什么地方,没有过多的提供使用的工具,只是一个针对web测试的...

1130
来自专栏Java后端技术栈

为什么说Redis是单线程的?

近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”、什么是“热数据和冷数据” ,复杂一点的会问到缓存雪崩、缓存穿透、缓存预热、缓...

1292
来自专栏鸿的学习笔记

流处理

流处理比起之前的批处理而言,需要考虑的东西更多。批处理有个前提,那就是输入必定是固定的大小,而流处理处理的数据是不会暂停的,与线上服务需要处理的数据也不一样,线...

901
来自专栏JAVA高级架构开发

Redis 的各项功能解决了哪些问题?

Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用。同时支持strings,lis...

950
来自专栏杂七杂八

itchat实现微信好友头像拼接图

偶然在网上发现itchat这个框架,itchat是一个开源的微信个人号接口,它使python调用微信变得非常简单。看到网上有人发自己微信好友的头像拼接图,自己也...

3978

扫码关注云+社区