《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

Android 系统(56)---Android 系统开机日志相关推荐

  1. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化-[Android取经之路]

    摘要:本节主要来讲解Android10.0 日志系统的架构分析,以及logd.logcat的初始化操作 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级 ...

  2. android core log,Android 日志系统(Logcat)的实现分析

    这篇说一下Android 日志系统的实现: 1. Android中的打印分为4个缓冲区和6个打印等级,在frameworks\base\core\java\android\util\Log.java中 ...

  3. Android 系统(238)---查看日志

    阅读错误报告 无论是任何类型的开发工作,出错都在所难免,而错误报告对于找出和解决问题至关重要.Android 的所有版本都支持通过 Android 调试桥 (adb) 获取错误报告:Android 4 ...

  4. 1.3【展讯平台】Android 驱动(Kernel)、系统(framework) 定制,调试日志

    前言 [展讯平台]Android 4.4 驱动(Kernel).系统(framework) 定制,调试日志 正文 1:提高串口日志等级 查看 adb shell cat /proc/sys/kerne ...

  5. 鸿蒙系统怎么取消,华为手机鸿蒙系统 OS 2.0 开机界面演示-去掉了 Powered by Android...

    5月6日鸿蒙系统正式上线,而上个月底部分华为用户收到了鸿蒙系统 OS 2.0 开发者 Beta 公测版推送,我们也多次报道了与 EMUI 系统的对比.接下来我们就为大家带来华为手机鸿蒙系统 OS 2. ...

  6. 【展讯平台】Android 驱动(Kernel)、系统(framework) 定制,调试日志,持续更新中..

    前言 [展讯平台]Android 4.4 驱动(Kernel).系统(framework) 定制,调试日志 正文 1:提高串口日志等级 查看 adb shell cat /proc/sys/kerne ...

  7. Android 系统(11)---android 系统权限大全

    收集到的android权限都很实用的(permission)大全 1.android.permission.WRITE_USER_DICTIONARY 允许应用程序向用户词典中写入新词 2.andro ...

  8. Android毕业设计——基于Android+Tomcat的网络视频探索系统设计与实现(毕业论文+程序源码)——网络视频探索系统

    基于Android+Tomcat的网络视频探索系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Android+Tomcat的网络视频探索系统设计与实现,文章末尾附有本毕业设计的论文和源 ...

  9. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  10. android tasker,Tasker:Android系统增强神器

    权限信息 · net.dinglisch.android.tasker.PERMISSION_RUN_TASKS · net.dinglisch.android.tasker.PERMISSION_A ...

最新文章

  1. 【驱动】GNSS驱动:gpsOneXTRA 援助技术
  2. 《深入理解Java虚拟机》(第二版)学习3:垃圾收集器
  3. 微信公众平台开发(55)刮刮乐
  4. 前端入门技巧之浏览器调试
  5. mf模型 svd++_序列推荐模型(一): FPMC
  6. 问题反馈信息处理平台开发过程
  7. 框架学习八:二维码(Zxing)
  8. MYSQL重置密码遇到ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor:yes)问题
  9. 洛谷——P1420 最长连号
  10. QTP11 5发布,改名UFT
  11. 数独问题流程图_数独-分析、设计、求解思路
  12. 运筹说 第19期 | 线性规划经典例题讲解
  13. CSS外边距重叠和高度坍塌完美解决
  14. 输入一个整数n,统计1-n之间的奇数和。你有几种办法实现?
  15. refactoring的思考
  16. Quick小白书系列(三)MyApp详解
  17. 按洲分组国家地区标准代码
  18. echarts配置详解
  19. 星起航:抖音小店体验分高有哪些好处?
  20. 电商领域如此火爆,大咖们都在做的无货源到底是什么?

热门文章

  1. 6410的系统时钟设置(上)---6410时钟控制逻辑框架分析
  2. ARM11---中断---向量中断控制器(VIC)---结合s3c6410
  3. java flash 压缩_Java和flash通信中数据的zlib压缩与解压缩
  4. python 将列表值赋予函数_python把空列表作为函数默认参数,可是有坑的
  5. 《RabbitMQ 实战指南》第二章 RabbitMQ 入门
  6. ExecutorService--线程池
  7. linux 服务管理
  8. gmail导入foxmail
  9. BZOJ 4443: [Scoi2015]小凸玩矩阵
  10. 小明滚出---响应对象HttpServletResponse和请求对象HttpServletRequest实例