鸿蒙南向开发实战:HiSysEvent打点

201 篇文章 1 订阅
126 篇文章 0 订阅

HiSysEvent打点提供了事件打点功能,开发者可以通过在关键路径打点来记录系统在运行过程中的重要信息。同时,HiSysEvent打点也提供了以事件领域为单位的HiSysEvent打点屏蔽机制,方便开发者评估及调试HiSysEvent打点操作的影响。

运作机制

在进行HiSysEvent事件打点之前,需要先完成HiSysEvent打点配置。

开发指导

场景介绍

事件打点的主要工作是将打点数据进行落盘。

接口说明

C++接口说明

C++事件打点开发能力如下:HiSysEvent类,具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include/)。

说明:

从OpenHarmony-3.2-Beta3版本开始,为避免打点风暴事件引发性能问题,对HiSysEvent打点进行了管控。表1中的HiSysEvent::Write打点接口被表2中的HiSysEventWrite宏接口取代。HiSysEvent::Write接口已废弃,请使用HiSysEventWrite宏接口完成HiSysEvent事件打点。

表1 事件打点接口(已废弃)

接口名描述
template<typename... Types> 
static int Write(const std::string &domain, const std::string &eventName, EventType type, Types... keyValues)
将打点事件数据进行落盘。

表2 事件打点宏接口

接口名描述
HiSysEventWrite(domain, eventName, type, ...)将打点事件数据进行落盘。

表3 EventType事件类型枚举

事件类型描述
FAULT故障类型事件。
STATISTIC统计类型事件。
SECURITY安全类型事件。
BEHAVIOR行为类型事件。
C接口说明

C事件打点开发能力如下:具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include/)。

表4 事件打点接口

接口名描述
int OH_HiSysEvent_Write(const char* domain, const char* name, HiSysEventEventType type, HiSysEventParam params[], size_t size);将打点事件数据进行落盘。

表5 HiSysEventEventType事件类型枚举

事件类型描述
HISYSEVENT_FAULT故障类型事件。
HISYSEVENT_STATISTIC统计类型事件。
HISYSEVENT_SECURITY安全类型事件。
HISYSEVENT_BEHAVIOR行为类型事件。

表6 HiSysEventParam事件参数结构体

属性名称属性类型描述
namechar name[]事件参数名称。
tHiSysEventParamType事件参数类型。
vHiSysEventParamValue事件参数值。
arraySizesize_t事件参数值为数组类型时的数组长度。

表7 HiSysEventParamType事件参数类型枚举

参数类型描述
HISYSEVENT_INVALID无效类型事件参数。
HISYSEVENT_BOOLbool类型事件参数。
HISYSEVENT_INT8int8_t类型事件参数。
HISYSEVENT_UINT8uint8_t类型事件参数。
HISYSEVENT_INT16int16_t类型事件参数。
HISYSEVENT_UINT16uint16_t类型事件参数。
HISYSEVENT_INT32int32_t类型事件参数。
HISYSEVENT_UINT32uint32_t类型事件参数。
HISYSEVENT_INT64int64_t类型事件参数。
HISYSEVENT_UINT64uint64_t类型事件参数。
HISYSEVENT_FLOATfloat类型事件参数。
HISYSEVENT_DOUBLEdouble类型事件参数。
HISYSEVENT_STRINGchar*类型事件参数。
HISYSEVENT_BOOL_ARRAYbool数组类型事件参数。
HISYSEVENT_INT8_ARRAYint8_t数组类型事件参数。
HISYSEVENT_UINT8_ARRAYuint8_t数组类型事件参数。
HISYSEVENT_INT16_ARRAYint16_t数组类型事件参数。
HISYSEVENT_UINT16_ARRAYuint16_t数组类型事件参数。
HISYSEVENT_INT32_ARRAYint32_t数组类型事件参数。
HISYSEVENT_UINT32_ARRAYuint32_t数组类型事件参数。
HISYSEVENT_INT64_ARRAYint64_t数组类型事件参数。
HISYSEVENT_UINT64_ARRAYuint64_t数组类型事件参数。
HISYSEVENT_FLOAT_ARRAYfloat数组类型事件参数。
HISYSEVENT_DOUBLE_ARRAYdouble数组类型事件参数。
HISYSEVENT_STRING_ARRAYchar*数组类型事件参数。

表8 HiSysEventParamValue事件参数值联合体

属性名称属性类型描述
bboolbool类型事件参数值。
i8int8_tint8_t类型事件参数值。
ui8uint8_tuint8_t类型事件参数值。
i16int16_tint16_t类型事件参数值。
ui16uint16_tuint16_t类型事件参数值。
i32int32_tint32_t类型事件参数值。
ui32uint32_tuint32_t类型事件参数值。
i64int64_tint64_t类型事件参数值。
ui64uint64_tuint64_t类型事件参数值。
ffloatfloat类型事件参数值。
ddoubledouble类型事件参数值。
schar*char*类型事件参数值。
arrayvoid*数组类型事件参数值。
kernel接口说明

kernel事件打点开发能力如下:具体API详见接口文件(/kernel/linux/linux-5.10/include/dfx/hiview_hisysevent.h)。

表9 事件打点接口

接口名描述
struct hiview_hisysevent *hisysevent_create(const char *domain, const char *name, enum hisysevent_type type);创建一个事件对象。
void hisysevent_destroy(struct hiview_hisysevent *event);销毁一个事件对象。
int hisysevent_put_integer(struct hiview_hisysevent *event, const char *key, long long value);将整数类型的事件参数添加到事件对象。
int hisysevent_put_string(struct hiview_hisysevent *event, const char *key, const char *value);将字符串类型的事件参数添加到事件对象。
int hisysevent_write(struct hiview_hisysevent *event);将事件对象数据进行落盘。

表10 hisysevent_type事件类型枚举

事件类型描述
FAULT故障类型事件。
STATISTIC统计类型事件。
SECURITY安全类型事件。
BEHAVIOR行为类型事件。

开发步骤

C++打点开发步骤

在需要打点的地方直接调用打点接口,并传入相应事件参数。

HiSysEventWrite(HiSysEvent::Domain::AAFWK, "START_APP", HiSysEvent::EventType::BEHAVIOR, "APP_NAME", "com.ohos.demo");
C打点开发步骤
  1. 如果需要在打点时传入自定义事件参数,先要根据事件参数类型创建对应的事件参数对象,再将其放入到事件参数数组中。

    // 创建一个int32_t类型的事件参数
    HiSysEventParam param1 = {
        .name = "KEY_INT32",
        .t = HISYSEVENT_INT32,
        .v = { .i32 = 1 },
        .arraySize = 0,
    };
    
    // 创建一个int32_t数组类型的事件参数
    int32_t int32Arr[] = { 1, 2, 3 };
    HiSysEventParam param2 = {
        .name = "KEY_INT32_ARR",
        .t = HISYSEVENT_INT32_ARRAY,
        .v = { .array = int32Arr },
        .arraySize = sizeof(int32Arr) / sizeof(int32Arr[0]),
    };
    
    // 将事件参数对象放入创建的事件参数数组中
    HiSysEventParam params[] = { param1, param2 };
  2. 在需要打点的地方调用打点接口,并传入相应事件参数。

    OH_HiSysEvent_Write("TEST_DOMAIN", "TEST_NAME", HISYSEVENT_BEHAVIOR, params, sizeof(params) / sizeof(params[0]));
kernel打点开发步骤
  1. 根据事件领域、事件名称、事件类型参数,创建一个基础的事件对象。

    struct hiview_hisysevent *event = hisysevent_create("KERNEL", "BOOT", BEHAVIOR);
  2. 将自定义的事件参数,传入到事件对象里。

    // 添加整数类型参数
    hisysevent_put_integer(event, "BOOT_TIME", 100);
    
    // 添加字符串类型参数
    hisysevent_put_string(event, "MSG", "This is a test message");
  3. 在事件对象构建完成后,将事件进行上报。

    hisysevent_write(event);
  4. 事件上报完成后,需要手动将对象销毁。

    hisysevent_destroy(&event);
事件领域屏蔽的步骤
  1. 在相应的文件中定义名称为“DOMAIN_MASKS”,内容形如“DOMAIN_NAME_1|DOMAIN_NAME_2|...|DOMAIN_NAME_n”。共有三种屏蔽场景:
  • 只屏蔽当前源码文件中的相应事件领域的HiSysEvent打点,在该cpp文件引入hisysevent.h头文件之前定义宏DOMAIN_MASKS即可。

    #define DOMAIN_MASKS "DOMAIN_NAME_1|DOMAIN_NAME_2|...|DOMAIN_NAME_n"
    #include "hisysevent.h"
  • 屏蔽整个模块相应事件领域的HiSysEvent打点,在模块的BUILD.gn文件中定义宏DOMAIN_MASKS即可。

    config("module_a"){
      cflags_cc += ["-DDOMAIN_MASKS=\"DOMAIN_NAME_1|DOMAIN_NAME_2|...|DOMAIN_NAME_n\""]
    }
  • 全局屏蔽相应事件领域的HiSysEvent打点,则在/build/config/compiler/BUILD.gn中定义宏DOMAIN_MASKS即可。

      cflags_cc += ["-DDOMAIN_MASKS=\"DOMAIN_NAME_1|DOMAIN_NAME_2|...|DOMAIN_NAME_n\""]
  1. 通过HiSysEventWrite宏完成HiSysEvent打点操作:
    constexpr char DOMAIN[] = "DOMAIN_NAME_1";
    const std::string eventName = "EVENT_NAME1";
    OHOS:HiviewDFX::HiSysEvent::EventType eventType = OHOS:HiviewDFX::HiSysEvent::EventType::FAULT;
    HiSysEventWrite(domain, eventName, eventType); //因为DOMAIN_NAME_1事件领域已经在DOMAIN_MASKS中定义,所以该HiSysEvent打点不会执行。

开发实例

C++打点开发实例

假设业务模块需要在应用启动时进行打点来记录应用启动事件,且需要记录应用的包名信息,完整使用示例如下所示:

  1. 首先,需要在业务模块的在BUILD.gn里增加HiSysEvent部件依赖。

    external_deps = [ "hisysevent:libhisysevent" ]
  2. 在业务模块的应用启动函数StartAbility()中,调用打点接口并传入对应事件参数。

    #include "hisysevent.h"
    
    int StartAbility()
    {
        ... // 其他业务逻辑
        int ret = HiSysEventWrite(HiSysEvent::Domain::AAFWK, "START_APP", HiSysEvent::EventType::BEHAVIOR, "APP_NAME", "com.ohos.demo");
        ... // 其他业务逻辑
    }
C打点开发实例

假设业务模块需要在应用启动时进行打点来记录应用启动事件,且需要记录应用的包名信息,完整使用示例如下所示:

  1. 首先,需要在业务模块的在BUILD.gn里增加HiSysEvent部件依赖。

    external_deps = [ "hisysevent:libhisysevent" ]
  2. 在业务模块的应用启动函数StartAbility()中,调用打点接口并传入对应事件参数。

    #include "hisysevent_c.h"
    
    int StartAbility()
    {
        ... // 其他业务逻辑
        char packageName[] = "com.ohos.demo";
        HiSysEventParam param = {
            .name = "APP_NAME",
            .t = HISYSEVENT_STRING,
            .v = { .s = packageName },
            .arraySize = 0,
        };
        HiSysEventParam params[] = { param };
        int ret = OH_HiSysEvent_Write("AAFWK", "START_APP", HISYSEVENT_BEHAVIOR, params, sizeof(params) / sizeof(params[0]));
        ... // 其他业务逻辑
    }
kernel打点开发实例

假设内核业务模块需要在设备启动时进行打点来记录设备启动事件,完整使用示例如下所示:

  1. 在设备启动函数device_boot()中,构建一个启动事件对象,然后将事件进行上报,最后销毁事件对象。

    #include <dfx/hiview_hisysevent.h>
    
    #include <linux/errno.h>
    #include <linux/printk.h>
    
    int device_boot()
    {
        ... // 其他业务逻辑
        struct hiview_hisysevent *event = NULL;
        int ret = 0;
    
        event = hisysevent_create("KERNEL", "BOOT", BEHAVIOR);
        if (!event) {
            pr_err("failed to create event");
            return -EINVAL;
        }
        ret = hisysevent_put_string(event, "MSG", "This is a test message");
        if (ret != 0) {
            pr_err("failed to put sting to event, ret=%d", ret);
            goto hisysevent_end;
        }
        ret = hisysevent_write(event);
    
    hisysevent_end:
        hisysevent_destroy(&event);
        ... // 其他业务逻辑
    }
事件领域屏蔽的开发实例
  • 假设业务模块中,需要在某个cpp文件中屏蔽名称分别为AAFWK和POWER的事件领域的打点,在该cpp文件引入hisysevent.h头文件之前,定义名称为DOMAIN_MASKS的宏:

    #define DOMAIN_MASKS "AAFWK|POWER"
    
    #include "hisysevent.h"
    ... // 其他业务逻辑
    HiSysEventWrite(OHOS:HiviewDFX::HiSysEvent::Domain::AAFWK, "JS_ERROR", OHOS:HiviewDFX::HiSysEvent::EventType::FAULT, "MODULE", "com.ohos.module"); // 该HiSysEvent打点操作不会执行
    ... // 其他业务逻辑
    HiSysEventWrite(OHOS:HiviewDFX::HiSysEvent::Domain::POWER, "POWER_RUNNINGLOCK", OHOS:HiviewDFX::HiSysEvent::EventType::FAULT, "NAME", "com.ohos.module"); // 该HiSysEvent打点操作不会执行
  • 假设需要在整个业务模块中屏蔽名称分别为AAFWK和POWER的事件领域的打点,在模块的BUILG.gn文件中定义名称为DOMAIN_MASKS的宏:

    config("module_a") {
        ... // 其他配置项
        cflags_cc += ["-DDOMAIN_MASKS=\"AAFWK|POWER\""]
    }
  • 假设需要在整个系统中屏蔽名称分别为AAFWK和POWER的事件领域的打点,则直接在/build/config/compiler/BUILD.gn文件中定义名称为DOMAIN_MASKS的宏:

    ... // 其他配置项
    cflags_cc += ["-DDOMAIN_MASKS=\"AAFWK|POWER\""]

参考

HiSysEvent模块会将打点数据写入到节点文件中,而打点数据的解析处理会在Hiview模块中统一进行,

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(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学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值