OpenHarmony標準系統開機時長最佳化

OpenHarmony開發者發表於2023-04-10

簡介

萬物互聯時代,產品效能至關重要,而系統啟動時間是系統效能的重要組成部分,因為使用者必須等待系統啟動完成後才能使用裝置。對於經常需要進行冷啟動的汽車等裝置而言,較短的啟動時間至關重要(沒有人喜歡在等待幾十秒後才能輸入導航目的地),在金融交易裝置、電子商務伺服器、實時通訊裝置同樣也有較高的應用場景,那我們該如何在OpenAtom OpenHarmony(簡稱OpenHarmony ) 標準系統現有的能力下,完成秒級開機?本文由深圳市優博終端科技有限公司的研發同學介紹一套關於最佳化OpenHarmony標準系統開機時長最佳化的方案,透過對硬體、Kernel、 Framework的相應最佳化讓系統開機時長儘量縮短。

效果展示

下面給出系統開機時長最佳化前後的對比效果影片,最佳化前的開機時長在18秒左右,最佳化後的開機時間在7秒左右。

undefined

開發環境

硬體平臺: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_);

3. 指定開機動畫顯示幀率;

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包。原始碼下載地址  。

下圖為 bootchart 生成的 OpenHarmony效能視覺化檢視。

undefined

總結

透過本篇文章介紹,您對OpenHarmony標準系統下效能最佳化的功能應該有了初步的瞭解。如果您對本篇文章內容感興趣,可以根據本篇文章介紹進行研究和使用。同時也歡迎更多開發者與我們共享開發成果,分享技術解讀與經驗心得。

undefined


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011554/viewspace-2944627/,如需轉載,請註明出處,否則將追究法律責任。

相關文章