博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android内核开发:学会分析系统的启动log
阅读量:5971 次
发布时间:2019-06-19

本文共 2304 字,大约阅读时间需要 7 分钟。

hot3.png

要学会分析系统的启动log信息,首先得了解系统的启动过程,建议先阅读启动这篇文章,它详细介绍了Android系统的启动过程。其次,你需要知道如何抓取系统启动log信息,建议阅读统计这篇文章,它详细地介绍了如何抓取系统的启动log信息。

 

本文在这2篇文章的基础上,进一步介绍如何深入地分析系统启动log信息,找出Android启动启动过程中每一个部分所消耗的具体时间节点。

 

首先,我们给出一张比较全面的Android系统启动图(来自Embeded Android):

 

 

根据上述Android的启动框图,我们可以顺序地列出Android系统启动中涉及的几个关键步骤:

 

(1) 内核的启动

 

(2) Init程序启动,并启动各个本地服务(如 healthd, debuggerd等)

 

(3) Zygote进程启动

 

(4) Zygote进程初始化工作(preload class/resource)

 

(5) SystemServer进程启动,并启动各个服务(如 ActivityManager, PackageManager等 )

 

(7) 启动结束的标志点

 

如果我们能够从启动log信息中找出上述这些关键步骤的时间节点,也就可以很清晰地得到Android系统启动过程中各个模块消耗的时间了,在做系统启动优化时,也就知道该去优化哪些耗时的模块了,同样,在分析系统启动bug的时候,也就知道到底哪里出了问题了。

 

下面,我们以高通的APQ8064开发板(Android 4.4.2)的启动log信息为例来分析,其实各个Android系统都有类似的log输出,我们只需重点掌握关键节点的TAG和分析方法。

 

1.  配置系统的log输出

 

(1) 在内核log信息中打印出时间信息

 

在Linux kernel源码树中执行 make menuconfig,勾选下面的选项:

 

"Kernel hacking" -> "Show timing information on printks"

 

(2) 将init进程的详细log输出到dmesg文件中

 

修改/system/core/rootdir/init.rc,把loglevel从3改为7

 

2.  抓取系统启动的log信息

 

前面的文章已经介绍过,Android系统启动的log分为Linux内核的log和Android Logger系统的log,

 

抓取的方法如下:

 

$ adb shell dmesg > dmesg.txt

$ adb logcat -d -v time -b "main"   >  main.txt

$ adb logcat -d -v time -b "system" >  system.txt

$ adb logcat -d -v time -b "events" >  events.txt

 

3.  分析log信息

 

(1) Linux内核的启动

 

Linux内核启动的log都位于dmesg.txt文件中,从log文件开始直到出现下面这条消息则标志着Linux内核已经完成了启动:

 

"Freeing init memory"

 

因此,我们从dmesg.txt文件中即可得到APQ8064开发板的Linux内核启动只用了6.613s,如图所示:

 

 

(2) Init程序启动,并启动各个本地服务(如 healthd, debuggerd等)

 

Init程序的log信息也位于dmesg.txt文件中,我们可以通过检索“init”找到该程序的打印消息。

 

通过检索“init starting”,我们可以找到init进程启动了哪些本地服务,如:

 

 

(3) Zygote进程启动

 

zygote进程是在init进程中启动的,因此,我们从上面init进程的输出log中,检索"zygote"就可以找到zygote进程何时启动的,如图所示:

 

 

(4) Zygote进程初始化工作(preload class/resource)

 

Zygote进程所输出的log信息被放到/dev/log/main文件中了,因此,我们需要检索main.txt得到Zygote的log信息。

 

由于后续所有的Android应用程序都是从Zygote进程fork出来的,Android系统为了提高应用程序的启动速度,会在Zygote进程初始化过程中加载一些常用的class和资源文件到进程的内存中,从而共享常用的class和resourse资源。这个过程我们可以通过检索"preload"标签得到这个过程所消耗的时间,如图所示:

 

 

(5) SystemServer进程启动,并启动各个Java服务(如 ActivityManager, PackageManager等 )

 

Zygote完成了初始化工作后就启动SystemServer进程了,SystemServer进程的log信息被放到了/dev/log/system文件中了,因此,我们需要检索system.txt文件得到SystemServer的log信息,如图所示:

 

 

(7) 启动结束的标志点

 

《Android内核开发:如何统计系统启动时间》这篇文章已经详细地介绍了如何找到启动结束的时间,这里选取其中一种方法再复述一遍,就是检索dmesg文件的 "boot_completed" 标志,如图所示,我们知道了整个系统一共耗时29.913s完成启动:

 

 

结束语

 

免费学习更多精品课程,登录乐搏学院官网

或关注我们的官方微博,还有更多惊喜哦~

 

本文出自 “” 博客,请务必保留此出处

转载于:https://my.oschina.net/learnbo/blog/789643

你可能感兴趣的文章
spring boot admin slack报警
查看>>
python3备份交换机配置脚本
查看>>
MQ学习小记
查看>>
【104天】前端碎片知识收集00002
查看>>
Python标准库系列之模块介绍
查看>>
Vue源码详解之nextTick:MutationObserver只是浮云,microtask才是核心!
查看>>
NPM入门笔记
查看>>
关于圣杯布局和双飞翼布局
查看>>
对象和数组的遍历
查看>>
整理Object的一些方法
查看>>
一文盘点MWC 2019所有5G设备和研发进展
查看>>
微软正式发布Azure Functions 2.0
查看>>
火掌柜iOS端基于CocoaPods的组件二进制化实践
查看>>
超级 App 手机百度云端架构设计与个性化推荐
查看>>
携程对AIOps场景和算法的探索与实践
查看>>
Cable:360实现的新虚拟网络架构
查看>>
Visual Studio推出改进的C/C++支持
查看>>
为什么选择PostgreSQL而不是MySQL
查看>>
创建快乐的工作环境
查看>>
解读:Java 11中的模块感知服务加载器
查看>>