• 首页
  • 产品中心
  • 企业荣誉
  • 业界新闻
  • 汽车服务
  • 产品中心

    你的位置:【开元棋盘地址官方客服】 > 产品中心 > OpenHarmony源码剖析之DFX子体系

    OpenHarmony源码剖析之DFX子体系

    发布日期:2022-08-06 19:33    点击次数:91

    想相识更多内容,请拜访:

    51CTO和华为平易近间合作共建的鸿蒙技能社区

    https://harmonyos.51cto.com

    1 DFX简介

    DFX(Design for X)子体系是为了提升软件品格策画的器材集,而今包孕的内容首要有:DFR(Design for Reliability,牢靠性)和DFT(Design for Testability,可测试性)特点。

    而今标准体系已完成下列功用:

    HiLog:流水日志。 HiSysEvent:体系事宜记载接口。 HiView:插件平台。 FaultLoggerd:应用体系毛病订阅和采集。 HiAppEvent: js应用事宜记载接口。 1.1 OpenHarmony架构图 OpenHarmony 源码剖析之DFX子体系-标准体系接口应用分化-鸿蒙HarmonyOS技能社区

    注:本文只介绍DFX各组件的应用,后续会有文章零丁阐发各组件的源码。

    2 Hilog

    HiLog此日志体系,供应给体系框架、服务、以及应用打印日志,记实用户操作、体系运行形态等。

    用户态Process经由过程日志接口将日志内容写入hilogd buffer中,用户态的hilog器材支持将日志输出到掌握台(console)举行查察,同时也支持经由过程hilog器材给hilogd发送下令将日志落盘,设置指定日志范例缓冲区的大小等。

    HiLog架构图以下:

    注:而今代码暂未看到有支持读取kernel日志。

    代码组织:

    /base/hiviewdfx/hilog ├── frameworks           # 框架代码 │   └── native          # HiLog native实今世码 ├── interfaces           # 接口 │   └── native          # 对外C/C++接口 │       └── innerkits   # 对外部子体系表露的头文件 │       └── kits        # 对应用表露的头文件 ├── services │   └── hilogd          # 日志常驻服求实现 │   └── hilogtool       # 日志器材完成 

    从应用者的角度,只需求体贴hilog日志接口和hilog下令行器材的应用编制。

    2.1 hilog接口应用分化

    2.1.1 首要API分化

    OpenHarmony 源码剖析之DFX子体系-标准体系接口应用分化-鸿蒙HarmonyOS技能社区

    2.1.2 应用编制

    在模块BUILD.gn文件中增加寄托

    external_deps = [ "hilog_native:libhilog" ] 
    include头文件"hilog/log.h" 接口调用

    代码示例(下列代码从体系源码中摘录)

    #include <vector> +#include "hilog/log.h" #include "string_ex.h" #include "uri.h"  using std::string; using std::regex; +using OHOS::HiviewDFX::HiLog;  namespace OHOS { namespace { & -39,6 +41,7 & namespace {     const size_t POS_INC_MORE = 2;     const size_t POS_INC_AGAIN = 3;     const regex SCHEME_REGEX("[a-zA-Z][a-zA-Z|\\d|+|-|.]*$"); +    const HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "URI"}; }; // namespace  Uri::Uri(const string& uriString) & -48,6 +51,7 & Uri::Uri(const string& uriString)     port_ = NOT_CALCULATED;      if (uriString.empty()) { +        HiLog::Error(LABEL, "Input empty!");         return;     } 
    2.2 hilog下令行器材应用分化

    注:落盘日志文件生活生涯门路为"/data/log/hilog/"。

    3 HiSysEvent

    hisysevent组件定义了HiSysEvent埋点接供词应用框架、体系服务应用,用于向hiview上报体系事宜信息。经由过程在关键门路埋点记载体系在运行进程中的首要信息,辅佐开发者定位成就。

    OpenHarmony 源码剖析之DFX子体系-标准体系接口应用分化-鸿蒙HarmonyOS技能社区 3.1 接口分化
    /**      * @brief 写体系事宜      * @param domain    事宜的domain      * @param eventName 事宜名      * @param type      事宜范例      * @param keyValues 可变参数,键值对      * @return 0 告成,别的失利      */     template<typename... Types> static int Write(const std::string &domain, const std::string &eventName,         EventType type, Types... keyValues) 

     罗列范例EventType定义了事宜范例

    enum EventType {         FAULT     = 1,    // system fault event         STATISTIC = 2,    // system statistic event         SECURITY  = 3,    // system security event         BEHAVIOR  = 4     // system behavior event     }; 

     HiSysEvent外部类Domain中定义了一些字符串常量,用于默示差别的domain

    3.2 接口应用

    在BUILD.gn中增加寄托:

    external_deps = [ "hisysevent_native:libhisysevent" ] 

     在类定义头文件或许类完成源文件中,包孕HiSysEvent头文件:

    #include "hisysevent.h" 

     示例:(下列代码摘自源码)

    void EventReport::SendEvent(const EventInfo& eventInfo) {     auto packageName = AceApplicationInfo::GetInstance().GetPackageName();     if (packageName.size() > MAX_PACKAGE_NAME_LENGTH) {         StrTrim(packageName);     }     OHOS::HiviewDFX::HiSysEvent::Write(OHOS::HiviewDFX::HiSysEvent::Domain::ACE, eventInfo.eventType,         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,         EVENT_KEY_ERROR_TYPE, eventInfo.errorType,         EVENT_KEY_PACKAGE_NAME, packageName); } 

     hiview在收到音讯后会打印日志,并把事宜生活生涯到

    /data/log/LogService/sys_event_db/hisysevent.db 数据库中。

    日志以下:

    行 10430: 12-06 15:41:03.176   369   537 D 02d10/HiView-EventServer: Start: receive data from client <private> 行 10431: 12-06 15:41:03.176   369   537 D 02d10/HiView-SysEventSource: Parser: parser raw message size=301, {"domain_":"ACE","name_":"JS_ERROR","type_":1,"time_":1638805263175,"pid_":821,"tid_":839,"PACKAGE_NAME":"","REASON":"Js Crash","SUMMARY":"Lifetime: 0.000000s 行 10432: 12-06 15:41:03.176   369   537 D 02d10/HiView-SysEventSource: Js-Engine: Quick JS 行 10433: 12-06 15:41:03.176   369   537 D 02d10/HiView-SysEventSource: Stacktrace: TypeError: cannot read property 'getAppPageStartConfig' of undefined 行 10434: 12-06 15:41:03.176   369   537 D 02d10/HiView-SysEventSource:     at onPageShow (pages/EntryView.js) 行 10435: 12-06 15:41:03.176   369   537 D 02d10/HiView-SysEventSource:     at onPageShow (pages/EntryView.js) 行 10472: 12-06 15:41:03.180   369   537 I 02d10/HiView-SysEventSource: Parser: parser result domain_=ACE eventName_=JS_ERROR 行 10473: 12-06 15:41:03.180   369   537 D 02d10/HiView-EventSource: PublishPipelineEvent: EventSource PublishPipelineEvent 行 10474: 12-06 15:41:03.180   369   547 I 02d10/HiView-SysEventService: Convert2SysEvent: domain is ACE, eventName is JS_ERROR. 行 10485: 12-06 15:41:03.180   369   547 D 02d10/HiView-SysEventDao: Insert: insert db file /data/log/LogService/sys_event_db/hisysevent.db with JS_ERROR 行 10837: 12-06 15:41:03.232   369   547 I 02d10/HiView-DOCDB: open ejdb success 行 10838: 12-06 15:41:03.232   369   547 I 02d10/HiView-DOCDB: open doc store 行 11141: 12-06 15:41:03.249   369   547 D 02d10/HiView-DOCDB: put data to doc store success 行 11142: 12-06 15:41:03.250   369   547 D 02d10/HiView-SysEventDbMgr: SaveToStore: save sys event 1,产品中心 JS_ERROR 行 11227: 12-06 15:41:03.253   369   547 I 02d10/Faultlogger: AddFaultLogIfNeed: Invalid module name 行 11229: 12-06 15:41:03.253   369   547 I 02d10/HiView-SysEventSource: Recycle: recycle resource 
    4 HiView

    Hiview是一个跨平台的终端动作举措维测服务集。而今开源部份仅包孕插件解决平台和体系事宜源。

    架构图以下:

    OpenHarmony 源码剖析之DFX子体系-标准体系接口应用分化-鸿蒙HarmonyOS技能社区

    Hiview由框架和插件形成,首要包孕下列几部份:

    操作体系适配层(adapter),对应用的体系服务的接口举行适配。 Hiview底子定义(hiview base),蕴含插件基类、管道的定义,事宜、事宜行列定义以及一些器材类。 Hiview的焦点模块(hiview core),蕴含插件设置,插件解决以及事宜源。 Hiview服务(hiview services),而今仅蕴含hiview运行信息dump功用。 Hiview插件(plugins),为独立功用的业务模块。 Hiview维测服务是由事宜驱动的,其焦点为漫衍在体系各处的HiSysEvent桩点。

    项目化的事宜经由过程HiSysEvent API上报至hiview举行处理惩罚,请参考第三节HiSysEvent的架构图。

    1.应用框架、体系服务应用HiSysEvent组件上报体系事宜。

    2.Hiview中SysEventSource取得音讯,剖析并组装成管道事宜散发给插件处理惩罚。

    注:hiview而今并未对外供应接口。

    5 FaultLoggerd

    faultloggerd是OpenHarmony中的C/C++运行时崩溃暂且日志的生成及解决模块。首要流程以下:

    过程A调用接口订阅体系毛病采集功用。

    过程A的很是旗子灯号处理惩罚器检测到很是旗子灯号后Fork出子过程运行processdump顺序。

    processdump顺序Ptrace到父过程上,读取很是线程相干信息,蕴含寄存器以及调用栈。

    processdump顺序在读取很是信息后将其写入到/data/log/faultlog/temp目录下中做暂且存储。

    接口应用编制:

    在模块的BUILD.gn文件中增加寄托

    deps = ["//base/hiviewdfx/faultloggerd/interfaces/innerkits/signal_handler:dfx_signalhandler"] 
    包孕"dfx_signal_handler.h"头文件 调用DFX_InstallSignalHandler()编制订阅体系毛病采集功用。

    示例:(下列代码摘自源码)

    base/telephony/ril_adapter/hril_hdf/hril_hdf.c中

    #include "hril_hdf.h" #include <pthread.h> #include "dfx_signal_handler.h" //................[1]头文件 #include "telephony_log_c.h"  static int32_t RilAdapterInit(struct HdfDeviceObject *device) {     if (device == NULL) {         return HDF_ERR_INVALID_OBJECT;     }     DFX_InstallSignalHandler(); //................[2]订阅体系毛病采集功用     struct HdfSBuf *sbuf = HdfSBufTypedObtain(SBUF_IPC);     if (sbuf == NULL) {         TELEPHONY_LOGE("HdfSampleDriverBind, failed to obtain ipc sbuf");         return HDF_ERR_INVALID_OBJECT;     }     if (!HdfSbufWriteString(sbuf, "string")) {         TELEPHONY_LOGE("HdfSampleDriverBind, failed to write string to ipc sbuf");         HdfSBufRecycle(sbuf);         return HDF_FAILURE;     }     if (sbuf != NULL) {         HdfSBufRecycle(sbuf);     }     TELEPHONY_LOGD("sbuf IPC obtain test success!");     LoadVendor();     return HDF_SUCCESS; } 

    注:顺序崩溃后会在/data/log/faultlog/temp门路下生成暂且文件。体系开发者可以或许经由过程日志定位崩溃成就。

    6 HiAppEvent

    HiAppEvent为JS应用供应事宜解决接口,用于协助应用记载在运行进程中发生的体系毛病信息、统计信息、安好信息、用户动作信息,以支持开发者阐发应用的运行环境。

    OpenHarmony 源码剖析之DFX子体系-标准体系接口应用分化-鸿蒙HarmonyOS技能社区 6.1 接口分化

    js接口定义文件:interface/sdk-js/api/phone/@ohos.hiAppEvent.d.ts

    6.1.1 解决接口

    JS 事宜范例罗列——EventType

    | 范例 | 形貌|

    | ----- | ----- |

    | FAULT | 体系毛病范例事宜 |

    | STATISTIC | 统计范例事宜 |

    | SECURITY | 安好范例事宜 |

    | BEHAVIOR | 动作范例事宜 |

    function write(eventName: string, eventType: EventType, keyValues: object): Promise; 应用事宜异步解决编制,应用promise编制作为异步回调。

    function write(string eventName, EventType type, object keyValues,

    AsyncCallback callback): void 应用事宜异步解决编制,应用callback编制作为异步回调。

    输入参数分化:

    eventName:事宜名称。 eventType:事宜范例。 keyValues:事宜参数键值对,为Json工具范例。 callback:回调函数,可以或许在回调函数中处理惩罚接口前去值。前去值为0默示事宜参数校验告成,事宜畸形异步写入事宜文件;大于0默示事宜存在很是参数,事宜在轻忽很是参数后再异步写入事宜文件;小于0默示事宜校验失利,不执行事宜异步解决操作。

    6.1.2 解决设置接口

    function configure(config: ConfigOption): boolean;应用事宜解决设置编制,可以或许对解决功用举行自定义设置。

    参数config:应用事宜解决设置项。

    前去值:boolean,true默示设置告成,false默示设置失利。

    ConfigOption应用解决设置选项

    | 设置名 | 范例|必填 |分化|

    | ----- | ----- |----- | ----- |

    | disable | boolean |否|应用解决功用开关,true默示敞开解决功用,false默示不敞开解决功用|

    | maxStorage | string |否|解决数据外埠存储文件所在目录的配额大小,默认限额为“10M”。所在目录大小超出限额后会对目录举行清理操作,会按从旧到新的按次一一删除解决数据文件,直到目录大小不超出限额时收场。|

    6.2 接口应用

    引入模块:

    import hiAppEvent from ‘@ohos.hiAppEvent’ 

    应用事宜解决:

    callback编制

    hiAppEvent.write("testevent", hiAppEvent.EventType.BEHAVIOR, {"key":"value"},           (err, value) => {               console.log(`HiAppEvent testevent callback`);               if (err) {                   // 事宜写入很是:事宜存在很是参数或许事宜校验失利不执行写入                   console.error(`HiAppEvent json-callback-error code=${err.code}`);               } else {                   console.log(`HiAppEvent json-callback-success value=${value}`)               }           }); 

     Promise编制

    hiAppEvent.write("test_event", hiAppEvent.EventType.FAULT, {"int_data":100, "str_data":"strValue"})   .then((value) => {       // 事宜写入畸形       console.log(`success to write event: ${value}`);   }).catch((err) => {       // 事宜写入很是:事宜存在很是参数或许事宜校验失利不执行写入       console.error(`failed to write event because ${err.code}`);   }); 

     应用解决设置

    设置应用事宜解决功用开关

    hiAppEvent.configure({      disable: true }); 

    设置事宜文件目录存储限额大小

    hiAppEvent.configure({      maxStorage: '15M' }); 
    7 总结

    本文对标准体系而今已支持的DFX功用模块举行了介绍。demo请下载附件。

    https://harmonyos.51cto.com/resource/1646

    https://harmonyos.51cto.com/resource/1647

    想相识更多内容,请拜访:

    51CTO和华为平易近间合作共建的鸿蒙技能社区

    https://harmonyos.51cto.com