Android开机log分析
分析开机log,一是可以理一下android启动流程,二是可以通过log定位错误
首先,我们给出一张比较全面的Android系统启动图
根据上述Android的启动框图,我们可以顺序地列出Android系统启动中涉及的几个关键步骤:
(1) Linux内核的启动
(2) Init程序启动,并启动各个本地服务(如 healthd, debuggerd等)
(3) Zygote进程启动
(4) Zygote进程初始化工作(preload class/resource)
(5) SystemServer进程启动,并启动各个Java服务(如 ActivityManager, PackageManager等 )
(7) 启动结束的标志点
如果我们能够从启动log信息中找出上述这些关键步骤的时间节点,也就可以很清晰地得到Android系统启动过程中各个模块消耗的时间了,在做系统启动优化时,也就知道该去优化哪些耗时的模块了,同样,在分析系统启动bug的时候,也就知道到底哪里出了问题了。
分析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进程初始化过程中加载一些常用的java 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完成启动:
2.、下面列举一些常见android程序发生错误时抛出的异常,查找关键字xxxException可以快速定位android层错误以及原因: