作为基础软件服务子体系的HarmonyOS HiViewDFX(以下简称HiViewDFX)结构,是HarmonyOS的公共基础设施。包含日志、事情、盯梢、毛病办理及观测剖析五大部分,一起也供给了毛病检测、定位和功能观测剖析的开发套件,以及将端侧数据直接对接云侧大数据质量剖析渠道和IDE(Integrated Development Environment, 集成开发环境)调试调优东西。为应对运用开发难题,HiViewDFX供给了高保证才能。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
HarmonyOS HiViewDFX结构图

一、HiViewDFX介绍

一般地,捕获反常信号需求自行添加捕获反常的机制,经过信号来感知反常及收集对应的反常日志,可是往往这类信息无法有用的与体系信息相关。

HiViewDFX为运用开发者供给了具有轻量级毛病检测、精准的毛病定位日志以及快速康复功用的开发套件,能够迅速进步运用的牢靠性。

如下图所示,在HarmonyOS体系中首要内置溃散、走漏、卡死等轻量级毛病检测器,用来记载运用在体系侧的反常状况。

其次,在运用程序结构内及运行时添加了反常捕获才能,使得体系和运用能够分层检测和记载反常信息,经过开放查询、订阅、康复三个API(Application Programming Interface, 运用程序编程接口)供给给开发者。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
HarmonyOS运用反常处理结构图

在运用溃散和卡死的时分,HiViewDFX供给的精准日志定位功用能够详细地记载反常发生时的日志。

HiViewDFX 供给了对应的运用反常日志查询接口,将JS_CRASH, CPP_CRASH, APP_FREEZE这三类毛病日志供给给开发者,并且是结构化的日志信息,开发者能够从反馈的信息中快速获取到毛病的相关信息。

为给用户供给更佳的体验,在日志信息反馈反常数据的基础上,HiViewDFX供给了运用快速康复的结构(如下图),当体系感知到JS_CRASH, CPP_CRASH, APP_FREEZE, KILL等毛病之后,能快速告诉运用,运用将之前的状况进行保存,然后体系会主动拉起运用,然后康复到毛病前的原界面。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
运用康复结构图

二、HIViewDFX相关东西介绍

HiViewDFX的东西入口—Insight,是DevEco Studio中的插件,拥有众多体系才能支撑,如图所示,有调试衔接器、HiTrace、HiPerf 以及HiProfiler 结构。

HiViewDFX供给的体系才能包含日志、事情、分布式盯梢、毛病等。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下

HiViewDFX调试调优架构图

接下来,就让咱们一起了解下HiViewDFX供给的部分东西吧!

1)调试衔接器

如下图所示,调试衔接器是衔接上位机和下位机的通道,一般用做嵌入式开发,常用的衔接东西,比方,根据串口或许网口的Telnet、SSH等。

HarmonyOS面向不同形状的设备时,这些设备可能不具备网口或许USB端口,只要一个串口,要支撑这个,串口上需求具备Shell和文件IO等功用。有了调试衔接器作为中转,就能够让开发者运用的IDE和其他东西脚本无需面对硬件的复杂性,更好的重视调试和调优本身。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
调试衔接器原理示意图

2)HiTrace

如下图所示,HiTrace东西用于追踪进程轨道,进行程序功能剖析,支撑内核FTrace预置埋点和用户态打点。

在功能剖析中,Trace是最常用的方法,能够说Trace便是功能的日志,把Trace按照模块分门别类,这便是Trace的Tag。例如,Sched是操作体系内核的调度信息打点;Ability是Ability模块在用户态的要害生命周期打点。

假设定位某运用掉帧的问题,在剖析时,打开Graphic、Ability、Sched等tag点,能够在Insight里面剖析运用在送显、图形模块制作相关的耗时。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
HiTrace东西原理示意图

3)HiPerf

如下图所示,HiPerf是为开发者供给的采样调优剖析东西,经过采样的方法,能够收集CPU PMU、Tracepoints以及程序热门函数信息,并且和Insight联动,供给离线和实时剖析的才能。

HiPerf收集定位过程中会遇到一个难点:运用跨编程言语,在程序运行时,可能会存在一些跨言语的调用。例如,从JS调用NAPI到C++接口等。

由于是抽样的调用栈收集,假如只收集其间一种言语的调用栈会导致两个言语之间的耗时数据无法同步,然后产生抵触,影响功能问题的衡量和定位,所以在调用栈收集的时分进行缝合。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
HiPerf东西原理示意图

如下图所示,这段JS代码调用了三个内存相关的数据获取接口,均是NAPI实现的NATIVE接口。

在HiPerf中,首要收集NAPI调用JS的调用栈信息,当收集到一个C++的调用栈时,此刻栈顶是函数NativeFunctionCallBack()的NAPI回调,则这个NATIVE调用栈就能够和前一次收集到的JS调用栈合并,终究拼接出一个完整的调用栈。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
NAPI调用中JS-CPP栈缝合示意图

除了上述体系内置的剖析点,开发者也能够经过HiTrace接口添加自界说的功能剖析打点。

如下列代码所示,HiTraceMeter的接口比较简单,找到一段流程的开端和结束,加上Trace打点,就能在Insight中看到Start-End的耗时。

// API
declare namespace hiTraceMeter {
    // Async trace
    function startTrace(name: string, taskId: number, exceptedTime?: number): void;
    function finishTrace(name: string, taskId: number): void;
    // Counter trace
    function traceByValue(name: string, count: number): void;
}
//example
onWindowStageCreate(windowStage) {
    ...
    hiTraceMeter.startTrace('getMainWindow');
    windowStage.getMainWindow().then((win) => {
        Appstorage.SetOrCreate(Constants.MAIN_WINDOW, win);
        hiTraceMeter.finishTrace('getMainWindow');
        ...
    });
    ...
}

HiTrace API介绍及开发样例图

4)HiProfilerHiProfiler

结构是根据HiViewDFX基础才能构建的一个插件集,能够为Insight供给调优数据收集。

该组件全体分为PC端和设备端两部分。

PC端终究作为DevEco Studio的插件进行发布,内部首要包含分为UI制作、设备办理、进程办理、插件办理、数据导入、数据存储、 数据剖析、Session办理、配置办理等模块。

设备端首要包含命令行东西、服务进程、插件调集、运用程序组件等模块。

设备端供给了插件扩展才能,对外供给了插件接口,根据该扩展才能能够按需界说自己的才能,并集成到结构中。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
HiProfiler结构

三、怎么查询内存信息

操作体系对内存是分级界说的,从物理地址空间到虚拟地址空间,再分为用户态和内核态。运用内存调优剖析的时分,还需求分解到虚拟地址、Ark JS的内存、NATIVE的内存、字体图标等资源、So的映射、线程栈等,这些都属于内存观测的规模。

HiViewDFX供给了HiDumper东西,作用是体系信息查询,它供给了体系版本、CPU占用率、内存以及Sa信息,开发者能够运用HiDumper来剖析运用的内存(如下图)。开发者剖析内存比较重视的是Ark JS Heap以及NATIVE Heap、Pss、Dirty这些目标,假如程序有内存走漏或许一般的内存膨胀的问题,能够看到这些值会不断变大。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
HiDumper检查内存信息示意图

假如运用要在程序中监控内存,能够运用这组HiDebug接口(如下列代码所示),前三个接口是NATIVE内存分配器的计算信息,能够获取NATIVE分配器的总巨细、分配巨细和可用巨细,后三个接口是从体系Smaps获取的计算信息,留意这两个信息不是一个维度上的,不能做数据的同等,在运用场景上也有差异。

// API
declare namespace hidebug {
    function getNativeHeapSize(): bigint;
    function getNativeHeapAllocatedSize(): bigint;
    function getNativeHeapFreeSize(): bigint;
    function getPss(): bigint;
    function getSharedDirty(): bigint;
    function getPrivateDirty(): bigint;
}

HiDebug接口示意图

分配器的信息常常用于计算程序中对Native内存的分配情况,不代表这些内存实践被运用,这部分内存是开发者能够操控且能够进行优化的。

而体系Smaps计算信息,常用于程序感知自身内存的实践占用巨细,这个巨细常常受到分配器延迟开释、体系延迟回收、Copy-on-write、分配器MetaData额外损耗等,形成计算出来的内存信息和分配器操控的内存不完全同等,往往不能作为内存优化的直接依据,而是作为内存压力计算的依据。

四、怎么进行内存调优剖析

咱们经过信息查询得知了内存的巨细信息,那么怎么进行内存剖析呢?

如下图所示,右侧部分是开发者运用Insight进行剖析的样例。

首要剖析泳道图上的内存曲线,得到三类数据,JS、Native和虚拟内存,它们收集的分配信息根本都比较类似。例如,图中分配信息部分,姓名和调用栈,是区分一块内存的重要信息,地址和巨细是一块内存的根本信息。引证联系能够协助咱们树立内存之间的联系树,协助咱们更快找到内存的引进点。分配时间则能够协助开发者了解哪些内存会长时间存留,长时间存留的内存是需求重点重视的。

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下
内存剖析数据收集原理图

另外,虽然虚拟内存在64位上可能不是一个痛点问题,可是在32位程序上常常会导致问题。32位程序的地址空间只要4GB,假如是32位内核,那么用户态一般情况只要3GB地址空间,这种情况下开发者需求重视虚拟内存的运用情况,HarmonyOS的做法是在Mmap的当地进行Hook,拿到分配的调用栈,并且对体系映射的绝大多数匿名页都进行了命名。因此不论是文件页还是匿名页,在分配信息中都能看到页的命名信息,这关于内存剖析非常有协助。

以上便是HiViewDFX供给的牢靠性和功能优化调试调优才能的相关介绍了,欢迎广阔开发者运用HiViewDFX结构来开发一个高牢靠高功能的运用!

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下