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启动过程中的重要节点。 要学会分...

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

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

ELK stack实战之结合rsyslog分析系统日志(auth.log)

本篇文章我们主要谈一下linux操作系统的rsyslog(syslog),然后结合elk stack做一个分析autho.log(linux自己生成的日志)的demo...

[NoSQL]使用Log4Mongo搭建日志分析系统

搭建MongoDB: 1.在http://www.mongodb.org/downloads下载mongodb-win32-x86_64-2008plus-2.6.7.zip并解压。 2.在mong...

ELK 日志分析系统+redis+log4j

ELK 日志分析系统

从Nginx的Access log分析系统的健康度

公司很多系统都可以在运维管理平台里面查看应用的健康度,所谓健康度就是某个接口在某段时间内的响应时间、访问次数、响应状态码情况,比如说A接口在2016-2-22这天,访问次数为6000次,平均响应时间8...
  • zth1002
  • zth1002
  • 2016年02月22日 11:34
  • 390

Linux内核分析之五——分析系统调用(system_call)的执行机制

作者:姚开健 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 当系统进行系...

【技术分享】Android App常见安全问题演练分析系统-DIVA-Part1

只有我看到DIVA的时候想到的是D.VA嘛?!滑稽脸 I. 什么是DIVA DIVA(Damn insecure and vulnerable App)是一个故意设计的存在...

Java开发的流量分析系统

Java开发的流量分析系统一,此系统是网上搜的潭州学院的Tony老师的视频学习的,用于实时分析一个网站的访问量的简单的例子,主要功能是用户登录,展示在线人数以及信息。其中细致的讲解了单例模式,Vect...

Android恶意程序行为分析系统设计

  • 2014年09月29日 23:15
  • 419KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android内核开发:学会分析系统的启动log
举报原因:
原因补充:

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