0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開(kāi)機(jī)時(shí)長(zhǎng)優(yōu)化

OpenAtom OpenHarmony ? 來(lái)源:未知 ? 2023-04-08 02:50 ? 次閱讀

點(diǎn)擊藍(lán)字 ╳ 關(guān)注我們


開(kāi)源項(xiàng)目 OpenHarmony
是每個(gè)人的 OpenHarmony

戴學(xué)躍

深圳市優(yōu)博終端科技有限公司

OpenHarmony知識(shí)體系工作組

簡(jiǎn)介

萬(wàn)物互聯(lián)時(shí)代,產(chǎn)品性能至關(guān)重要,而系統(tǒng)啟動(dòng)時(shí)間是系統(tǒng)性能的重要組成部分,因?yàn)橛脩?hù)必須等待系統(tǒng)啟動(dòng)完成后才能使用設(shè)備。對(duì)于經(jīng)常需要進(jìn)行冷啟動(dòng)的汽車(chē)等設(shè)備而言,較短的啟動(dòng)時(shí)間至關(guān)重要(沒(méi)有人喜歡在等待幾十秒后才能輸入導(dǎo)航目的地),在金融交易設(shè)備、電子商務(wù)服務(wù)器、實(shí)時(shí)通信設(shè)備同樣也有較高的應(yīng)用場(chǎng)景,那我們?cè)撊绾卧贠penAtom OpenHarmony(簡(jiǎn)稱(chēng)OpenHarmony ) 標(biāo)準(zhǔn)系統(tǒng)現(xiàn)有的能力下,完成秒級(jí)開(kāi)機(jī)?本文由深圳市優(yōu)博終端科技有限公司的研發(fā)同學(xué)介紹一套關(guān)于優(yōu)化OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開(kāi)機(jī)時(shí)長(zhǎng)優(yōu)化的方案,通過(guò)對(duì)硬件、Kernel、 Framework的相應(yīng)優(yōu)化讓系統(tǒng)開(kāi)機(jī)時(shí)長(zhǎng)盡量縮短。

效果展示

下面給出系統(tǒng)開(kāi)機(jī)時(shí)長(zhǎng)優(yōu)化前后的對(duì)比效果視頻,優(yōu)化前的開(kāi)機(jī)時(shí)長(zhǎng)在18秒左右,優(yōu)化后的開(kāi)機(jī)時(shí)間在7秒左右。



開(kāi)發(fā)環(huán)境

硬件平臺(tái):RK3588
系統(tǒng)版本:OpenHarmony 3.1 Release
開(kāi)發(fā)語(yǔ)言:C、 C++

四步帶你體驗(yàn)OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開(kāi)機(jī)時(shí)長(zhǎng)優(yōu)化

一、調(diào)整硬件資源使用率
調(diào)整硬件資源相應(yīng)配置參數(shù)使之盡可能地達(dá)到最優(yōu)運(yùn)行狀態(tài),這里所指的硬件資源是指 RAM、FLASH。

RAM:運(yùn)存的調(diào)優(yōu)需要根據(jù)廠商的指導(dǎo)文檔在設(shè)備樹(shù)文件<.dtsi文件>中進(jìn)行調(diào)整,比如設(shè)定運(yùn)存的時(shí)鐘頻率 memory-frequency、
設(shè)定內(nèi)存帶寬 memory-bandwidth、內(nèi)存時(shí)序 memory-timings 等,Kernel 層可以對(duì) swappiness、dirty_ratio、dirty_background_ratio、min_free_kbytes等相應(yīng)值進(jìn)行調(diào)整,來(lái)達(dá)到運(yùn)存的性能調(diào)優(yōu)。

FLASH:比如對(duì) physical_block_size 項(xiàng)進(jìn)行調(diào)整,目前 OpenHarmony 采用的文件系統(tǒng)為 ext4,可以在熟悉ext4文件系統(tǒng)后,然后對(duì)其中緩存、模式、壓縮、清理等方向進(jìn)行調(diào)優(yōu)。減少KMSG與HiLog 日志輸出,調(diào)整其輸出等級(jí)。

二、Kernel 啟動(dòng)時(shí)長(zhǎng)優(yōu)化
Kernel 啟動(dòng)階段會(huì)進(jìn)行硬件檢測(cè)、驅(qū)動(dòng)加載、文件系統(tǒng)掛載、設(shè)置網(wǎng)絡(luò)等,其中耗時(shí)比較長(zhǎng)的基本上為驅(qū)動(dòng)加載,因?yàn)檫@中間會(huì)有重復(fù)嘗試跟 Sleep 的時(shí)間,需要重點(diǎn)關(guān)注,在 Kernel 啟動(dòng)的過(guò)程中可以將一些無(wú)用的子系統(tǒng)進(jìn)行裁剪,比如 bootchart。

三、系統(tǒng)框架啟動(dòng)時(shí)長(zhǎng)優(yōu)化
在系統(tǒng)層啟動(dòng)時(shí),需要啟動(dòng)很多服務(wù),可以采用并行啟動(dòng)系統(tǒng)必要服務(wù),延遲啟動(dòng)非必要服務(wù),這些服務(wù)從加載到啟動(dòng)完成、其中比較耗時(shí)的有 so 加載,可采用多線程的方式對(duì)其進(jìn)行加載,下面貼出多線程加載多個(gè) so 文件的 Demo 代碼;
#include 
#include
#include
#include
#include
void thread_func(void* handle){
// 空函數(shù)
}
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;
}
如果發(fā)現(xiàn)加載的單個(gè)so文件過(guò)大時(shí),可采用多線程分段加載此so 文件。

四、 開(kāi)機(jī)動(dòng)畫(huà)顯示優(yōu)化
優(yōu)化思路大致為進(jìn)入 bootAnimation 的 main 函數(shù)后,將動(dòng)畫(huà)圖片采用數(shù)組或者鏈表的方式進(jìn)行預(yù)加載,開(kāi)啟每秒60幀的刷新率,此處為什么要開(kāi)60幀,因?yàn)槿绻O(shè)定為30幀時(shí),出現(xiàn)掉幀的情況后,會(huì)出現(xiàn)肉眼可見(jiàn)的卡頓。當(dāng)圖片播放完成后,延遲幾百毫秒左右再進(jìn)入桌面,因?yàn)長(zhǎng)auncher 加載已安裝的 app ,需要一定的時(shí)間。下面是開(kāi)機(jī)動(dòng)畫(huà)優(yōu)化的部分內(nèi)容 :
1.提高開(kāi)機(jī)動(dòng)畫(huà)、渲染進(jìn)程優(yōu)先級(jí);
"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. 提前加載開(kāi)機(jī)動(dòng)畫(huà)圖片;
ReadZipFile(BOOT_PIC_ZIP, imageVector_, jsonConfig);
imgVecSize_ = static_cast<int32_t>(imageVector_.size());
if (imgVecSize_ <= 0) {
PostTask(std::bind(&AppExecFwk::Stop, runner_));
LOGE("zip pic num is 0.");
return;
}


SortZipFile(imageVector_);
3.指定開(kāi)機(jī)動(dòng)畫(huà)顯示幀率;
OHOS::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);
開(kāi)機(jī)優(yōu)化需要借助一些工具來(lái)分析比如串口工具、bootchart 生成的可視化圖表來(lái)進(jìn)行分析。
OpenHarmony 標(biāo)準(zhǔn)系統(tǒng)默認(rèn)集成了bootchart,下面介紹如何使用bootchart 工具來(lái)獲取開(kāi)機(jī)性能數(shù)據(jù)及生成性能圖片:
(1)開(kāi)機(jī)完成后,運(yùn)行 hdc_std shell
(2)運(yùn)行 begetctl bootchart enable
(3)運(yùn)行 reboot 或者斷電重啟
(4)運(yùn)行 begetctl bootchart stop
(5)運(yùn)行 begetctl bootchart disable
(6)進(jìn)入到/data/bootchart/文件夾下查看是否有
(7)header、proc_diskstats.log、proc_ps.log、proc_stat.log
(8)在/data/bootchart/目錄下執(zhí)行命令:tar -czf bootchart.tgz *
(9)將bootchart.tgz 導(dǎo)出到本地磁盤(pán)上
(10)hdc_std file recv /data/bootchart/bootchart.tgz ./
(11)生成開(kāi)機(jī)性能圖片 java -jar bootchart.jar bootchart.tgz
上面的bootchart.jar 需要下載源碼去編譯生成或者下載他人已經(jīng)編譯好的jar包。源碼下載地址 https://sourceforge.net/projects/bootchart/ 。

下圖為 bootchart 生成的 OpenHarmony性能可視化視圖


總結(jié)

通過(guò)本篇文章介紹,您對(duì)OpenHarmony標(biāo)準(zhǔn)系統(tǒng)下性能優(yōu)化的功能應(yīng)該有了初步的了解。如果您對(duì)本篇文章內(nèi)容感興趣,可以根據(jù)本篇文章介紹進(jìn)行研究和使用。同時(shí)也歡迎更多開(kāi)發(fā)者與我們共享開(kāi)發(fā)成果,分享技術(shù)解讀與經(jīng)驗(yàn)心得。


原文標(biāo)題:OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開(kāi)機(jī)時(shí)長(zhǎng)優(yōu)化

文章出處:【微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2294

    瀏覽量

    42633
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3611

    瀏覽量

    15966

原文標(biāo)題:OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開(kāi)機(jī)時(shí)長(zhǎng)優(yōu)化

文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AM574x延長(zhǎng)開(kāi)機(jī)時(shí)間(POH)

    電子發(fā)燒友網(wǎng)站提供《AM574x延長(zhǎng)開(kāi)機(jī)時(shí)間(POH).pdf》資料免費(fèi)下載
    發(fā)表于 10-10 09:22 ?0次下載
    AM574x延長(zhǎng)<b class='flag-5'>開(kāi)機(jī)時(shí)</b>間(POH)

    基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開(kāi)發(fā):HelloOpenharmony

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫(xiě)的UI應(yīng)用類(lèi):HelloOpenHarmony。本案例是基于API9接口開(kāi)發(fā)。本案例已在OpenHarmony凌蒙派-RK35
    的頭像 發(fā)表于 09-15 08:09 ?216次閱讀
    基于ArkTS語(yǔ)言的<b class='flag-5'>OpenHarmony</b> APP應(yīng)用開(kāi)發(fā):Hello<b class='flag-5'>Openharmony</b>

    AM62x延長(zhǎng)開(kāi)機(jī)時(shí)間應(yīng)用說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《AM62x延長(zhǎng)開(kāi)機(jī)時(shí)間應(yīng)用說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 09-13 10:01 ?0次下載
    AM62x延長(zhǎng)<b class='flag-5'>開(kāi)機(jī)時(shí)</b>間應(yīng)用說(shuō)明

    瑞芯微RK3566鴻蒙開(kāi)發(fā)板OpenHarmony標(biāo)準(zhǔn)系統(tǒng)應(yīng)用兼容性測(cè)試指導(dǎo)

    本文OpenHarmony標(biāo)準(zhǔn)系統(tǒng)應(yīng)用兼容性測(cè)試指導(dǎo),適用鴻蒙系統(tǒng)軟件開(kāi)發(fā)測(cè)試的新手入門(mén)學(xué)習(xí)課程,設(shè)備為觸覺(jué)智能的瑞芯微RK3566開(kāi)發(fā)板,型號(hào)Purple Pi OH。是Laval官方社區(qū)主薦的一款鴻蒙開(kāi)發(fā)主板。
    的頭像 發(fā)表于 09-10 11:56 ?232次閱讀
    瑞芯微RK3566鴻蒙開(kāi)發(fā)板<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>應(yīng)用兼容性測(cè)試指導(dǎo)

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeMap

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類(lèi)庫(kù)的安全關(guān)聯(lián)容器:SafeMap。OpenHarmony提供了一個(gè)線程安全的map實(shí)現(xiàn)。SafeMap在STLmap基礎(chǔ)上封裝互斥鎖
    的頭像 發(fā)表于 08-30 12:42 ?238次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeMap

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeQueue

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類(lèi)庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是在dequeue的基礎(chǔ)上封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
    的頭像 發(fā)表于 08-30 12:41 ?195次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeQueue

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeStack

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類(lèi)庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是在dequeue的基礎(chǔ)上封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
    的頭像 發(fā)表于 08-30 12:41 ?229次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeStack

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeBlockQueue

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類(lèi)庫(kù)的讀寫(xiě)鎖:SafeBlockQueue。線程安全阻塞隊(duì)列SafeBlockQueue類(lèi),提供阻塞和非阻塞版的入隊(duì)入隊(duì)和出隊(duì)接口,并提
    的頭像 發(fā)表于 08-30 12:41 ?208次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeBlockQueue

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeStack

    /a28_utils_safestack 2、基礎(chǔ)知識(shí) C++公共基礎(chǔ)類(lèi)庫(kù)為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開(kāi)發(fā)工具類(lèi),包括: 文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口 讀寫(xiě)鎖、信號(hào)量、定時(shí)器、線程增強(qiáng)及線程池等接口
    發(fā)表于 08-21 14:51

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:SafeQueue

    /a27_utils_safequeue 2、基礎(chǔ)知識(shí) C++公共基礎(chǔ)類(lèi)庫(kù)為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開(kāi)發(fā)工具類(lèi),包括: 文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口 讀寫(xiě)鎖、信號(hào)量、定時(shí)器、線程增強(qiáng)及線程池等
    發(fā)表于 08-21 10:56

    請(qǐng)求推薦無(wú)需NPU的OpenHarmony標(biāo)準(zhǔn)系統(tǒng)ARM開(kāi)發(fā)板

    請(qǐng)教一下大佬們,目前的需求是在國(guó)產(chǎn)ARM開(kāi)發(fā)板上跑OpenHarmony標(biāo)準(zhǔn)系統(tǒng),無(wú)需NPU/GPU,其它配置(CPU、RAM等)可以盡量高點(diǎn),價(jià)位在2k以?xún)?nèi),球球推薦!感謝大佬們!
    發(fā)表于 08-16 16:25

    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類(lèi)庫(kù)案例:HelloWorld

    1、程序簡(jiǎn)介該程序是基于凌蒙派OpenHarmony-v3.2.1標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類(lèi)庫(kù)的簡(jiǎn)單案例:HelloWorld。主要講解C++公共基礎(chǔ)類(lèi)庫(kù)案例如何搭建和編譯。2、程序解析2.1、創(chuàng)建
    的頭像 發(fā)表于 08-13 08:23 ?367次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>C++公共基礎(chǔ)類(lèi)庫(kù)案例:HelloWorld

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:ThreadPoll

    1、程序簡(jiǎn)介 該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)的線程池處理:ThreadPoll。 本案例完成如下工作: 創(chuàng)建1個(gè)線程池,設(shè)置該線程池內(nèi)部有1024個(gè)線程空間。 啟動(dòng)5
    發(fā)表于 08-12 11:42

    OpenHarmony開(kāi)機(jī)優(yōu)化

    對(duì)其進(jìn)行詳細(xì)的性能分析,從而優(yōu)化系統(tǒng)啟動(dòng)速度和運(yùn)行效率。 三丶開(kāi)機(jī)優(yōu)化 開(kāi)機(jī)優(yōu)化的主要目的是為了
    發(fā)表于 07-01 16:39

    鴻蒙OpenHarmony南向:【Hi3516標(biāo)準(zhǔn)系統(tǒng)入門(mén)(命令行方式)】

    除小型系統(tǒng)外,Hi3516DV300開(kāi)發(fā)板還支持標(biāo)準(zhǔn)系統(tǒng)。此章節(jié)簡(jiǎn)要介紹如何使用命令行在Hi3516DV300開(kāi)發(fā)板上進(jìn)行標(biāo)準(zhǔn)系統(tǒng)的開(kāi)發(fā)。
    的頭像 發(fā)表于 05-08 09:26 ?740次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>南向:【Hi3516<b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>入門(mén)(命令行方式)】