一、android系统介绍
通过上一篇的开机速度的优化步骤,我们知道优化一个系统,首先需要了解这个系统是由哪些部分组成,启动流程是怎么样的。这部分内容,这里简单介绍下。
以下是android系统框图,通过这个图我们可以大概的清楚系统是有哪些部分组成的。
(此图来自:developer.android.com)
Android系统的启动流程,简单理解的话就是:
硬件设备上电–>引导加载程序启动–>kernel启动–>第一个应用init启动–>Zgote启动–>SystemSever启动–>主界面(Launcher)。
当然这个启动流程是省略了很多重要部分,尤其是对于优化启动时间而言。
这里只作为初步评估系统时使用,以及对整个系统启动流程不熟悉的人,有个大体轮廓的了解,熟话说站的高看的远,才能事半功倍,对于不熟悉的代码,首先应该了解其框架是怎么样的,我们才能够有了继续深入的方向。
(此流程图来自:https://www.cnblogs.com/blogs-of-lxl/p/11272756.html )
二、 评估启动各个阶段的耗时情况
通过串口工具和adb获取启动信息,如何(在不同的工作系统上)使用工具可以参考后续文章。
用到的工具:串口工具和adb。
2.1 底层部分
从串口信息开始:
通过类似上面的信息和时间戳,可以大概估计出
- uboot 的启动时间:可以粗略的根据串口刚输出的时间戳到"Starting kernel …" 的差值,判断uboot启动时间;(如上图左边的红框)
注意:如果主芯片是通过其他MCU供电的话,也需要关注下这段时间的耗时。 - kernel镜像拷贝解压的时间: 可以根据"Starting kernel …"到 “Booting linux …”的时间差估算;
注意:“Booting linux …”的时间戳, 并非kernel 实际启动时间,还包括了kernel初始化,直到串口初始完成,能够输出信息。 - kernel启动的时间:可以根据第一条log到“Freeing unused …”的时间差来估算。
2.2 android系统用户空间部分
- bootchart 可以用来看启动耗时,但这个是kernel启动到android 系统属性boot_completed被设置为1时的时间差。
- 通过“adb logcat -b events -d >boot_events.txt” 可以抓取log,用来分析android用户空间的(相对于底层),各个阶段的耗时情况。
通过过滤如下信息,判断各阶段耗时情况:
参考:
famework/base/services/core/java/com/android/server/am/EventLogTags.logtags
famework/base/services/core/java/com/android/server/EventLogTags.logtags
famework/base/services/core/java/com/android/server/EventLogTags.logtags
过滤出来的信息类似:
通过log信息,根据上面表格,计算各个阶段的时间差值,得出每个阶段的耗时情况,比如apk扫描花了多少时间等等。
可以知道哪个阶段耗时占比大,优化空间在什么地方。
2.3 android系统完整启动时间
如上所述,结合串口信息和bootchart可以估计出,系统从bootloader(uboot)到android启动完成的时间。
也可以通过秒表或者拍视频等方式的计算,上电到可操作界面出来的时间。
这是整体的时间估算方式,优化中,我们还是需要更细节的、阶段性的耗时分析,可以通过一些调试方法,去进一步的分析,比如Kernel设置initcall_debug参数,分析kernel启动过程中各模块的耗时等等。