99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

鴻蒙開發(fā)實戰(zhàn):【性能調(diào)優(yōu)組件】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-13 15:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

簡介

性能調(diào)優(yōu)組件包含系統(tǒng)和應用調(diào)優(yōu)框架,旨在為開發(fā)者提供一套性能調(diào)優(yōu)平臺,可以用來分析內(nèi)存、性能等問題。

該組件整體分為PC端和設備端兩部分,PC端最終作為deveco studio的插件進行發(fā)布,內(nèi)部主要包括分為UI繪制、設備管理、進程管理、插件管理、數(shù)據(jù)導入、數(shù)據(jù)存儲、 數(shù)據(jù)分析、Session管理、配置管理等模塊;設備端主要包括命令行工具、服務進程、插件集合、應用程序組件等模塊。設備端提供了插件擴展能力,對外提供了插件接口,基于該擴展能力可以按需定義自己的能力,并集成到框架中來,目前基于插件能力已經(jīng)完成了實時內(nèi)存插件,trace插件。下文會重點對設備端提供的插件能力進行介紹。

架構(gòu)圖

說明

下面針對設備端對外提供的插件擴展能力進行接口和使用說明。

接口說明

下面是設備端插件模塊對外提供的接口:

  • PluginModuleCallbacks為插件模塊對外提供的回調(diào)接口,插件管理模塊通過該回調(diào)接口列表與每一個插件模塊進行交互,每一個新增插件都需要實現(xiàn)該接口列表中的函數(shù)。

表 1 PluginModuleCallbacks接口列表

[]()

[]()[]()接口名[]()[]()類型[]()[]()描述
[]()[]()PluginModuleCallbacks::onPluginSessionStart[]()[]()int (PluginSessionStartCallback)(const uint8_tconfigData, uint32_t configSize);[]()[]()- 功能:
[]()[]()插件會話開始接口,開始插件會話時會被調(diào)用,用來下發(fā)插件配置
  • 輸入?yún)?shù):
    []()[]()configData:配置信息內(nèi)存塊起始地址
    []()[]()configSize:配置信息內(nèi)存塊字節(jié)數(shù)
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
    | []()[]()PluginModuleCallbacks::onPluginReportResult | []()[]()int (PluginReportResultCallback)(uint8_t bufferData, uint32_t bufferSize); | []()[]()- 功能:
    []()[]()插件結(jié)果上報接口類型,當任務下發(fā)后,框架采集任務會周期性調(diào)用此接口請求回填數(shù)據(jù)
  • 輸入?yún)?shù):
    []()[]()bufferData: 存放結(jié)果的內(nèi)存緩沖區(qū)起始地址
    []()[]()bufferSize: 存放結(jié)果的內(nèi)存緩沖區(qū)的字節(jié)數(shù)
  • 返回值:
    []()[]()大于0:已經(jīng)填充的內(nèi)存字節(jié)數(shù)
    []()[]()等于0:沒有填充任何內(nèi)容
    []()[]()小于0:失敗 |
    | []()[]()PluginModuleCallbacks::onPluginSessionStop | []()[]()int (*PluginSessionStopCallback)(); | []()[]()- 功能:
    []()[]()采集會話結(jié)束接口
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
    | []()[]()PluginModuleCallbacks::onRegisterWriterStruct | []()[]()int (RegisterWriterStructCallback)(WriterStruct writer); | []()[]()- 功能:
    []()[]()采集框架注冊寫數(shù)據(jù)接口,當插件管理模塊向插件注冊此接口,插件可以主動調(diào)用write句柄,進行寫入數(shù)據(jù)
  • 輸入?yún)?shù):
    []()[]()writer 寫者指針
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
  • WriterStruct是上面onRegisterWriterStruct接口中的參數(shù),主要實現(xiàn)寫數(shù)據(jù)接口,將插件中采集的數(shù)據(jù)通過該接口進行寫入。

表 2 WriterStruct接口列表

[]()

[]()[]()接口名[]()[]()類型[]()[]()描述
[]()[]()WriterStruct::write[]()[]()long (WriteFuncPtr)(WriterStructwriter, const void* data, size_t size);[]()[]()- 功能:
[]()[]()寫接口,將插件中采集的數(shù)據(jù)通過writer進行寫入
  • 輸入?yún)?shù):
    []()[]()writer:寫者指針
    []()[]()data:數(shù)據(jù)緩沖區(qū)首字節(jié)指針
    []()[]()size: 數(shù)據(jù)緩沖區(qū)的字節(jié)數(shù)
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
    | []()[]()WriterStruct::flush | []()[]()bool (FlushFuncPtr)(WriterStruct writer); | []()[]()- 功能:
    []()[]()觸發(fā)數(shù)據(jù)上傳接口
  • 輸入?yún)?shù):
    []()[]()writer:寫者指針
  • 返回值:
    []()[]()true:成功
    []()[]()false:失敗 |
  • 下面是插件模塊對外提供的總?cè)肟?,主要包括?中的插件模塊回調(diào)函數(shù)以及插件名稱、插件模塊需要申請的內(nèi)存大小。

表 3 PluginModuleStruct接口列表

[]()

[]()[]()接口名[]()[]()類型[]()[]()描述
[]()[]()PluginModuleStruct::callbacks[]()[]()PluginModuleCallbacks*[]()[]()功能:定義插件回調(diào)函數(shù)列表
[]()[]()PluginModuleStruct::name[]()[]()C style string[]()[]()功能:定義插件名稱
[]()[]()PluginModuleStruct::resultBufferSizeHint[]()[]()uint32_t[]()[]()功能:用于提示插件管理模塊調(diào)用數(shù)據(jù)上報接口時使用的內(nèi)存緩沖區(qū)字節(jié)數(shù)

使用說明

下面介紹在設備端基于性能調(diào)優(yōu)框架提供的插件能力,新增一個插件涉及到的關鍵開發(fā)步驟:

  1. 編寫proto數(shù)據(jù)定義文件_plugin_data.proto_,定義數(shù)據(jù)源格式,數(shù)據(jù)源格式?jīng)Q定了插件上報哪些數(shù)據(jù):
    message PluginData {
        int32 pid = 1;
        string name = 2;
        uint64 count1 = 3;
        uint64 count2 = 4;
        uint64 count3 = 5;
        ......
    }
    
  2. 編寫數(shù)據(jù)源配置文件_plugin_config.proto_,采集的行為可以根據(jù)配置進行變化,可以設置數(shù)據(jù)源上報間隔等信息:
    message PluginConfig {
        int32 pid = 1;
        bool report_interval = 2;
        int report_counter_id_1 = 3;
        int report_counter_id_2 = 4;
        ......
    }
    
  3. 定義PluginModuleCallbacks實現(xiàn)插件回調(diào)接口;定義PluginModuleStruct類型的g_pluginModule全局變量,注冊插件信息。
    static PluginModuleCallbacks callbacks = {
        PluginSessionStart,
        PluginReportResult,
        PluginSessionStop,
    };
    PluginModuleStruct g_pluginModule = {&callbacks, "test-plugin", MAX_BUFFER_SIZE};
    
  4. 通過PluginSessionStart(名字可以自己定義)實現(xiàn)插件回調(diào)接口列表的onPluginSessionStart接口,主要處理插件的開始流程。
    int PluginSessionStart(const uint8_t* configData, uint32_t configSize)
    {
        ......
        return 0;
    }
    
  5. 通過PluginReportResult(名字可以自己定義)實現(xiàn)插件回調(diào)接口列表的onPluginReportResult接口,將插件內(nèi)部采集的信息通過該接口進行上報:
    int PluginReportResult(uint8_t* bufferData, uint32_t bufferSize)
    {
        ......
        return 0;
    }
    
  6. 通過PluginSessionStop(名字可以自己定義)實現(xiàn)插件回調(diào)接口列表的onPluginSessionStop接口,主要進行插件停止后的操作流程。
    int PluginSessionStop()
    {
        ......
        return 0;
    }
    
  7. 編寫proto gn構(gòu)建腳本, 生成protobuf源文件,protobuf源文件編譯生成目標文件:
    action("plugin_cpp_gen") {
      script = "${OHOS_PROFILER_DIR}/build/protoc.sh"  //依賴的編譯工具鏈
      sources = [   //定義的插件相關的proto文件,比如插件配置文件、插件數(shù)據(jù)對應的proto文件
        "plugin_data.proto",
        "plugin_config.proto",
      ]
      outputs = [    //通過protoc編譯生成的結(jié)果文件
        "plugin_data.pb.h",
        "plugin_data.pb.cc",
        "plugin_config.pb.h",
        "plugin_config.pb.cc",
      ]
      args = [
        "--cpp_out",
        "$proto_rel_out_dir",
        "--proto_path",
        rebase_path(".", root_build_dir),
      ]
      deps = [
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc(${host_toolchain})",
      ]
    }
    ohos_source_set("plug_cpp") {   //將定義的proto文件生成cpp文件
      deps = [
        ":plugin_cpp_gen",
      ]
      public_deps = [
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf",
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
      ]
      include_dirs = [ "$proto_out_dir" ]
      sources = [   //目標plug_cpp中包括的源文件
        "plugin_data.pb.h",
        "plugin_data.pb.cc",
        "plugin_config.pb.h",
        "plugin_config.pb.cc",
      ]
    }
    
  8. 編寫插件GN構(gòu)建腳本:
    ohos_shared_library("***plugin") {
      output_name = "***plugin"
      sources = [
        "src/***plugin.cpp",  //插件中的源文件
      ]
      include_dirs = [
        "../api/include",
        "${OHOS_PROFILER_DIR}/device/base/include",
      ]
      deps = [
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc_lib",
        "${OHOS_PROFILER_DIR}/protos/types/plugins/**:plug_cpp",  //上面ohos_source_set中生成的plug_cpp
      ]
      install_enable = true
      subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}"
    }
    

調(diào)測驗證:

插件動態(tài)庫生成后,可以自己編寫測試代碼,通過dlopen加載動態(tài)庫,并調(diào)用上面代碼中實現(xiàn)的插件模塊回調(diào)函數(shù)進行驗證。

int main(int argc, char** argv)
{
    void* handle;
    PluginModuleStruct* memplugin;
    handle = dlopen("./libplugin.z.so", RTLD_LAZY);   //動態(tài)打開上面生成的插件動態(tài)庫
    if (handle == nullptr) {
        HILOGD("dlopen err:%s.", dlerror());
        return 0;
    }
     memplugin = (PluginModuleStruct*)dlsym(handle, "g_pluginModule");  //獲取開發(fā)步驟3中定義的g_pluginModule全局變量
     //check memplugin- >callbacks   // 通過該指針調(diào)用上面開發(fā)步驟3中定義的回調(diào)函數(shù)
     return 0;

hiprofiler_cmd 使用說明

參數(shù)說明

執(zhí)行hiprofiler_cmd 為調(diào)優(yōu)業(yè)務的離線命令行抓取工具,具體使用方法及命令行參數(shù)介紹如下。

可以使用-h或者--help參數(shù)查看命令的使用描述信息:

hiprofiler_cmd -h
help :
  --getport        -q     : get grpc address
  --time           -t     : trace time
  --out            -o     : output file name
  --help           -h     : make some help
  --list           -l     : plugin list
  --start          -s     : start dependent process
  --kill           -k     : kill dependent process
  --config         -c     : start trace by config file

其余參數(shù)使用說明如下:

  • -q或者--getport選項,用于查詢服務的端口信息;
  • -t或者--time選項,用于指定抓取時間,單位是秒;
  • -o或者--out選項,用于指定輸出的離線數(shù)據(jù)文件名;
  • -h或者--help選項,用于輸出幫助信息;
  • -l或者--list選項,用于查詢插件列表;
  • -s或者--start選項,用于啟動依賴的進程;
  • -k或者--kill選項,用于關閉依賴的進程;
  • -c或者--config選項,用于指定配置文件;

命令展示

基礎配置參數(shù)

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

命令參數(shù)說明:

  • request_id:本次請求的id
  • pages:存儲trace數(shù)據(jù)的buffer大?。? * pages kb)
  • result_file:結(jié)果輸出的文件路徑,與-o參數(shù)對應
  • sample_duration:抓取時長(ms),與-t參數(shù)對應

ftrace抓取場景示例

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

命令參數(shù)說明:

  • sample_interval:輪循模式下,插件上報數(shù)據(jù)的間隔時間(ms)
  • trace_period_ms:ftrace插件讀取內(nèi)核緩沖區(qū)數(shù)據(jù)的間隔時間(ms)
  • hitrace_time:hitrace命令行抓取時間,與hiprofiler_cmd下發(fā)的-t配置聯(lián)動

內(nèi)存信息抓取場景示例

內(nèi)核內(nèi)存信息

使用如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<
虛擬內(nèi)存統(tǒng)計

使用如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<
進程內(nèi)存使用跟蹤

如配置抓取的進程名是com.ohos.mms

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

配置參數(shù)說明:

  • pid/process_name:設置抓取的進程ID或者進程名
  • max_stack_depth:抓取的棧的深度
  • smb_pages:native_daemon和native_hook進程之間存儲數(shù)據(jù)的共享內(nèi)存大?。?KB的倍數(shù))
  • filter_size:只抓取大于該size的malloc數(shù)據(jù)(free不受影響)

bytrace/hitrace場景示例

運行如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 30 
  -s 
<

hiperf場景示例

運行如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

審核編輯 黃宇

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

    關注

    13

    文章

    4532

    瀏覽量

    87454
  • 內(nèi)存
    +關注

    關注

    8

    文章

    3124

    瀏覽量

    75268
  • 鴻蒙
    +關注

    關注

    60

    文章

    2620

    瀏覽量

    44052
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【HarmonyOS 5】金融應用開發(fā)鴻蒙組件實踐

    【HarmonyOS 5】金融應用開發(fā)鴻蒙組件實踐 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應用服務##
    的頭像 發(fā)表于 07-11 18:20 ?282次閱讀
    【HarmonyOS 5】金融應用<b class='flag-5'>開發(fā)</b><b class='flag-5'>鴻蒙</b><b class='flag-5'>組件</b>實踐

    鴻蒙5開發(fā)寶藏案例分享---Swiper組件性能優(yōu)化實戰(zhàn)

    鴻蒙寶藏:Swiper組件性能優(yōu)化實戰(zhàn),告別卡頓丟幀! 大家好!最近在鴻蒙開發(fā)時,偶然發(fā)現(xiàn)了官方
    發(fā)表于 06-12 17:53

    鴻蒙5開發(fā)寶藏案例分享---瀑布流優(yōu)化實戰(zhàn)分享

    鴻蒙瀑布流性能優(yōu)化實戰(zhàn):告別卡頓的寶藏指南! 大家好!最近在鴻蒙文檔里挖到一個 性能優(yōu)化寶藏庫 ,原來官方早就準備好了各種場景的最佳實踐!今
    發(fā)表于 06-12 17:41

    鴻蒙5開發(fā)寶藏案例分享---分析幀率問題

    鴻蒙性能優(yōu)化寶藏:幀率問題實戰(zhàn)案例解析 嘿,各位鴻蒙開發(fā)者! 今天分享一個開發(fā)中的大發(fā)現(xiàn)——
    發(fā)表于 06-12 17:07

    鴻蒙5開發(fā)寶藏案例分享---性能檢測工具揭秘

    鴻蒙性能檢測寶藏工具大揭秘!開發(fā)實戰(zhàn)避坑指南 大家好呀!我是HarmonyOS開發(fā)路上的探索者小明。今天挖到一個官方隱藏的
    發(fā)表于 06-12 16:52

    鴻蒙5開發(fā)寶藏案例分享---性能體驗設計

    ;性能優(yōu)化\"關鍵詞! **如果大家在實戰(zhàn)中遇到卡頓難題,歡迎在評論區(qū)交流~ 也歡迎關注我,后續(xù)會持續(xù)分享鴻蒙開發(fā)實戰(zhàn)技巧! **? 希望這
    發(fā)表于 06-12 16:45

    鴻蒙5開發(fā)寶藏案例分享---性能優(yōu)化案例解析

    鴻蒙性能優(yōu)化寶藏指南:實戰(zhàn)工具與代碼案例解析 大家好呀!今天在翻鴻蒙開發(fā)者文檔時,意外挖到一個 性能
    發(fā)表于 06-12 16:36

    鴻蒙5開發(fā)寶藏案例分享---應用并發(fā)設計

    性能調(diào)優(yōu),這些案例都是華為工程師的血淚經(jīng)驗結(jié)晶。下面用最直白的語言+代碼示例,帶你玩轉(zhuǎn)HarmonyOS并發(fā)開發(fā)! ?一、ArkTS并發(fā)模型:顛覆傳統(tǒng)的設計 傳統(tǒng)模型痛點 graph
    發(fā)表于 06-12 16:19

    HarmonyOS實戰(zhàn)組件化項目搭建

    前言 鴻蒙應用開發(fā)已經(jīng)成為互聯(lián)網(wǎng)新的風口,開發(fā)鴻蒙軟件已經(jīng)成為今年工作的核心目標。在軟件開發(fā)過程中,對于復雜度較大,功能較多的軟件都會采用
    的頭像 發(fā)表于 06-09 14:58 ?214次閱讀
    HarmonyOS<b class='flag-5'>實戰(zhàn)</b>:<b class='flag-5'>組件</b>化項目搭建

    Kuikly鴻蒙版正式開源 —— 揭秘卓越性能適配之旅

    6倍 Kuikly鴻蒙版對齊Android版高性能表現(xiàn),與原生打開速度基本一致 總體適配方案 Kuikly架構(gòu)回顧和優(yōu)勢 Kuikly是一個一碼多端、追求極致性能、動態(tài)化、原生體驗的開發(fā)
    發(fā)表于 06-04 16:46

    鴻蒙原生頁面高性能解決方案上線OpenHarmony社區(qū) 助力打造高性能原生應用

    性能鴻蒙原生應用。 Nodepool:優(yōu)化頁面滑動流暢性Nodepool旨在解決應用頁面滑動卡頓問題。開發(fā)中,相似頁面因業(yè)務和代碼差異,組件復用性差,引發(fā)卡頓、丟幀,影響用戶體驗。N
    發(fā)表于 01-02 18:00

    鴻蒙Flutter實戰(zhàn):14-現(xiàn)有Flutter 項目支持鴻蒙 II

    分別安裝官方的3.22版本,以及鴻蒙社區(qū)的 3.22.0 版本 3.搭建 Flutter鴻蒙開發(fā)環(huán)境 參考文章《鴻蒙Flutter實戰(zhàn):0
    發(fā)表于 12-26 14:59

    鴻蒙Flutter實戰(zhàn):07混合開發(fā)

    # 鴻蒙Flutter實戰(zhàn):混合開發(fā) 鴻蒙Flutter混合開發(fā)主要有兩種形式。 ## 1.基于har 將flutter module
    發(fā)表于 10-23 16:00

    MMC DLL調(diào)優(yōu)

    電子發(fā)燒友網(wǎng)站提供《MMC DLL調(diào)優(yōu).pdf》資料免費下載
    發(fā)表于 10-11 11:48 ?0次下載
    MMC DLL<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>

    MMC SW調(diào)優(yōu)算法

    電子發(fā)燒友網(wǎng)站提供《MMC SW調(diào)優(yōu)算法.pdf》資料免費下載
    發(fā)表于 09-20 11:14 ?0次下載
    MMC SW<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>算法