【入门到实战】OpenHarmony南向子系统开发:Hiview开发指南

往期鸿蒙5.0全套实战文章必看:(文中附带全栈鸿蒙5.0学习资料)


概述

功能简介

Hiview是一个跨平台的终端设备维测服务集,由插件管理平台和基于平台上运行的服务插件来构成整套系统。Hiview维测服务是由HiSysEvent事件驱动的,其核心为分布在系统各处的HiSysEvent桩点,格式化的事件会通过HiSysEvent打点API上报至Hiview进行处理,其处理流程如下图所示:

图1 Hiview模块数据交互图

Hiview_module_data_interaction

  1. 业务进程通过调用HiSysEvent模块提供的打点接口,上报打点事件信息并将其写入节点文件。
  2. Hiview进程中的SysEventSource事件源会从节点中异步读取出事件信息,并将事件分发到SysEventPipeline流水线上进行处理,其中:
    • SysEventService插件负责对事件进行校验及落盘;
    • Faultlogger插件负责处理故障相关事件;
    • EventLogger插件负责采集事件相关的日志信息。
  3. 在流水线上完成事件处理后,还会把事件发送到平台订阅事件队列里,然后将事件派发到订阅插件进行处理,其中:
    • FreezeDetector插件负责处理冻屏相关事件;
    • HiCollieCollector插件负责卡死相关事件。

基本概念

在进行Hiview的开发前,开发者应了解以下基本概念:

  • 插件

    运行在Hiview进程中,随Hiview二进制一同交付的完成独立功能的维测、故障管理模块,具有编译时可独立拆解、运行时寄宿于平台、动态配置等特性。

  • 流水线

    事件处理插件的有序集合,进入流水线的事件会按序经过流水线上的每个插件处理。

  • 事件源

    一种能够生产事件的特殊插件,相较普通插件,需要能够绑定流水线、生产事件并将事件分发给流水线。

  • 流水线组

    配置在相同事件源的多个流水线被称作一个流水线组。

运作机制

Hiview支持基于插件管理平台的插件开发,提供了插件开发的相关能力,开发者可以通过在Hiview平台上新增自己的插件,来对HiSysEvent事件进行特定业务处理。在进行插件开发前,开发者应该了解插件的相关运作原理。

插件注册

插件的注册方式有三种:

名称说明
静态注册通过使用宏定义REGISTER(xxx);注册,该种注册方式的插件不能被卸载
代理注册通过使用宏定义REGISTER_PROXY(xxx);注册,开机不加载运行时动态加载卸载
代理注册且开机加载通过使用宏定义REGISTER_PROXY_WITH_LOADED(xxx);注册,开机加载之后再动态卸载加载
插件驱动

插件的事件驱动有两种方式——流水线驱动和订阅驱动,区别如下:

  • 流水线驱动的插件需要配置在流水线上,当事件从事件源分发到流水线后,会按序流转到流水线上配置的每个插件进行处理。
  • 订阅驱动的插件无需配置在流水线上,但是需要在插件启动时注册一个监听者到Hiview平台,并且插件本身需要实现事件监听处理函数。
插件包加载

根据业务的需求,插件可以不用全部编译在Hiview二进制中。

Hiview支持将多个插件编译成为一个独立的插件包,以独立so的形式预置到系统中,并且一个so需要对应于一个plugin_config文件,例如libxxx.z.so,对应于xxx_plugin_config配置文件。Hiview进程在启动时,会扫描系统中的插件包so以及对应的配置文件,并对插件包中实现的插件进行加载。

对插件包做如下补充说明:

  1. 插件包作为一个独立的个体在插件管理平台中运行,内部插件、流水线或者事件源都与在Hiview二进制中的插件没有功能上的差异。

  2. 插件包中的插件可以插入到Hiview二进制中的流水线中。

  3. 无论在何处的订阅者,根据其订阅的规则都可以收到全平台发送出来的相应事件。

插件开发指导

场景介绍

当开发者需要对事件源分发过来的HiSysEvent事件进行特定业务处理的时候,需要在Hiview平台上新增一个插件,并借助该插件进行相应业务处理,下文将具体介绍如何进行Hiview插件开发。

接口说明

插件开发的相关接口如下,具体的API详见接口文档。

表1 Plugin类API接口功能介绍

接口名描述
virtual void OnLoad()插件加载函数,当插件被平台加载后调用,可以用于初始化一些数据
virtual void OnUnload()插件卸载函数,当插件被平台卸载前调用,可以用于回收一些数据
virtual bool ReadyToLoad()用于在Hiview启动加载插件时判断当前插件能否被加载
virtual bool OnEvent(std::shared_ptr<Event>& event)事件处理函数,用于接收处理流水线或者平台分发过来的事件并进行业务处理
virtual bool CanProcessEvent(std::shared_ptr<Event> event)用于判断事件是否能向后流转整条流水线(当插件位于流水线上的第一个时生效)
HiviewContext* GetHiviewContext()获取Hiview插件管理平台的上下文对象

表2 Event类API接口功能介绍

接口名描述
domain_事件领域
eventName_事件名称
happenTime_事件发生时间
jsonExtraInfo_Json格式的事件数据
bool IsPipelineEvent()判断事件是否为流水线事件
bool HasFinish()判断事件是否还能继续往后流转

开发步骤

  1. 首先,需要定义一个继承自Plugin基类的业务插件类:

    #include "event.h"
    #include "plugin.h"
    
    class PluginExample : public Plugin {
    public:
        bool OnEvent(std::shared_ptr<Event>& event) override;
        void OnLoad() override;
        void OnUnload() override;
    };
    
  2. 然后,在插件类实现代码中,需要先对插件进行注册,再根据业务需要覆写实现相应的函数。

    #include "plugin_factory.h"
    
    // 静态注册插件
    REGISTER(PluginExample);
    
    void PluginExample::OnLoad()
    {
        ... // 在插件加载时,可以进行插件的资源初始化工作
        printf("PluginExample OnLoad \n");
    }
    
    void PluginExample::OnUnload()
    {
        ... // 在插件卸载时,可以进行插件的资源释放工作
        printf("PluginExample OnUnload \n");
    }
    
    bool PluginExample::OnEvent(std::shared_ptr<Event>& event)
    {
        ... // 在事件处理函数中,可以进行对事件进行特定业务处理
        printf("PluginExample OnEvent \n");
    
        // 例如,插件只关注某个领域的事件,并需要将这个领域的事件信息进行日志打印处理
        if (event->domain_ == "TEST_DOMAIN") {
            printf("The event data received is %s \n", event->jsonExtraInfo_);
            return true;
        }
    
        return false;
    }
    
  3. 最后,需要将插件配置在plugin_build.json文件中,随Hiview二进制一同编译:

    {
        "plugins": {
            "PluginExample": {
                "path": "plugins/PluginExample",
                "name": "PluginExample"
            }
        },
        "rules": [
            {
                "info": {
                    "loadorder": {
                        "PluginExample": {
                            "loadtime": 0
                        }
                    },
                    "pipelines": {
                        "SysEventPipeline": [
                           PluginExample
                        ]
                    }
                }
            }
        ]
    }

<think>嗯,用户这次问的是OpenHarmonyHiview的具体应用场景和示例。从对话历史看,用户之前已经了解过param_watcher服务的作用,现在转向了系统诊断模块Hiview。用户可能是一位物联网设备开发者,正在调研OpenHarmony的调试工具链。ta提到的"应用场景"暗示需要实际工程案例,而"示例"要求代码级演示。结合引用材料,需要重点突出:1)引用[1]和[4]提到的跨平台特性2)引用[3]涉及的多租户支持3)实际部署时与升级子系统(引用[2])的联动注意到用户特别标注"不是真正的需求",说明ta更想要系统级实践指南而非概念描述。上次回答param_watcher时采用了模块化展开方式,这次应延续类似结构但增加具体:-故障注入测试代码(对应日志采集场景)-规则引擎配置片段(对应智能诊断)-SELinux策略示例(对应安全审计)需要警惕的是引用[4]的json配置可能有版本差异,需强调OpenHarmony3.2+的适配要求。多租户适配示例正好能结合引用[3]的API声明原则,展示resourceId分配机制。最后生成的问题要引导到用户可能遇到的真实痛点:如何在资源受限设备部署?是否支持第三方插件?这些正好覆盖了开发者最关心的定制化需求。</think> OpenHarmonyHiview服务是**系统级诊断框架**,其核心应用场景和实例如下(结合架构特性与开发实践): --- ### 一、核心应用场景与案例 #### 1. **系统故障诊断** **场景**:设备异常重启追踪 - **工作原理**: ```mermaid graph LR A[内核崩溃] --> B(Hiview抓取Panic日志) B --> C[生成崩溃事件ID] C --> D[存储到/hilog文件夹] D --> E[触发故障分析管道] ``` - **开发实例**: 当系统发生`Watchdog`超时,自动捕获如下日志并生成诊断报告: ```log [Hiview][ERROR] Kernel panic: Task[watchdog] blocked(pid=122) [Stack trace]: sys_watchdog_timeout() at kernel/liteos_a/watchdog.c:230 task_schedule() at kernel/liteos_a/task.c:1102 ``` #### 2. **性能监控优化** **场景**:应用启动耗时分析 - **关键能力**: - 通过`HiTrace`工具链埋点采集生命周期事件 - 使用规则引擎检测异常阈值$$t > 1000ms$$ - **代码示例**(性能埋点): ```typescript import hiTrace from '@ohos.hiviewdfx.hiTrace'; // 标记冷启动开始 const traceId = hiTrace.startTrace("app_start", 0); // ...应用初始化代码 hiTrace.finishTrace(traceId); // 标记结束 ``` #### 3. **安全审计** **场景**:敏感API调用监控 - **策略配置**(参考[^4]): ```json { "security_rules": [ { "event_type": "ACCESS_SENSITIVE_DATA", "condition": "app.packageName != 'com.ohos.settings'", "action": "LOG_ALERT" } ] } ``` - **输出**:当非设置应用访问地理位置时触发: ``` [Hiview][SECURITY] Illegal access: com.demo.app getLocation ``` #### 4. **跨设备协同诊断** **场景**:多设备组网故障定位 - **架构特性**: - 分布式事件总线同步日志 - 设备间关联错误码(如`NET_ERR#E002`) - **案例**:手机与手表断开连接时生成关联报告: ```log [Device Chain][ERROR] Phone#P123 & Watch#W456 disconnect Root cause: BLE signal < -90dBm ``` --- ### 二、技术优势分析 1. **插件化扩展** - 开发者可自定义插件(如引用[^4]的`PluginExample`) - 支持动态加载诊断规则,无需重新编译内核 2. **分层处理架构** $$ \text{数据采集层} \rightarrow \text{管道过滤层} \rightarrow \text{规则引擎层} $$ 实现日志处理吞吐量 > 10万条/秒 3. **多租户隔离**(引用[^3]) - 应用级日志沙盒:`/data/log/region/{appId}` - 基于资源标签的访问控制: ```cpp // 多租户资源分配 Hiview::CreatePipeline("perf_monitor", RES_TAG_APP); ``` --- ### 三、开发实践指导 1. **自定义事件采集** ```typescript import faultLogger from '@ohos.hiviewdfx.faultLogger'; // 上报自定义异常 faultLogger.addFault( "CUSTOM_ERROR", { module: "PaymentSDK", code: "INVALID_CERT" } ); ``` 2. **诊断规则配置** ```json "pipelines": { "CrashPipeline": [ {"plugin": "StackParser", "params": {"symbols_path": "/system/lib"}}, {"plugin": "CrashReport"} ] ``` --- **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值