鸿蒙南向开发实战:HiSysEvent订阅

HiSysEvent提供了跨进程订阅机制,开发者可以通过注册订阅接口实时获取关注的事件,例如电池模块订阅功耗相关的事件,用于分析耗电情况。

约束与限制

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

开发指导

接口说明

C++接口说明

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

说明:

ListenerRule订阅规则对象构造函数形参类型RuleType请参考HiSysEvent查询中的“表4 RuleType匹配规则类型枚举”说明。

表1 HiSysEvent订阅接口

接口名称描述
int32_t HiSysEventManager::AddListener(std::shared_ptr<HiSysEventListener> listener,
 std::vector<ListenerRule>& rules)
接口功能:添加对系统事件的订阅,通过设置规则订阅某些特定的事件。
输入参数:
- listener:订阅回调对象。
- rules:事件订阅规则。
返回值:
- 0:订阅添加成功。
- 负值:订阅添加失败。
int32_t HiSysEventManager::RemoveListener(std::shared_ptr<HiSysEventListener> listener)接口功能:移除对系统事件的订阅。
输入参数:
- listener:订阅回调对象。
返回值:
- 0:订阅移除成功。
- 负值:订阅移除失败。

表2 ListenerRule订阅规则对象

接口名称描述
ListenerRule(const std::string& tag,
 RuleType ruleType = RuleType::WHOLE_WORD)
接口功能:订阅规则构造函数,创建事件标签订阅规则对象。
输入参数:
- tag:订阅规则中指定的系统事件标签,字符串类型,最大长度16个字符(含),有效字符包含大小写字母及数字。
- ruleType:订阅规则的规则类型,RuleType枚举类型(参考表3)。
ListenerRule(const std::string& domain,
 const std::string& eventName,
 RuleType ruleType = RuleType::WHOLE_WORD)
接口功能:订阅规则构造函数,创建事件领域与事件名称订阅规则对象。
输入参数:
- domain:订阅规则中指定的系统事件领域,字符串类型,最大长度16个字符(含),有效字符包含大写字母、数字及下划线。
- eventName:订阅规则中指定的系统事件名称,字符串类型,最大长度32个字符(含),有效字符包含大写字母、数字及下划线。
- ruleType:订阅规则的规则类型,RuleType枚举类型(参考表3)。
ListenerRule(const std::string& domain,
 const std::string& eventName,
 const std::string& tag,
 RuleType ruleType = RuleType::WHOLE_WORD)
接口功能:订阅规则构造函数,创建事件领域、事件名称,事件标签订阅规则对象。
输入参数:
- tag:订阅规则中指定的系统事件标签,字符串类型,最大长度16个字符(含),有效字符包含大小写字母及数字。
- domain:订阅规则中指定的系统事件领域,字符串类型,最大长度16个字符(含),有效字符包含大写字母、数字及下划线。
- eventName:订阅规则中指定的系统事件名称,字符串类型,最大长度32个字符(含),有效字符包含大写字母、数字及下划线。
- ruleType:订阅规则的规则类型,RuleType枚举类型。

表3 HiSysEventListener订阅对象

接口名称描述
void HiSysEventListener::OnEvent(std::shared_ptr<HiSysEventRecord> sysEvent)接口功能:订阅事件的回调接口。
输入参数:
- sysEvent:订阅到的实时系统事件。
返回值:
无。
void HiSysEventListener::OnServiceDied()接口功能:服务异常回调。
输入参数:
无。
返回值:
无。

表4 HiSysEventRecord系统事件对象 | 接口名称 | 描述 | | -------- | -------- | |std::string HiSysEventRecord::AsJson()|接口功能:获取该系统事件的内容。
输入参数:
无。
返回值:
该系统事件的内容。| |std::string HiSysEventRecord::GetDomain()|接口功能:获取该系统事件的域名。
输入参数:
无。
返回值:
该系统事件的域名。| |std::string HiSysEventRecord::GetEventName()|接口功能:获取该系统事件的名称。
输入参数:
无。
返回值:
该系统事件的名称。| |HiSysEvent::EventType HiSysEventRecord::GetEventType()|接口功能:获取该系统事件的类型。
输入参数:
无。
返回值:
该系统事件的类型。| |std::string HiSysEventRecord::GetLevel()|接口功能:获取该系统事件的级别。
输入参数:
无。
返回值:
该系统事件的级别。| |std::string HiSysEventRecord::GetTag()|接口功能:获取该系统事件的标签。
输入参数:
无。
返回值:
该系统事件的标签。| |std::string HiSysEventRecord::GetTimeZone()|接口功能:获取该系统事件的时区。
输入参数:
无。
返回值:
时区内容,格式为“+0800”。| |int HiSysEventRecord::GetTraceFlag()|接口功能:获取该系统事件的分布式跟踪标志位。
输入参数:
无。
返回值:
分布式跟踪标志位。| |int64_t HiSysEventRecord::GetPid()|接口功能:获取落盘该系统事件的进程ID。
输入参数:
无。
返回值:
进程ID。| |int64_t HiSysEventRecord::GetTid()|接口功能:获取落盘该系统事件的线程ID。
输入参数:
无。
返回值:
线程ID。| |int64_t HiSysEventRecord::GetUid()|接口功能:获取落盘该系统事件的用户ID。
输入参数:
无。
返回值:
用户ID。| |uint64_t HiSysEventRecord::GetPspanId()|接口功能:获取该系统事件的分布式跟踪父分支ID。
输入参数:
无。
返回值:
分布式跟踪父分支ID。| |uint64_t HiSysEventRecord::GetSpandId()|接口功能:获取该系统事件的分布式跟踪分支ID。
输入参数:
无。
返回值:
分布式跟踪分支ID。| |uint64_t HiSysEventRecord::GetTime()|接口功能:获取该系统事件的时间戳。
输入参数:
无。
返回值:
时间戳。| |uint64_t HiSysEventRecord::GetTraceId()|接口功能:获取该系统事件的分布式跟踪链ID。
输入参数:
无。
返回值:
分布式跟踪链ID。| |void HiSysEventRecord::GetParamNames(std::vector<std::string>& params)|接口功能:获取该系统事件的所有键名。
输入参数:
- params:键名数组引用。
返回值:
无。| |int HiSysEventRecord::GetParamValue(const std::string& param, int64_t& value)|接口功能:将该系统事件键名为param的值解析为int64_t类型的值。
输入参数:
- param:键名。
- value:int64_t类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成int64_t类型的值。| |int HiSysEventRecord::GetParamValue(const std::string& param, uint64_t& value)|接口功能:将该系统事件键名为param的值解析为uint64_t类型的值。
输入参数:
- param:键名。
- value:uint64_t类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成uint64_t类型的值。| |int HiSysEventRecord::GetParamValue(const std::string& param, double& value)|接口功能:将该系统事件键名为param的值解析为double类型的值。
输入参数:
- param:键名。
- value:double类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成double类型的值。| |int HiSysEventRecord::GetParamValue(const std::string& param, std::string& value)|接口功能:将该系统事件键名为param的值解析为string类型的值。
输入参数:
- param:键名。
- value:std::string类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成std::string类型的值。| |int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<int64_t>& value)|接口功能:将该系统事件键名为param的值解析为int64_t类型的数组。
输入参数:
- param:键名。
- value:int64_t类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成int64_t类型的数组。| |int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<uint64_t>& value)|接口功能:将该系统事件键名为param的值解析为uint64_t类型的数组。
输入参数:
- param:键名。
- value:uint64_t类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成uint64_t类型的数组。| |int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<double>& value)|接口功能:将该系统事件键名为param的值解析为double类型的数组。
输入参数:
- param:键名。
- value:ouble类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成double类型的数组。| |int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<std::string>& value)|接口功能:将该系统事件键名为param的值解析为string类型的数组。
输入参数:
- param:键名。
- value:std::string类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成std::string类型的数组。|

C接口说明

C HiSysEvent订阅开发能力如下:具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。

说明:

HiSysEventWatcher订阅回调结构体OnEvent回调方法形参类型HiSysEventRecord请参考HiSysEvent查询中的“表11 HiSysEventRecord事件结构体”及“表12 HiSysEventRecord解析接口”说明。

表5 HiSysEvent订阅接口

接口名称描述
int OH_HiSysEvent_Add_Watcher(HiSysEventWatcher* watcher,
HiSysEventWatchRule rules[],
size_t ruleSize);
接口功能:添加对系统事件的订阅,通过设置规则订阅某些特定的事件。
输入参数:
- watcher:订阅回调对象。
- rules:事件订阅规则数组。
- ruleSize:事件订阅规则数组长度。
返回值:
- 0:订阅添加成功。
- 负值:订阅添加失败。
int OH_HiSysEvent_Remove_Watcher(HiSysEventWatcher* watcher);接口功能:移除对系统事件的订阅。
输入参数:
- watcher:订阅回调对象。
返回值:
- 0:订阅移除成功。
- 负值:订阅移除失败。

表6 HiSysEventWatcher订阅回调结构体 | 属性名称 | 属性类型 | 描述 | | ------------- | -------------------------------------------------- | ------------------------------------------------------------ | | OnEvent | void ()(HiSysEventRecord record); | 接口功能:订阅事件的回调接口。
输入参数:
- record:订阅到的实时系统事件。
返回值:
无。 | | OnServiceDied | void (
)(); | 接口功能:服务异常回调。
输入参数:
无。
返回值:
无。 |

表7 HiSysEventWatchRule订阅规则结构体 | 属性名称 | 属性类型 | 描述 | | ------------- | --------- | ---------------------------------- | | domain | char[] | 用来指定订阅的系统事件领域。 | | name | char[] | 用来指定订阅的系统事件名称。 | | tag | char[] | 用来指定订阅的系统事件标签。 | | ruleType | int | 用于指定订阅事件的匹配规则,取值请参考HiSysEvent查询中的“表4 RuleType匹配规则类型枚举”。 | | eventType | int | 用于指定订阅事件的事件类型,取值请参考HiSysEvent查询中的“表3 EventType事件类型枚举”,当取值0,表示订阅所有的事件类型。 |

开发步骤

C++ HiSysEvent订阅开发步骤
  1. 引入对应的头文件。

    #include "hisysevent_manager.h"
  2. 业务领域实现对应的订阅回调接口。

    class TestListener : public OHOS::HiviewDFX::HiSysEventListener {
    public:
        void OnEvent(std::shared_ptr<HiSysEventRecord> record)
        {
            if (record == nullptr) {
                return;
            }
            std::cout << record->AsJson() << std::endl;
        }
    
        void OnServiceDied()
        {
            std::cout << std::string("service disconnect, exit") << std::endl;
            exit(0);
        }
    };
  3. 在订阅事件的地方调用订阅接口,并传入相应的订阅回调参数、订阅规则列表,在业务结束,注销此次订阅。

    auto testListener = std::make_shared<TestListener>();
    // 事件标签规则订阅,规则类型为默认的全词匹配类型
    ListenerRule tagRule("dfx");
    // 事件标签规则订阅,规则类型为正则匹配类型
    ListenerRule regRule("dfx.*", RuleType::REGULAR);
    // 事件领域及事件名称规则订阅,规则类型为前缀匹配类型
    ListenerRule domainNameRule("HIVIEWDFX", "APP_USAGE", RuleType::PREFIX);
    std::vector<ListenerRule> sysRules;
    sysRules.push_back(tagRule);
    sysRules.push_back(regRule);
    sysRules.push_back(domainNameRule);
    // 开始系统事件订阅
    auto ret = HiSysEventManager::AddEventListener(testListener, sysRules);
    // 订阅结束,移除订阅回调参数。
    if (ret == 0) {
       HiSysEventManager::RemoveListener(testListener);
    }
C HiSysEvent订阅开发步骤
  1. 引入对应的头文件。

    #include "hisysevent_manager_c.h"
  2. 业务领域实现对应的订阅回调接口。

    void OnEventTest(HiSysEventRecord record)
    {
        printf("OnEventTest: event=%s", record.jsonStr);
    }
    
    void OnServiceDiedTest()
    {
        printf("OnServiceDied");
    }
  3. 在订阅事件的地方调用订阅接口,并传入相应的订阅回调参数、订阅规则列表,在业务结束,注销此次订阅。

    HiSysEventWatcher watcher;
    watcher.OnEvent = OnEventTest;
    watcher.OnServiceDied = OnServiceDiedTest;
    // 事件标签规则订阅,规则类型为默认的全词匹配类型
    constexpr char DFX_TAG[] = "dfx";
    HiSysEventWatchRule tagRule;
    (void)strcpy_s(tagRule.tag, strlen(DFX_TAG) + 1, DFX_TAG);
    tagRule.ruleType = 1;
    tagRule.eventType = 0;
    // 事件标签规则订阅,规则类型为正则匹配类型
    constexpr char DFX_PATTERN_TAG[] = "dfx.*";
    HiSysEventWatchRule regRule;
    (void)strcpy_s(regRule.tag, strlen(DFX_PATTERN_TAG) + 1, DFX_PATTERN_TAG);
    regRule.ruleType = 3;
    regRule.eventType = 0;
    // 事件领域及事件名称规则订阅,规则类型为前缀匹配类型
    constexpr char DOMAIN[] = "HIVIEWDFX";
    constexpr char NAME[] = "APP_USAGE";
    HiSysEventWatchRule domainNameRule;
    (void)strcpy_s(domainNameRule.domain, strlen(DOMAIN) + 1, DOMAIN);
    (void)strcpy_s(domainNameRule.name, strlen(NAME) + 1, NAME);
    domainNameRule.ruleType = 2;
    domainNameRule.eventType = 0;
    // 开始系统事件订阅
    HiSysEventWatchRule rules[] = {tagRule, regRule, domainNameRule};
    int ret = OH_HiSysEvent_Add_Watcher(&watcher, rules, sizeof(rules) / sizeof(HiSysEventWatchRule));
    // 订阅结束,移除订阅回调参数。
    if (ret == 0) {
        ret = OH_HiSysEvent_Remove_Watcher(&watcher);
    }

开发实例

C++ HiSysEvent订阅开发实例

假设业务模块需要订阅事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

  1. 在业务模块的在BUILD.gn里增加hisysevent部件的libhisysevent及libhisyseventmanager依赖。

    external_deps = [
      "hisysevent:libhisysevent",
      "hisysevent:libhisyseventmanager",
    ]
  2. 在业务模块的TestEventListening()函数中,调用订阅接口去订阅事件,业务结束时移除事件订阅。

    #include <iostream>
    
    #include "hisysevent_manager.h"
    
    using namespace OHOS::HiviewDFX;
    
    class TestListener : public HiSysEventQueryCallback {
    public:
        void OnEvent(std::shared_ptr<HiSysEventRecord> record)
        {
            if (record == nullptr) {
                return;
            }
            std::cout << record->AsJson() << std::endl;
        }
    
        void OnServiceDied()
        {
            std::cout << std::string("service disconnect, exit") << std::endl;
            exit(0);
        }
    };
    
    void TestEventListening()
    {
        auto testListener = std::make_shared<TestListener>();
        ListenerRule domainNameRule("HIVIEWDFX", "PLUGIN_LOAD", RuleType::WHOLE_WORD);
        std::vector<ListenerRule> sysRules;
        sysRules.push_back(domainNameRule);
        auto ret = HiSysEventManager::AddEventListener(testListener, sysRules);
        if (ret == 0) {
            HiSysEventManager::RemoveListener(testListener);
        }
    }
C HiSysEvent订阅开发实例

假设业务模块需要订阅事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

  1. 在业务模块的在BUILD.gn里增加hisysevent部件的libhisysevent及libhisyseventmanager依赖。

    external_deps = [ "hisysevent:libhisyseventmanager" ]
    
    // for strcpy_s
    deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
  2. 在业务模块的TestEventListening()函数中,调用订阅接口去订阅事件,业务结束时移除事件订阅。

    #include <securec.h>
    
    #include "hisysevent_manager_c.h"
    
    void OnEventTest(HiSysEventRecord record)
    {
        printf("OnEventTest: event=%s", record.jsonStr);
    }
    
    void OnServiceDiedTest()
    {
        printf("OnServiceDied");
    }
    
    void TestEventListening()
    {
        HiSysEventWatcher watcher;
        watcher.OnEvent = OnEventTest;
        watcher.OnServiceDied = OnServiceDiedTest;
        constexpr char DOMAIN[] = "HIVIEWDFX";
        constexpr char NAME[] = "PLUGIN_LOAD";
        HiSysEventWatchRule domainNameRule;
        (void)strcpy_s(domainNameRule.domain, strlen(DOMAIN) + 1, DOMAIN);
        (void)strcpy_s(domainNameRule.name, strlen(NAME) + 1, NAME);
        domainNameRule.ruleType = 1;
        domainNameRule.eventType = 0;
        HiSysEventWatchRule rules[] = {domainNameRule};
        int ret = OH_HiSysEvent_Add_Watcher(&watcher, rules, sizeof(rules) / sizeof(HiSysEventWatchRule));
        if (ret == 0) {
           ret = OH_HiSysEvent_Remove_Watcher(&watcher);
       }
    }

最后

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值