鸿蒙南向开发实战:HiTraceMeter开发

金歌  论坛元老 | 2024-6-20 20:13:27 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1701|帖子 1701|积分 5103

HiTraceMeter在OpenHarmony中,为开发者提供业务流程调用链跟踪的维测接口。通过利用该接口所提供的功能,可以帮助开发者敏捷获取指定业务流程调用链的运行日志、定位跨设备/跨进程/跨线程的故障问题。HiTraceMeter用来支持用户态的办理,采集用户态和内核态的trace数据,从而进行性能跟踪与分析的系统。
根本概念

HiTraceMeter系统重要分为三部门:


  • JS/C++应用办理API;
  • Trace数据采集命令行工具;
  • Trace数据图形分析工具。
其中,前两者运行在设备端侧,图形工具运行在PC主机侧。办理API部门提供了C++和JS接口,供开发过程中办理利用,办理用于产生Trace数据流,是抓Trace数据的基础条件。
命令行工具用于采集Trace数据,用来抓取Trace数据流并生存到文本文件。
Trace数据分析可以在图形工具中人工分析,也可以利用分析脚本自动化分析,Trace分析工具以Trace命令行工具的采集结果数据文件为输入。
HiTraceMeter跟踪数据利用类别分类,类别分类称作Trace Tag或Trace Category,一样平常一个端侧软件子系统对应一个Tag。该Tag在办理API中以类别Tag参数传入。Trace命令行工具采集跟踪数据时,只采集Tag类别选项指定的跟踪数据。应用步伐跟踪数据标签都是属于APP Tag,从而JS接口不需要输入tag参数。目前HiTraceMeter支持的Trace Tag表如下(可在hitrace_meter.h hitrace_meter.h 中查看):
  1. constexpr uint64_t HITRACE_TAG_NEVER = 0; // This tag is never enabled.
  2. constexpr uint64_t HITRACE_TAG_ALWAYS = (1ULL << 0); // This tag is always enabled.
  3. constexpr uint64_t HITRACE_TAG_DLP_CREDENTIAL = (1ULL << 21); // This tag is dlp credential service.
  4. constexpr uint64_t HITRACE_TAG_ACCESS_CONTROL = (1ULL << 22); // This tag is access control tag.
  5. constexpr uint64_t HITRACE_TAG_NET = (1ULL << 23); // Net tag.
  6. constexpr uint64_t HITRACE_TAG_NWEB = (1ULL << 24); // NWeb tag.
  7. constexpr uint64_t HITRACE_TAG_HUKS = (1ULL << 25); // This tag is huks.
  8. constexpr uint64_t HITRACE_TAG_USERIAM = (1ULL << 26); // This tag is useriam.
  9. constexpr uint64_t HITRACE_TAG_DISTRIBUTED_AUDIO = (1ULL << 27); // Distributed audio tag.
  10. constexpr uint64_t HITRACE_TAG_DLSM = (1ULL << 28); // device security level tag.
  11. constexpr uint64_t HITRACE_TAG_FILEMANAGEMENT = (1ULL << 29); // filemanagement tag.
  12. constexpr uint64_t HITRACE_TAG_OHOS = (1ULL << 30); // OHOS generic tag.
  13. constexpr uint64_t HITRACE_TAG_ABILITY_MANAGER = (1ULL << 31); // Ability Manager tag.
  14. constexpr uint64_t HITRACE_TAG_ZCAMERA = (1ULL << 32); // Camera module tag.
  15. constexpr uint64_t HITRACE_TAG_ZMEDIA = (1ULL << 33); // Media module tag.
  16. constexpr uint64_t HITRACE_TAG_ZIMAGE = (1ULL << 34); // Image module tag.
  17. constexpr uint64_t HITRACE_TAG_ZAUDIO = (1ULL << 35); // Audio module tag.
  18. constexpr uint64_t HITRACE_TAG_DISTRIBUTEDDATA = (1ULL << 36); // Distributeddata manager module tag.
  19. constexpr uint64_t HITRACE_TAG_MDFS = (1ULL << 37); // Mobile distributed file system tag.
  20. constexpr uint64_t HITRACE_TAG_GRAPHIC_AGP = (1ULL << 38); // Graphic module tag.
  21. constexpr uint64_t HITRACE_TAG_ACE = (1ULL << 39); // ACE development framework tag.
  22. constexpr uint64_t HITRACE_TAG_NOTIFICATION = (1ULL << 40); // Notification module tag.
  23. constexpr uint64_t HITRACE_TAG_MISC = (1ULL << 41); // Notification module tag.
  24. constexpr uint64_t HITRACE_TAG_MULTIMODALINPUT = (1ULL << 42); // Multi modal module tag.
  25. constexpr uint64_t HITRACE_TAG_SENSORS = (1ULL << 43); // Sensors mudule tag.
  26. constexpr uint64_t HITRACE_TAG_MSDP = (1ULL << 44); // Multimodal Sensor Data Platform module tag.
  27. constexpr uint64_t HITRACE_TAG_DSOFTBUS = (1ULL << 45); // Distributed Softbus tag.
  28. constexpr uint64_t HITRACE_TAG_RPC = (1ULL << 46); // RPC and IPC tag.
  29. constexpr uint64_t HITRACE_TAG_ARK = (1ULL << 47); // ARK tag.
  30. constexpr uint64_t HITRACE_TAG_WINDOW_MANAGER = (1ULL << 48); // window manager tag.
  31. constexpr uint64_t HITRACE_TAG_ACCOUNT_MANAGER = (1ULL << 49); // account manager tag.
  32. constexpr uint64_t HITRACE_TAG_DISTRIBUTED_SCREEN = (1ULL << 50); // Distributed screen tag.
  33. constexpr uint64_t HITRACE_TAG_DISTRIBUTED_CAMERA = (1ULL << 51); // Distributed camera tag.
  34. constexpr uint64_t HITRACE_TAG_DISTRIBUTED_HARDWARE_FWK = (1ULL << 52); // Distributed hardware fwk tag.
  35. constexpr uint64_t HITRACE_TAG_GLOBAL_RESMGR = (1ULL << 53); // Global resource manager tag.
  36. constexpr uint64_t HITRACE_TAG_DEVICE_MANAGER = (1ULL << 54); // Distributed hardware devicemanager tag.
  37. constexpr uint64_t HITRACE_TAG_SAMGR = (1ULL << 55); // SA tag.
  38. constexpr uint64_t HITRACE_TAG_POWER = (1ULL << 56); // power manager tag.
  39. constexpr uint64_t HITRACE_TAG_DISTRIBUTED_SCHEDULE = (1ULL << 57); // Distributed schedule tag.
  40. constexpr uint64_t HITRACE_TAG_DEVICE_PROFILE = (1ULL << 58); // device profile tag.
  41. constexpr uint64_t HITRACE_TAG_DISTRIBUTED_INPUT = (1ULL << 59); // Distributed input tag.
  42. constexpr uint64_t HITRACE_TAG_BLUETOOTH = (1ULL << 60); // bluetooth tag.
  43. constexpr uint64_t HITRACE_TAG_ACCESSIBILITY_MANAGER = (1ULL << 61); // accessibility manager tag.
  44. constexpr uint64_t HITRACE_TAG_APP = (1ULL << 62); // App tag.
  45. constexpr uint64_t HITRACE_TAG_LAST = HITRACE_TAG_APP;
  46. constexpr uint64_t HITRACE_TAG_NOT_READY = (1ULL << 63); // Reserved for initialization.
  47. constexpr uint64_t HITRACE_TAG_VALID_MASK = ((HITRACE_TAG_LAST - 1) | HITRACE_TAG_LAST);
复制代码
实现原理

HiTraceMeter重要提供抓取用户态和内核态Trace数据的命令行工具,提供用户态办理的innerkits接口(c++)和kits接口(js),HiTraceMeter基于内核ftrace提供的用户态办理的扩展,利用ftrace的trace_marker节点,将用户空间通过办理接口写入的数据写进内核循环buffer缓冲区。其根本架构图如下:


束缚与限制



  • HiTraceMeter所有功能与接口的实现都依靠于内核提供的ftrace功能,ftrace 是内核提供的一个 framework,接纳 plugin 的方式支持开发人员添加更多种类的 trace 功能,因此利用HiTraceMeter之前要使能 ftrace,否则HiTraceMeter的功能无法利用(目前大部门Linux内核默认使能了ftrace,关于ftrace的具体介绍可查看内核ftrace相关资料 ftrace相关资料 )。
  • HiTraceMeter仅限小型系统、标准系统下利用。
HiTraceMeter开发指导

HiTraceMeter分为JS/C++应用办理API与数据采集命令行工具hitrace,下面分别介绍接口和命令行工具。
场景介绍

在现实开发过程中,开发者可能会遇到app卡顿或者在代码调试过程中需要查看代码调用流程,HiTraceMeter接口提供了相应的接口来跟踪步伐延时和代码调用流程,分析性能问题。
接口阐明

C++接口仅系统开发者利用,JS(目前暂未开放js接口)应用开发者可以略过本节。标准系统上接口形貌如下(hitrace_meter.h hitrace_meter.h ):
表 1 同步接口
Sync trace功能形貌参数阐明void StartTrace(uint64_t label, const std::string& value, float limit = -1);启动同步tracelabel: Trace category。
value: Trace携带的信息,表明当前的某种状态,例如内存大小,队列长短等。void FinishTrace(uint64_t label);关闭同步tracelabel: Trace category。 同步接口StartTrace和FinishTrace必须配对利用,FinishTrace和前面近来的StartTrace进行匹配。StartTrace和FinishTrace函数对可以嵌套模式利用,跟踪数据解析时利用栈式数据结构进行匹配。接口中的limit参数用于限流,利用默认值即可。
表 2 异步接口
Async trace功能形貌参数阐明void StartAsyncTrace(uint64_t label, const std::string& value, int32_t taskId, float limit = -1);开启异步tracelabel: Trace category。
value: Trace携带的信息,表明当前的某种状态,例如内存大小,队列长短等。
taskId:异步Trace中用来表示关联的ID。void FinishAsyncTrace(uint64_t label, const std::string& value, int32_t taskId);关闭异步tracelabel: Trace category。
value: Trace携带的信息,表明当前的某种状态,例如内存大小,队列长短等。
taskId:异步Trace中用来表示关联的ID。 异步接口StartAsyncTrace和FinishAsyncTrace的跟踪数据匹配时,利用参数中的value和taskId配对匹配,可以不按顺序利用,重要用于异步场景。在C++步伐中,利用异步跟踪的场景很少。
表 3 计数器接口
Counter Trace功能形貌参数阐明void CountTrace(uint64_t label, const std::string& name, int64_t);计数tracelabel: Trace category。
name: Trace的名称,IDE中会以此字段展示这段Trace。 开发步调


  • 编译依靠添加,需要修改的编译配置文件base\hiviewdfx\hitrace\cmd\BUILD.gn 。
    1. external_deps = [ "hitrace:hitrace_meter"]
    复制代码
  • 头文件依靠添加。
    1. #include "hitrace_meter.h"//接口函数定义头文件
    复制代码
  • 接口调用,将需要跟踪的Trace value传入参数,目前HiTraceMeter支持的Trace Tag在根本概念hitrace_meter.h中都已列出,我们以OHOS这个Tag为例,假设我们需要获取func1,func2函数的Trace数据,参考下面实例,在shell中执行hitrace命令后会自动抓取Trace数据,抓到的Trace数据中包括了函数调用过程以及调用过程消耗的内存和时间,可用于分析代码调用流程,代码性能问题。
    1. #include "hitrace_meter.h" // 包含hitrace_meter.h
    2. using namespace std;
    3. int main()
    4. {
    5.    uint64_t label = BYTRACE_TAG_OHOS;
    6.    sleep(1);
    7.    CountTrace(label, "count number", 2000);  // 整数跟踪
    8.    StartTrace(label, "func1Trace", -1); // func1Start的跟踪起始点
    9.    sleep(1);
    10.    StartTrace(label, "func2Trace", -1);   // func2Start的跟踪起始点
    11.    sleep(2);
    12.    FinishTrace(label);   // func2Trace的结束点
    13.    sleep(1);
    14.    FinishTrace(label);   // func1Trace的结束点
    15.    StartAsyncTrace(label, "asyncTrace1", 1234); // 异步asyncTrace1的开始点   
    16.    FinishAsyncTrace(label, "asyncTrace1", 1234); // 异步asyncTrace1的结束点
    17.    return 0;
    18. }
    复制代码
  • 利用方法,办理编译摆设完成后,运行下面命令行来抓取Trace。然后在端侧shell里运行应用,可以抓取到Trace数据。
    1. hdc_std shell hitrace -t 10 ohos > .\myapp_demo.ftrace
    复制代码
    抓取之后的数据可以在smartperf中"Open trace file"或者直接拖入图形区打开,关于smartperf的具体介绍可查看 smartperf 。
调测验证

以下为一个demo调试过程,该demo利用了同步接口中的StartTrace和FinishTrace。

  • 编写测试代码hitrace_example.cpp( hitrace_example.cpp ),将利用到的接口加入代码:
    1. int main()
    2. {
    3.     thread t1(ThreadFunc1);
    4.     t1.join();
    5.     StartTrace(LABEL, "testStart");
    6.     sleep(SLEEP_ONE_SECOND);
    7.     StartTrace(LABEL, "funcAStart", SLEEP_ONE_SECOND); // 打印起始点
    8.     FuncA();
    9.     FinishTrace(LABEL);
    10.     sleep(SLEEP_TWO_SECOND);
    11.     thread t2(ThreadFunc2);
    12.     t2.join();
    13.     StartTrace(LABEL, "funcBStart", SLEEP_TWO_SECOND);
    14.     FuncB();
    15.     FinishTrace(LABEL);// 打印结束点
    16.     sleep(SLEEP_TWO_SECOND);
    17.     sleep(SLEEP_ONE_SECOND);
    18.     FinishTrace(LABEL);
    19.     FuncC();
    20.     return 0;
    21. }
    复制代码
  • 修改gn编译文件并编译,编译配置文件路径base\hiviewdfx\hitrace\cmd\BUILD.gn 。
    1. ohos_executable("hitrace_example") {
    2.   sources = [ "example/hitrace_example.cpp" ]
    3.   external_deps = [ "hitrace:hitrace_meter" ]
    4.   subsystem_name = "hiviewdfx"
    5.   part_name = "hitrace_native"
    6. }
    7. group("hitrace_target") {
    8.   deps = [
    9.     ":hitrace",
    10.     ":hitrace_example",
    11.   ]
    12. }
    复制代码
  • 将编译出来的hitrace_example可执行文件放到设备中的/system/bin目录下,在shell中执行依次执行如下命令:
    1. hitrace --trace_begin ohos
    2. hitrace_exampe
    3. hitrace --trace_dump
    复制代码
    当我们看到Trace数据中有我们需要的Trace value时,阐明乐成抓取Trace,乐成的数据如下所示:
    1. <...>-1651    (-------) [002] ....   327.194136: tracing_mark_write: S|1650|H:testAsync 111
    2. <...>-1650    (-------) [001] ....   332.197640: tracing_mark_write: B|1650|H:testStart
    3. <...>-1650    (-------) [001] ....   333.198018: tracing_mark_write: B|1650|H:funcAStart
    4. <...>-1650    (-------) [001] ....   334.198507: tracing_mark_write: E|1650|
    5. <...>-1654    (-------) [003] ....   341.201673: tracing_mark_write: F|1650|H:testAsync 111
    6. <...>-1650    (-------) [001] ....   341.202168: tracing_mark_write: B|1650|H:funcBStart
    7. <...>-1650    (-------) [001] ....   343.202557: tracing_mark_write: E|1650|
    8. <...>-1650    (-------) [001] ....   346.203178: tracing_mark_write: E|1650|
    9. <...>-1650    (-------) [001] ....   346.203457: tracing_mark_write: C|1650|H:count number 1
    10. <...>-1650    (-------) [001] ....   347.203818: tracing_mark_write: C|1650|H:count number 2
    11. <...>-1650    (-------) [001] ....   348.204207: tracing_mark_write: C|1650|H:count number 3
    12. <...>-1650    (-------) [001] ....   349.204473: tracing_mark_write: C|1650|H:count number 4
    13. <...>-1650    (-------) [001] ....   350.204851: tracing_mark_write: C|1650|H:count number 5
    14. <...>-1655    (-------) [001] ....   365.944658: tracing_mark_write: trace_event_clock_sync: realtime_ts=1502021460925
    15. <...>-1655    (-------) [001] ....   365.944686: tracing_mark_write: trace_event_clock_sync: parent_ts=365.944641
    复制代码
HiTraceMeter命令行工具利用指导

HiTraceMeter提供了可执行的二进制步伐hitrace,设备刷openharmony后直接在shell中运行以下命令,抓取内核运行的数据,当前支持的操作如下:
表 4 命令行列表
OptionDescription-h,--help查看option帮助-b n,--buffer_size n指定n(KB)内存大小用于存取trace日志,默认2048KB-t n,--time n用来指定trace运行的时间(单位:s),取决于需要分析过程的时间--trace_clock clocktrace输出的时钟类型,一样平常设备支持boot、global、mono、uptime、perf等,默认为boot--trace_begin启动抓trace--trace_dump将数据输出到指定位置(默认控制台)--trace_finish停止抓trace,并将数据输出到指定位置(默认控制台)--trace_finish_nodump停止抓trace,不输出trace信息-l,--list_categories输脱手性能支持的trace模块--overwrite当缓冲区满的时候,将抛弃最新的信息。(默认抛弃最老的日志)-o filename,--output filename指定输出的目标文件名称-z抓取trace后进行压缩 以下是常用hitrace命令示例,供开发者参考:


  • 查询支持的label。
    1. hitrace -l
    复制代码
    或者
    1. hitrace --list_categories
    复制代码
  • 设置4M缓存,抓取10秒,抓取label为ability的trace信息。
    1. hitrace -b 4096 -t 10 --overwrite ability > /data/log/mytrace.ftrace
    复制代码
  • 设置trace的输出时钟为mono。
    1. hitrace --trace_clock mono  -b 4096 -t 10 --overwrite ability > /data/log/mytrace.ftrace
    复制代码
  • 抓取trace后进行压缩。
    1. hitrace -z  -b 4096 -t 10 --overwrite ability > /data/log/mytrace.ftrace
    复制代码
常见问题

hitrace抓数据不全或者没抓到数据

现象形貌

执行hitrace命令抓数据不全或者没抓到数据。
根因分析

参数-t 时间设置过小或者-b缓冲区buffer设置过小导致数据丢失。
办理方法

可设置-t 60,-b 204800扩大抓trace时间和缓冲区buffer办理。
最后

有许多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。以是有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 
这份鸿蒙(HarmonyOS NEXT)资料包罗了鸿蒙开发必掌握的核心知识要点,内容包罗了ArkTS、ArkUI开发组件、Stage模型、多端摆设、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
希望这一份鸿蒙学习资料可以或许给各人带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
如果你是一名有履历的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料
 获取这份完整版高清学习门路,请点击→纯血版全套鸿蒙HarmonyOS学习资料
鸿蒙(HarmonyOS NEXT)最新学习门路




  •  HarmonOS基础技能



  • HarmonOS就业必备技能 

  •  HarmonOS多媒体技术



  • 鸿蒙NaPi组件进阶



  • HarmonOS高级技能



  • 初识HarmonOS内核 

  • 实战就业级设备开发

 有了门路图,怎么能没有学习资料呢,小编也预备了一份团结鸿蒙官方发布条记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包罗:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习门路,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》


《鸿蒙生态应用开发V2.0白皮书》


《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发情况搭建

 《鸿蒙开发基础》



  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

 《鸿蒙开发进阶》



  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

《鸿蒙进阶实战》



  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结

总的来说,华为鸿蒙不再兼容安卓,对中年步伐员来说是一个挑衅,也是一个机遇。只有积极应对变化,不断学习和提升自己,他们才气在这个变革的期间中立于不败之地。 



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表