點(diǎn)擊藍(lán)字 ╳ 關(guān)注我們
戴學(xué)躍
深圳市優(yōu)博終端科技有限公司
OpenHarmony知識(shí)體系工作組
萬物互聯(lián)時(shí)代,產(chǎn)品性能至關(guān)重要,而系統(tǒng)啟動(dòng)時(shí)間是系統(tǒng)性能的重要組成部分,因?yàn)橛脩舯仨毜却到y(tǒng)啟動(dòng)完成后才能使用設(shè)備。對(duì)于經(jīng)常需要進(jìn)行冷啟動(dòng)的汽車等設(shè)備而言,較短的啟動(dòng)時(shí)間至關(guān)重要(沒有人喜歡在等待幾十秒后才能輸入導(dǎo)航目的地),在金融交易設(shè)備、電子商務(wù)服務(wù)器、實(shí)時(shí)通信設(shè)備同樣也有較高的應(yīng)用場(chǎng)景,那我們?cè)撊绾卧贠penAtom OpenHarmony(簡(jiǎn)稱OpenHarmony ) 標(biāo)準(zhǔn)系統(tǒng)現(xiàn)有的能力下,完成秒級(jí)開機(jī)?本文由深圳市優(yōu)博終端科技有限公司的研發(fā)同學(xué)介紹一套關(guān)于優(yōu)化OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開機(jī)時(shí)長(zhǎng)優(yōu)化的方案,通過對(duì)硬件、Kernel、 Framework的相應(yīng)優(yōu)化讓系統(tǒng)開機(jī)時(shí)長(zhǎng)盡量縮短。下面給出系統(tǒng)開機(jī)時(shí)長(zhǎng)優(yōu)化前后的對(duì)比效果視頻,優(yōu)化前的開機(jī)時(shí)長(zhǎng)在18秒左右,優(yōu)化后的開機(jī)時(shí)間在7秒左右。系統(tǒng)版本:OpenHarmony 3.1 Release四步帶你體驗(yàn)OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開機(jī)時(shí)長(zhǎng)優(yōu)化
調(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è)備樹文件<.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)整,來達(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)的過程中可以將一些無用的子系統(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){
}
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文件過大時(shí),可采用多線程分段加載此so 文件。四、 開機(jī)動(dòng)畫顯示優(yōu)化優(yōu)化思路大致為進(jìn)入 bootAnimation 的 main 函數(shù)后,將動(dòng)畫圖片采用數(shù)組或者鏈表的方式進(jìn)行預(yù)加載,開啟每秒60幀的刷新率,此處為什么要開60幀,因?yàn)槿绻O(shè)定為30幀時(shí),出現(xiàn)掉幀的情況后,會(huì)出現(xiàn)肉眼可見的卡頓。當(dāng)圖片播放完成后,延遲幾百毫秒左右再進(jìn)入桌面,因?yàn)長(zhǎng)auncher 加載已安裝的 app ,需要一定的時(shí)間。下面是開機(jī)動(dòng)畫優(yōu)化的部分內(nèi)容 :1.提高開機(jī)動(dòng)畫、渲染進(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"]
}
]
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_);
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);
開機(jī)優(yōu)化需要借助一些工具來分析比如串口工具、bootchart 生成的可視化圖表來進(jìn)行分析。OpenHarmony 標(biāo)準(zhǔn)系統(tǒng)默認(rèn)集成了bootchart,下面介紹如何使用bootchart 工具來獲取開機(jī)性能數(shù)據(jù)及生成性能圖片:(1)開機(jī)完成后,運(yùn)行 hdc_std shell(2)運(yùn)行 begetctl bootchart enable(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)出到本地磁盤上(10)hdc_std file recv /data/bootchart/bootchart.tgz ./(11)生成開機(jī)性能圖片 java -jar bootchart.jar bootchart.tgz上面的bootchart.jar 需要下載源碼去編譯生成或者下載他人已經(jīng)編譯好的jar包。源碼下載地址 https://sourceforge.net/projects/bootchart/ 。下圖為 bootchart 生成的 OpenHarmony性能可視化視圖通過本篇文章介紹,您對(duì)OpenHarmony標(biāo)準(zhǔn)系統(tǒng)下性能優(yōu)化的功能應(yīng)該有了初步的了解。如果您對(duì)本篇文章內(nèi)容感興趣,可以根據(jù)本篇文章介紹進(jìn)行研究和使用。同時(shí)也歡迎更多開發(fā)者與我們共享開發(fā)成果,分享技術(shù)解讀與經(jīng)驗(yàn)心得。
原文標(biāo)題:OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開機(jī)時(shí)長(zhǎng)優(yōu)化
文章出處:【微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
原文標(biāo)題:OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開機(jī)時(shí)長(zhǎng)優(yōu)化
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
相關(guān)推薦
電子發(fā)燒友網(wǎng)站提供《AM574x延長(zhǎng)開機(jī)時(shí)間(POH).pdf》資料免費(fèi)下載
發(fā)表于 10-10 09:22
?0次下載
1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫的UI應(yīng)用類:HelloOpenHarmony。本案例是基于API9接口開發(fā)。本案例已在OpenHarmony凌蒙派-RK35
發(fā)表于 09-15 08:09
?448次閱讀
電子發(fā)燒友網(wǎng)站提供《AM62x延長(zhǎng)開機(jī)時(shí)間應(yīng)用說明.pdf》資料免費(fèi)下載
發(fā)表于 09-13 10:01
?0次下載
本文OpenHarmony標(biāo)準(zhǔn)系統(tǒng)應(yīng)用兼容性測(cè)試指導(dǎo),適用鴻蒙系統(tǒng)軟件開發(fā)測(cè)試的新手入門學(xué)習(xí)課程,設(shè)備為觸覺智能的瑞芯微RK3566開發(fā)板,型號(hào)Purple Pi OH。是Laval官方社區(qū)主薦的一款鴻蒙開發(fā)主板。
發(fā)表于 09-10 11:56
?447次閱讀
1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的安全關(guān)聯(lián)容器:SafeMap。OpenHarmony提供了一個(gè)線程安全的map實(shí)現(xiàn)。SafeMap在STLmap基礎(chǔ)上封裝互斥鎖
發(fā)表于 08-30 12:42
?407次閱讀
1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是在dequeue的基礎(chǔ)上封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
發(fā)表于 08-30 12:41
?339次閱讀
1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是在dequeue的基礎(chǔ)上封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
發(fā)表于 08-30 12:41
?361次閱讀
1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的讀寫鎖:SafeBlockQueue。線程安全阻塞隊(duì)列SafeBlockQueue類,提供阻塞和非阻塞版的入隊(duì)入隊(duì)和出隊(duì)接口,并提
發(fā)表于 08-30 12:41
?332次閱讀
/a28_utils_safestack
2、基礎(chǔ)知識(shí)
C++公共基礎(chǔ)類庫(kù)為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開發(fā)工具類,包括:
文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口
讀寫鎖、信號(hào)量、定時(shí)器、線程增強(qiáng)及線程池等接口
發(fā)表于 08-21 14:51
/a27_utils_safequeue
2、基礎(chǔ)知識(shí)
C++公共基礎(chǔ)類庫(kù)為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開發(fā)工具類,包括:
文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口
讀寫鎖、信號(hào)量、定時(shí)器、線程增強(qiáng)及線程池等
發(fā)表于 08-21 10:56
請(qǐng)教一下大佬們,目前的需求是在國(guó)產(chǎn)ARM開發(fā)板上跑OpenHarmony標(biāo)準(zhǔn)版系統(tǒng),無需NPU/GPU,其它配置(CPU、RAM等)可以盡量高點(diǎn),價(jià)位在2k以內(nèi),球球推薦!感謝大佬們!
發(fā)表于 08-16 16:25
1、程序簡(jiǎn)介該程序是基于凌蒙派OpenHarmony-v3.2.1標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫(kù)的簡(jiǎn)單案例:HelloWorld。主要講解C++公共基礎(chǔ)類庫(kù)案例如何搭建和編譯。2、程序解析2.1、創(chuàng)建
發(fā)表于 08-13 08:23
?553次閱讀
1、程序簡(jiǎn)介
該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)的線程池處理:ThreadPoll。
本案例完成如下工作:
創(chuàng)建1個(gè)線程池,設(shè)置該線程池內(nèi)部有1024個(gè)線程空間。
啟動(dòng)5
發(fā)表于 08-12 11:42
對(duì)其進(jìn)行詳細(xì)的性能分析,從而優(yōu)化系統(tǒng)啟動(dòng)速度和運(yùn)行效率。
三丶開機(jī)優(yōu)化
開機(jī)優(yōu)化的主要目的是為了
發(fā)表于 07-01 16:39
除小型系統(tǒng)外,Hi3516DV300開發(fā)板還支持標(biāo)準(zhǔn)系統(tǒng)。此章節(jié)簡(jiǎn)要介紹如何使用命令行在Hi3516DV300開發(fā)板上進(jìn)行標(biāo)準(zhǔn)系統(tǒng)的開發(fā)。
發(fā)表于 05-08 09:26
?920次閱讀
評(píng)論