关于openharmony:OpenHarmony标准系统开机时长优化

89次阅读

共计 3424 个字符,预计需要花费 9 分钟才能阅读完成。

简介

万物互联时代,产品性能至关重要,而系统启动工夫是零碎性能的重要组成部分,因为用户必须期待系统启动实现后能力应用设施。对于常常须要进行冷启动的汽车等设施而言,较短的启动工夫至关重要(没有人喜爱在期待几十秒后能力输出导航目的地),在金融交易设施、电子商务服务器、实时通信设施同样也有较高的利用场景,那咱们该如何在 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"]
    }
]
  1. 提前加载开机动画图片;

    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_);
    
  2. 指定开机动画显示帧率;

    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 规范零碎下性能优化的性能应该有了初步的理解。如果您对本篇文章内容感兴趣,能够依据本篇文章介绍进行钻研和应用。同时也欢送更多开发者与咱们共享开发成绩,分享技术解读与教训心得。

正文完
 0