更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com1DFXDFX(DesignforX)子系统简介是一个旨在提高软件质量的工具集,目前包括:DFR(DesignforReliability,可靠性)和DFT(DesignforTestability,可测试性)特性。目前标准系统已经实现了以下功能:HiLog:流水日志。HiSysEvent:系统事件记录接口。HiView:插件平台。FaultLoggerd:应用故障订阅和收集。HiAppEvent:js应用事件记录接口。1.1OpenHarmony架构注:本文只介绍DFX各个组件的使用,后续文章将分别分析各个组件的源码。2HilogHiLog是一个日志系统,提供系统框架、服务和应用程序来打印日志、记录用户操作和系统运行状态。用户态进程通过日志接口将日志内容写入hilogd缓冲区。用户态的hilog工具支持将日志输出到控制台(console)查看,也支持通过hilog工具向hilogd发送命令将日志转储到磁盘,设置指定日志类型缓冲区的大小等HiLog架构图如下:注:目前代码不支持读取内核日志。代码结构:/??base/hiviewdfx/hilog├──frameworks#框架代码│└──native#HiLognative实现代码├──interfaces#interface│└──native#externalC/C++接口│└──innerkits#tointernal子系统暴露的头文件│└──kits#暴露给应用程序的头文件├──services│└──hilogd#日志常驻服务实现│└──hilogtool#日志工具实现从用户的角度来说,只需要关注hilog日志界面和hilog命令行工具的使用。2.1hilog接口使用说明2.1.1主要API说明2.1.2使用方法在模块BUILD.gn文件中添加依赖external_deps=["hilog_native:libhilog"]include头文件"hilog/log.h"接口调用代码例子(下面的代码是从系统源代码中提取出来的)#include+#include"hilog/log.h"#include"string_ex.h"#include"uri.h"usingstd::string;usingstd::regex;+usingOHOS::HiviewDFX::HiLog;namespaceOHOS{namespace{@@-39,6+41,7@@namespace{constsize_tPOS_INC_MORE=2;constsize_tPOS_INC_AGAIN=3;constregexSCHEME_REGEX("[a-zA-Z][a-zA-Z|\\d|+|-|.]*$");+constHiviewDFX::HiLogLabelLABEL={LOG_CORE,0xD001800,"URI"};};//namespaceUri::Uri(conststring&uriString)@@-48,6+51,7@@Uri::Uri(conststring&uriString)port_=NOT_CALCULATED;if(uriString.empty()){+HiLog::Error(LABEL,"Inputempty!");return;}2.2hilog命令行工具使用说明日志文件保存路径为“/data/log/hilog/”。3HiSysEventthisysevent组件定义了HiSysEvent埋点接口,供应用框架和系统服务向hiview上报系统事件信息。通过在关键路径中记录系统在运行过程中的重要信息,辅助开发人员定位问题。3.1接口说明/***@brief写系统事件*@paramdomain事件域*@parameventName事件名称*@paramtype事件类型*@paramkeyValues可变参数,键值对*@return0成功,其他失败*/templatestaticintWrite(conststd::string&domain,conststd::string&eventName,EventTypetype,Types...keyValues)枚举类型EventType定义事件类型enumEventType{FAULT=1,//systemfaulteventSTATISTIC=2,//systemstatisticeventSECURITY=3,//systemsecurityeventBEHAVIOR=4//systembehaviorevent};HiSysEvent内部类Domain中定义了一些字符串常量来表示不同的domain3.2接口。在BUILD.gn中添加依赖:external_deps=["hisysevent_native:libhisysevent"]在类定义头文件或类实现源文件中包含HiSysEvent头文件:#include"hisysevent.h"示例:(以下代码摘自源代码)voidEventReport::SendEvent(constEventInfo&eventInfo){autopackageName=AceApplicationInfo::GetInstance().GetPackageName();if(packageName.size()>MAX_PACKAGE_NAME_LENGTH){StrTrim(packageName);}OHOS::HiviewDFX::HiSysEvent::写入(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-0615:41:03.176369537D02d10/HiView-EventServer:Start:receivedatafromclient行10431:12-0615:41:03.176369537D02d10/HiView-domainSysEventSource:Parsermessageserra30{Parser1,parserra30":"ACE","name_":"JS_ERROR","type_":1,"time_":1638805263175,"pid_":821,"tid_":839,"PACKAGE_NAME":"","REASON":"JsCrash","SUMMARY":"Lifetime:0.000000s行10432:12-0615:41:03.176369537D02d10/HiView-SysEventSource:Js-Engine:QuickJS行10433:12-0615:41:03.176369537D02StackysEventSource-10/HiView-SysEventSource::TypeError:cannotreadproperty'getAppPageStartConfig'ofundefined行10434:12-0615:41:03.176369537D02d10/HiView-SysEventSource:atonPageShow(pages/EntryView.js)行10435:12-0615:41:03.176369537D02ShowPaged(SourceShowd:10/HiView-SysEventSource:atonPageShow(pages/EntryView.js)页/EntryView.js)行10472:12-0615:41:03.180369537I02d10/HiView-SysEventSource:Parser:parserresultdomain_=ACEeventName_=JS_ERROR行10473:12-0615:41:03.180369537D02d10/HiView-EventSource:PublishPipelineEvent:EventSourcePublishPipelineEvent行10474:12-0615:41:03.180369547I02d10/HiView-SysEventService:Convert2SysEvent:domainisACE,eventNameisJS_ERROR.行10485:12-0615:41:03.180369547D02d10/HiView-SysEventDao:Insert:insertdbfile/data/log/LogService/sys_event_db/hisysevent.dbwithJS_ERRORline10837:12-0615:41:03.232369547I02d10/HiView-DOCDB:12080808line:1541:03.232369547I02d10/hiview-docdb:opendocstore行11141:12-0615:41:03.24936954D02D10/hiview-docdb:putdatatocstoreuccess行11142:12-0615:12-0615:41:41:41:03.250369547D020202020202020202DYIVERTYERE::41:03.253369547I02d10/Faultlogger:AddFaultLogIfNeed:Invalidmodulenameline11229:12-0615:41:03.253369547I02d10/HiView-SysEventSource:Recycle:recycleresource4HiViewHiview是一个跨平台的开源终端设备维护测量服务集包含插件管理平台和系统事件源。架构图如下:Hiview由框架和插件组成,主要包括以下几个部分:操作系统适配层(adapter),适配所使用的系统服务的接口。Hiview基础定义(hiviewbase),包括插件基类、管道定义、事件定义、事件队列定义和一些工具类。Hiview核心模块(hiviewcore),包括插件配置、插件管理和事件源。Hiview服务(hiviewservices),目前只包含hiview运行信息的dump功能。Hiview插件(插件)是具有独立功能的业务模块。Hiview测量服务由事件驱动,其核心是分布在整个系统中的HiSysEvent存根。格式化事件通过HiSysEventAPI上报给hiview进行处理,请参考第三节HiSysEvent的架构图。1、应用框架和系统服务使用HiSysEvent组件上报系统事件。2.Hiview中的SysEventSource获取消息,解析组装成管道事件分发给插件处理。注:hiview目前不对外提供接口。5FaultLoggerdfaultloggerd是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()方法订阅故障采集功能。示例:(以下代码摘自源码)#include"hril_hdf.h"inbase/telephony/ril_adapter/hril_hdf/hril_hdf.c#include#include"dfx_signal_handler.h"//.................[1]头文件#include"telephony_log_c.h"staticint32_tRilAdapterInit(structHdfDeviceObject*device){if(device==NULL){returnHDF_ERR_INVALID_OBJECT;}DFX_InstallSignalHandler();//............[2]订阅失败收集函数structHdfSBuf*sbuf=HdfSBufTypedObtain(SBUF_IPC);if(sbuf==NULL){TELEPHONY_LOGE("HdfSampleDriverBind,failedtoobtainipcsbuf");returnHDF_ERR_INVALID_OBJECT;}if(!HdfSbufWriteString(sbuf,"string")){TELEPHONY"HdfSampleDriverBind,failedtowritestringtoipcsbuf");HdfSBufRecycle(sbuf);returnHDF_FAILURE;}if(sbuf!=NULL){HdfSBufRecycle(sbuf);}TELEPHONY_LOGadorbuftest("!();returnHDF_SUCCESS;}注意:程序崩溃后会生成一个临时文件生成在/data/log/faultlog/temp路径下,系统开发者可以通过日志定位crash问题。6HiAppEventHiAppEvent为JS应用提供事件管理接口,用于帮助应用记录运行过程中发生的故障信息、统计信息、安全信息、用户行为信息,以支持开发者分析应用的运行情况.6.1接口描述js接口定义文件:interface/sdk-js/api/phone/@ohos.hiAppEvent.d.ts6.1.1dot接口JS事件类型枚举——EventType|类型|说明||-----|-----||故障|故障类型事件||统计|统计类型事件||安全|安全类事件||行为|行为类型event|functionwrite(eventName:string,eventType:EventType,keyValues:object):Promise;应用事件异步管理方法,使用promise方法作为异步回调。functionwrite(stringeventName,EventTypetype,objectkeyValues,AsyncCallbackcallback):void应用事件的异步处理方法,使用回调方法作为异步回调。输入参数说明:eventName:事件名称。eventType:事件类型。keyValues:事件参数键值对,Json对象类型。callback:回调函数,可以在回调函数中处理接口的返回值。返回值为0表示事件参数校验成功,事件正常异步写入事件文件;大于0表示事件参数异常,忽略异常参数后异步写入事件文件;小于0表示事件校验失败,不执行事件异步打点操作。6.1.2点配置接口函数configure(config:ConfigOption):boolean;应用事件打点配置方式自定义打点功能。参数config:应用事件管理配置项。返回值:boolean,true表示配置成功,false表示配置失败。ConfigOption应用管理配置选项|配置名称|类型|需要|说明||-----|-----|-----|-----||禁用|布尔|没有|申请打点功能开关,true表示关闭打点功能,false表示不关闭打点功能||最大存储|字符串|否|管理数据本地存储文件所在目录的配额大小,默认限制为“10M”。目录大小超过配额后,将清理目录,将管理数据文件按照从旧到新的顺序一个一个删除,直到目录大小不超过配额。|6.2接口使用导入模块:importhiAppEventfrom'@ohos.hiAppEvent'应用事件管理:回调方式hiAppEvent.write("testevent",hiAppEvent.EventType.BEHAVIOR,{"key":"value"},(err,value)=>{console.log(`HiAppEventtesteventcallback`);if(err){//事件写入异常:事件参数异常或事件校验失败不会写入console.error(`HiAppEventjson-callback-errorcode=${err.code}`);}else{console.log(`HiAppEventjson-callback-successvalue=${value}`)}});Promise方法hiAppEvent.write("test_event",hiAppEvent.EventType.FAULT,{"int_data":100,"str_data":"strValue"}).then((value)=>{//正常写入事件console.log(`successtowriteevent:${value}`);}).catch((err)=>{//事件写入异常:事件参数异常或事件校验失败未执行写入console.error(`failedtowriteeventbecause${err.code}`);});Applydotconfiguration配置应用事件dot功能开关hiAppEvent.configure({disable:true});配置事件文件目录存储配额大小hiAppEvent.configure({maxStorage:'15M'});7小结本文介绍标准系统目前支持的DFX功能模块。请下载附件进行演示。https://harmonyos.51cto.com/resource/1646https://harmonyos.51cto.com/resource/1647更多信息请访问:与华为官方共建的Harmonyos技术社区https://harmonyos。51cto.com