Android8.0 开机速度优化:系统初步评估

一、android系统介绍

通过上一篇的开机速度的优化步骤,我们知道优化一个系统,首先需要了解这个系统是由哪些部分组成,启动流程是怎么样的。这部分内容,这里简单介绍下。
以下是android系统框图,通过这个图我们可以大概的清楚系统是有哪些部分组成的。
此图来自:developer.android.com

(此图来自: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系统用户空间部分

  1. bootchart 可以用来看启动耗时,但这个是kernel启动到android 系统属性boot_completed被设置为1时的时间差。
  2. 通过“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启动完成的时间。
也可以通过秒表或者拍视频等方式的计算,上电到可操作界面出来的时间。

扫描二维码关注公众号,回复: 8535410 查看本文章

这是整体的时间估算方式,优化中,我们还是需要更细节的、阶段性的耗时分析,可以通过一些调试方法,去进一步的分析,比如Kernel设置initcall_debug参数,分析kernel启动过程中各模块的耗时等等。

发布了2 篇原创文章 · 获赞 0 · 访问量 84

猜你喜欢

转载自blog.csdn.net/fd_yangzhao/article/details/103934293