一丶环境信息

源码版本:OpenHarmony-4.1-Release

板子型号:dayu200(RK3568)

二丶Bootchart工具

在开机优化时,我们需要借助Bootchart工具,当前OpenHarmony已经支持了Bootchart工具,我们可以直接使用Bootchart工具,Bootchart工具介绍如下:

  • 概述
    Bootchart是一个用于系统启动过程性能分析的开源软件工具。它可以在内核装载后就开始运行,记录系统启动过程中各个程序启动所占用的时间、CPU使用情况以及硬盘读写情况,直到系统启动完成为止。进入系统后,Bootchart可以将启动时记录下的内容生成多种格式(如PNG或PDF)的图形报表,以便用户进行深入分析。

  • 功能与用途

  1. 分析系统启动时间和启动过程中资源的使用情况。
  2. 发现可能影响系统启动速度的因素,如某些进程启动缓慢或占用过多资源等。
  3. 对系统进行优化,提高系统启动速度和运行效率。
  • 主要特点
  1. 简单易用:只需在系统启动时启用Bootchart,即可生成详细的分析报告。
  2. 全面详细:Bootchart可以记录系统启动过程中的各种数据,包括CPU使用率、内存使用量、磁盘I/O等,并以图表形式展示出来。

通过Bootchart工具,开发者可以深入了解系统的启动过程,并对其进行详细的性能分析,从而优化系统启动速度和运行效率。

三丶开机优化

开机优化的主要目的是为了快速启动开机动画和退出开机动画(显示桌面)。所以在优化之前,我们需要了解一下OpenHarmony系统中投票机制,此机制是针对开机动画而设计的,参考文档:OpenHarmony开机动画流程_小~Q-Laval社区

可以使用Bootchart工具抓一份火焰图如下所示:

img

可以看到用户态/bin/init->deviceprofile之间的启动时序,从kthreadd之后都是内核态的进程,这段优化暂且不关注,本文的只关注用户态的。

四丶启动顺序

从火焰图来看,bootanimation服务启动比较靠后,而通过投票机制所知,涉及投票的SA服务有:

param get | grep ohos.boot.time

ohos.boot.time.kernelinit进程init.cfg
ohos.boot.time.initinit进程init.cfg
ohos.boot.time.wms.fullscreen.ready窗口子系统foundation.cfg
ohos.boot.time.samgr.readySamgrsamgr_standard.cfg
ohos.boot.time.boot.completedinit进程init.cfg
ohos.boot.time.param_watcher.startedparam_watcherparam_watcher.cfg
ohos.boot.time.appspawn.startedappspawnappspawn.cfg
ohos.boot.time.useriam.fwkreadyUseriamuseriam.cfg
ohos.boot.time.appfwk.ready元能力foundation.cfg
ohos.boot.time.account.ready账号服务accountmgr.cfg
ohos.boot.time.lockscreen.readyhap锁屏服务foundation.cfg
ohos.boot.time.bootanimation.readybootanimation进程graphic.cfg
ohos.boot.time.bootanimation.startedbootanimation进程graphic.cfg
ohos.boot.time.bootanimation.finishedbootanimation进程graphic.cfg

所以这个时候我们可以从启动顺序来入手,由于init是用户态的第一个程序,是1号进程,所以对应的init.cfg就无需修改,而需要修改的就是foundation.cfg/samgr_standard.cfg/param_watcher.cfg/appspawn.cfg/useriam.cfg/access_token.cfg/graphic.cfg。那么如何修改这些cfg文件,能够保证启动顺序提前呢?在文档:

zh-cn/device-dev/subsystems/subsys-boot-init-service.md · OpenHarmony/docs - Gitee.com

中有一个start-mode字段,可以提前启动顺序,我们先来看看详细的定义:

start-mode可选标准系统服务的启动模式。类型:字符串, 如 "start-mode" : "condition"。                                                           目前支持"boot", "normal", "condition"。具体说明参考:init服务启动控制。
  • init服务启动控制(仅标准系统以上提供)init会根据用户的服务配置,把服务分成三类,在不同的阶段并行启动。
    • “boot”类型:对应系统中需要优先启动的服务,该类服务在“init”阶段启动。
    • “normal”类型:默认配置,对应系统中的普通服务,该类服务在“post-init"阶段启动。
    • “condition”类型:必须通过启动命令启动,通过在jobs中添加“start xxxx”来启动对应服务。
    而查看samgr_stanard.cfg/appspawn.cfg等配置文件发现,cfg文件中已经有了"start-mode" : "boot"等字段,而foundation.cfg/accountmgr.cfg/graphic.cfg等cfg文件中,还未配置,不知道这些配置文件在RK3568设备中是否有意放在二阶段启动,所以针对我们自己的产品可以在graphic.cfg文件中增加字段"start-mode" : "boot"来提前开机动画的启动顺序。如图所示:

img

然后将graphic.cfg文件推入进去

hdc_std shell mount -o remount,rw /
hdc_std file send ./graphic.cfg /system/etc/init/
hdc_std shell reboot

然后重新抓取火焰图如下图所示:

img

可以看到bootanimation服务已经提前了,而且相关的bootanimation投票也提前了,这个可以用 param get | grep ohos.boot.time 做对比。
修改前:

# param get | grep ohos.boot.time
    ohos.boot.time.kernel = 5537210
    ohos.boot.time.init = 10416358
    ohos.boot.time.wms.fullscreen.ready = 15211367
    ohos.boot.time.samgr.ready = 10458907
    ohos.boot.time.boot.completed = 19373746
    ohos.boot.time.param_watcher.started = 10459057
    ohos.boot.time.appspawn.started = 11468966
    ohos.boot.time.useriam.fwkready = 11864341
    ohos.boot.time.appfwk.ready = 13266774
    ohos.boot.time.account.ready = 13625761
    ohos.boot.time.lockscreen.ready = 15299111
    ohos.boot.time.bootanimation.ready = 12451068
    ohos.boot.time.bootanimation.started = 14088725
    ohos.boot.time.bootanimation.finished = 19373672

修改后:

# param get | grep ohos.boot.time
    ohos.boot.time.kernel = 5586509
    ohos.boot.time.init = 10401376
    ohos.boot.time.wms.fullscreen.ready = 14766809
    ohos.boot.time.samgr.ready = 10413935
    ohos.boot.time.boot.completed = 19100843
    ohos.boot.time.param_watcher.started = 10414320
    ohos.boot.time.appspawn.started = 10780621
    ohos.boot.time.useriam.fwkready = 11267694
    ohos.boot.time.appfwk.ready = 12927512
    ohos.boot.time.account.ready = 13355032
    ohos.boot.time.lockscreen.ready = 14901581
    ohos.boot.time.bootanimation.ready = 11741167
    ohos.boot.time.bootanimation.started = 13810675
    ohos.boot.time.bootanimation.finished = 19100758

所以依次可修改foundation.cfg/access_token.cfg等跟投票机制有关的sa服务。
不过这个可能跟设备相关,有些cfg文件提前可能效果不显著,有些提前会有很明显的效果。

五丶注意事项

1.需要标准系统以上。
2.如果开启了selinux功能的话,需要关闭selinux功能,才能抓取火焰图。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐