Android内核开发:学会分析系统的启动log

转载 2017年01月03日 09:49:32
 Android内核开发:学会分析系统的启动log
2015-06-17 21:11:27
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/1662911

本文是《Android内核开发》系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点。


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


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


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


wKioL1WBbnDTaqQlAAJ4msbU3f0944.jpg


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


(1) Linux内核的启动


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


(3) Zygote进程启动


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


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


(7) 启动结束的标志点


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


下面,我们以高通的APQ8064开发板(Android 4.4.2)的启动log信息为例来分析(这些log文件上传到我的Github上了:https://github.com/Jhuster/AOSP/tree/master/logs/APQ8064),其实各个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,如图所示:


wKioL1WBcBOQBimqAAAouZFmP0c299.jpg


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


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


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


wKiom1WBbouiU3HlAAeKNfLsVoY385.jpg


(3) Zygote进程启动


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


wKioL1WBcGLxLbvZAAAxIazSkdg520.jpg


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


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


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


wKioL1WBcI2QQ24VAADbZAseC7w046.jpg


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


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


wKiom1WBbv6QYTP9AA1W3Tk_JEk001.jpg


(7) 启动结束的标志点


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


wKiom1WBbyHiG2-XAABTfQTyDMI651.jpg


4. 小结


关于深度解析Android系统的启动log信息就介绍到这里了,有任何疑问或者建议欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。


本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/1662911

Android内核开发:学会分析系统的启动log

本文是《Android内核开发》系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点。 要学会分...
  • u010164190
  • u010164190
  • 2016年05月13日 20:22
  • 384

Android内核分析系统的启动log

本文是《Android内核开发》系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点。 要学会分...
  • qeqeqe236
  • qeqeqe236
  • 2017年07月20日 15:40
  • 155

Android内核开发:源码的版本与分支详解

我想很多初学者或许跟我一样,看完Android源码下载相关的文章以后,就开始兴致勃勃地去下载Android源码了,但是下载完了源码后,有没有像我一样产生如下几个困惑呢? (1) An...
  • koozxcv
  • koozxcv
  • 2015年11月19日 19:46
  • 3078

Android 内核开发初步

Android 的内核是 Linux ,自从 linux 内核版本 3.3 开始,Android 对 Linux 的修改已经整合进入 Linux 内核树 . 但是从 kernel.org 获取的代码...
  • jingxia2008
  • jingxia2008
  • 2012年07月24日 11:12
  • 3169

Android内核开发:图解Android系统的启动过程

本文是《Android内核开发》系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载、版本和分支介绍、编译和烧写等等,从本文起就要开始真正地进行A...
  • qq_23174861
  • qq_23174861
  • 2016年03月16日 22:26
  • 371

Android 如何抓取开机Log

Android 如何抓取开机Log    一般分析开机失败或者开机过程异常问题,都牵涉到如何抓取开机log的问题,为了顺利抓取开机Log便于分析问题,参照如下抓取有效log: 1.如...
  • u010164190
  • u010164190
  • 2016年01月16日 19:03
  • 3436

屏蔽开机的android_kernel_log信息---->lk.bin

最近在开机加一些自己的测试程序,编译的是eng版本,希望安卓开机后能够看到自己的调试信息,可是一开机就会有很多其它的信息干扰我的调试,那么如何屏蔽掉kernel的kmsg打印的这些信息呢?很简单,我们...
  • morixinguan
  • morixinguan
  • 2016年12月26日 15:56
  • 844

Android内核开发 相关工具及源码下载汇总

ADT Android SDK下载 Android SDK在线更新国内镜像服务器资源 Android NDK下载 Goldfish Android kernel 3.4.0下载...
  • Leytton
  • Leytton
  • 2016年10月05日 12:32
  • 679

android:分享 一个很强大的LOG开关---Log.isLoggable

1、API亮点: 此API可以实现不更换APK,在出问题的手机上就直接能抓到有效log,能提升不少工作效率。 2、API介绍 最近在解决短信问题时,看到一个很强大的LOG开关---Log.isL...
  • u012554768
  • u012554768
  • 2014年10月23日 10:47
  • 5036

开机启动时将log日志写入到SDcard

需求分析: 手机开机启动后,开始收集log日志信息并且将日志保存到SDcard。 功能实现: (1)Manifest.xml文件 ...
  • oWeiXiao123
  • oWeiXiao123
  • 2013年07月11日 10:19
  • 3215
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android内核开发:学会分析系统的启动log
举报原因:
原因补充:

(最多只允许输入30个字)