写点什么

OpenHarmony 标准系统开机时长优化

  • 2023-04-10
    上海
  • 本文字数:2603 字

    阅读完需:约 9 分钟

OpenHarmony标准系统开机时长优化

简介

万物互联时代,产品性能至关重要,而系统启动时间是系统性能的重要组成部分,因为用户必须等待系统启动完成后才能使用设备。对于经常需要进行冷启动的汽车等设备而言,较短的启动时间至关重要(没有人喜欢在等待几十秒后才能输入导航目的地),在金融交易设备、电子商务服务器、实时通信设备同样也有较高的应用场景,那我们该如何在 OpenAtom OpenHarmony(简称 OpenHarmony ) 标准系统现有的能力下,完成秒级开机?本文由深圳市优博终端科技有限公司的研发同学介绍一套关于优化 OpenHarmony 标准系统开机时长优化的方案,通过对硬件、Kernel、 Framework 的相应优化让系统开机时长尽量缩短。


效果展示

下面给出系统开机时长优化前后的对比效果视频,优化前的开机时长在 18 秒左右,优化后的开机时间在 7 秒左右。


开发环境

硬件平台:RK3588

系统版本:OpenHarmony 3.1 Release

开发语言:C、 C++


四步带你体验 OpenHarmony 标准系统开机时长优化


一、调整硬件资源使用率

调整硬件资源相应配置参数使之尽可能地达到最优运行状态,这里所指的硬件资源是指 RAM、FLASH。


RAM:运存的调优需要根据厂商的指导文档在设备树文件<.dtsi 文件>中进行调整,比如设定运存的时钟频率 memory-frequency、设定内存带宽 memory-bandwidth、内存时序 memory-timings 等,Kernel 层可以对 swappiness、dirty_ratio、dirty_background_ratio、min_free_kbytes 等相应值进行调整,来达到运存的性能调优。


FLASH:比如对 physical_block_size 项进行调整,目前 OpenHarmony 采用的文件系统为 ext4,可以在熟悉 ext4 文件系统后,然后对其中缓存、模式、压缩、清理等方向进行调优。减少 KMSG 与 HiLog 日志输出,调整其输出等级。


二、Kernel 启动时长优化

Kernel 启动阶段会进行硬件检测、驱动加载、文件系统挂载、设置网络等,其中耗时比较长的基本上为驱动加载,因为这中间会有重复尝试跟 Sleep 的时间,需要重点关注,在 Kernel 启动的过程中可以将一些无用的子系统进行裁剪,比如 bootchart。


三、系统框架启动时长优化

在系统层启动时,需要启动很多服务,可以采用并行启动系统必要服务,延迟启动非必要服务,这些服务从加载到启动完成、其中比较耗时的有 so 加载,可采用多线程的方式对其进行加载,下面贴出多线程加载多个 so 文件的 Demo 代码;

#include <iostream>#include <dlfcn.h>#include <thread>#include <vector>#include <string>void thread_func(void* handle){    // 空函数}int main(){    std::vector<std::string> lib_names = {"mpp1.so", "mpp2.so", "mpp3.so"};    std::vector<void*> handles;    for (const auto& lib_name : lib_names) {        void* handle = dlopen(lib_name.c_str(), RTLD_LAZY);        if (handle == nullptr) {            std::cerr << "Error loading library " << lib_name << ": " << dlerror() << std::endl;            return 1;        }        handles.push_back(handle);    }    std::vector<std::thread> threads;    for (const auto& handle : handles) {        threads.emplace_back(thread_func, handle);    }    for (auto& thread : threads) {        thread.join();    }    for (const auto& handle : handles) {        dlclose(handle);    }    return 0;}
复制代码


如果发现加载的单个 so 文件过大时,可采用多线程分段加载此 so 文件。


四、 开机动画显示优化

优化思路大致为进入 bootAnimation 的 main 函数后,将动画图片采用数组或者链表的方式进行预加载,开启每秒 60 帧的刷新率,此处为什么要开 60 帧,因为如果设定为 30 帧时,出现掉帧的情况后,会出现肉眼可见的卡顿。当图片播放完成后,延迟几百毫秒左右再进入桌面,因为 Launcher 加载已安装的 app ,需要一定的时间。下面是开机动画优化的部分内容 :


  1. 提高开机动画、渲染进程优先级

"services" : [{        "name" : "render_service",        "path" : ["/system/bin/render_service"],        "uid" : "root",        "importance" : -20,        "gid" : ["system", "shell", "uhid", "root"]    }, {        "name" : "bootanimation",        "path" : ["/system/bin/bootanimation"],        "once" : 1,        "importance" : -20,        "uid" : "root",        "gid" : ["system", "shell", "uhid", "root"]    }]
复制代码


2.提前加载开机动画图片;

ReadZipFile(BOOT_PIC_ZIP, imageVector_, jsonConfig);imgVecSize_ = static_cast<int32_t>(imageVector_.size());if (imgVecSize_ <= 0) {    PostTask(std::bind(&AppExecFwk::EventRunner::Stop, runner_));    LOGE("zip pic num is 0.");    return;}
SortZipFile(imageVector_);
复制代码


  1. 指定开机动画显示帧率;

OHOS::Rosen::VSyncReceiver::FrameCallback fcb = {    .userData_ = this,    .callback_ = std::bind(&BootAnimation::onVsync, this),};int32_t changefreq = static_cast<int32_t>((1000.0 / freq_) / 16);ret = receiver_->SetVSyncRate(fcb, changefreq);
复制代码


开机优化需要借助一些工具来分析比如串口工具、bootchart 生成的可视化图表来进行分析。OpenHarmony 标准系统默认集成了 bootchart,下面介绍如何使用 bootchart 工具来获取开机性能数据及生成性能图片:

(1) 开机完成后,运行 hdc_std shell

(2) 运行 begetctl bootchart enable

(3) 运行 reboot 或者断电重启

(4) 运行 begetctl bootchart stop

(5) 运行 begetctl bootchart disable

(6) 进入到/data/bootchart/文件夹下查看是否有

(7) header、proc_diskstats.log、proc_ps.log、proc_stat.log

(8) 在/data/bootchart/目录下执行命令:tar -czf bootchart.tgz *

(9) 将 bootchart.tgz 导出到本地磁盘上

(10) hdc_std file recv /data/bootchart/bootchart.tgz ./

(11) 生成开机性能图片 java -jar bootchart.jar bootchart.tgz


上面的 bootchart.jar 需要下载源码去编译生成或者下载他人已经编译好的 jar 包。源码下载地址 https://sourceforge.net/projects/bootchart/

下图为 bootchart 生成的 OpenHarmony 性能可视化视图。


总结

通过本篇文章介绍,您对 OpenHarmony 标准系统下性能优化的功能应该有了初步的了解。如果您对本篇文章内容感兴趣,可以根据本篇文章介绍进行研究和使用。同时也欢迎更多开发者与我们共享开发成果,分享技术解读与经验心得。



用户头像

OpenHarmony开发者官方账号 2021-12-15 加入

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展

评论

发布
暂无评论
OpenHarmony标准系统开机时长优化_OpenHarmony_OpenHarmony开发者_InfoQ写作社区