1020a203aSopenharmony_ci# HiView插件开发指导</a> 2020a203aSopenharmony_ci 3020a203aSopenharmony_ci- [概述](#概述) 4020a203aSopenharmony_ci- [插件的概念](#插件的概念) 5020a203aSopenharmony_ci - [插件的定义](#插件的定义) 6020a203aSopenharmony_ci - [插件的生命周期](#插件的生命周期) 7020a203aSopenharmony_ci - [插件的注册方式](#插件的注册方式) 8020a203aSopenharmony_ci - [事件源的定义](#事件源的定义) 9020a203aSopenharmony_ci - [插件包的概念](#插件包的概念) 10020a203aSopenharmony_ci- [流水线的概念](#流水线的概念) 11020a203aSopenharmony_ci- [hiview配置文件](#hiview配置文件) 12020a203aSopenharmony_ci - [平台配置文件](#平台配置文件) 13020a203aSopenharmony_ci - [插件配置文件](#插件配置文件) 14020a203aSopenharmony_ci- [插件平台提供的能力](#插件平台提供的能力) 15020a203aSopenharmony_ci - [事件](#事件) 16020a203aSopenharmony_ci - [事件订阅](#事件订阅) 17020a203aSopenharmony_ci - [平台提供的功能接口](#平台提供的功能接口) 18020a203aSopenharmony_ci- [实例解析](#实例解析) 19020a203aSopenharmony_ci## 概述 20020a203aSopenharmony_ci 21020a203aSopenharmony_ciHiview是一个跨平台的终端设备维测服务集,其中是由插件管理平台和插件实现的各自功能构成整套系统。 22020a203aSopenharmony_ci本文描述了hiview插件开发的全部流程。 23020a203aSopenharmony_ci 24020a203aSopenharmony_ci## 插件的概念 25020a203aSopenharmony_ci 26020a203aSopenharmony_ci整节部分包括了插件的概念,事件源的概念,流水线的概念等基本概念 27020a203aSopenharmony_ci 28020a203aSopenharmony_ci### 插件的定义 29020a203aSopenharmony_ci 30020a203aSopenharmony_cihiview插件可以理解为运行在hiview进程中,随hiview二进制一同交付的完成独立功能的维测、故障管理模块。 31020a203aSopenharmony_ci 32020a203aSopenharmony_ci插件可以是自驱动的事件源,也可以是由外部事件驱动的一般插件。其中事件驱动有两种方式:流水线驱动和订阅查询驱动。 33020a203aSopenharmony_ci 34020a203aSopenharmony_ci单个插件可以静态加载(永远不会被卸载)和插件代理加载,代理加载其中包含:开机不加载运行时动态加载卸载、开机加载之后再动态卸载加载。 35020a203aSopenharmony_ci 36020a203aSopenharmony_ci插件选择被代理时插件可以被动态卸载和加载,在已经被卸载的情况下,当外部驱动事件到来以后被加载。 37020a203aSopenharmony_ci 38020a203aSopenharmony_ci特定的插件是通过继承Plugin这个类实现特定的插件功能,其相对应的插件由多态的形式存在并且流转在插件管理平台中。 39020a203aSopenharmony_ci 40020a203aSopenharmony_ci事件处理或者驱动插件根据不同需求,需要继承Plugin并且实现如下方法或者使用如下的接口: 41020a203aSopenharmony_ci``` 42020a203aSopenharmony_ciclass Plugin { 43020a203aSopenharmony_cipublic: 44020a203aSopenharmony_ci /* 插件生命周期中,当前插件被平台加载起来后调用,可以用于初始化一些数据 */ 45020a203aSopenharmony_ci virtual void OnLoad(); 46020a203aSopenharmony_ci 47020a203aSopenharmony_ci /* 插件生命周期中,当前插件被平台卸载前调用,可以用于回收一些数据 */ 48020a203aSopenharmony_ci virtual void OnUnload(); 49020a203aSopenharmony_ci 50020a203aSopenharmony_ci /* 运行期判断当前插件是否被加载,返回true是被需要被平台加载;false是将永远不会被平台加载。Plugin默认返回true */ 51020a203aSopenharmony_ci virtual bool ReadyToLoad(); 52020a203aSopenharmony_ci 53020a203aSopenharmony_ci /* 当前插件在流水线上时,接收流水线上外部驱动事件,或者当前插件自己设置的延时事件,并且处理事件。其处理过程是当前插件定义是的线程中,若没有指定则在当前线程进行 */ 54020a203aSopenharmony_ci virtual bool OnEvent(std::shared_ptr<Event>& event) override; 55020a203aSopenharmony_ci 56020a203aSopenharmony_ci /* 当前插件在流水线上,且是当前流水线上第一个插件时,判断是否流转整条流水线。返回true是流转整条流水线;false是不流转整条流水线 */ 57020a203aSopenharmony_ci virtual bool CanProcessEvent(std::shared_ptr<Event> event) override; 58020a203aSopenharmony_ci 59020a203aSopenharmony_ci /* 当前插件在流水线上时,判断当前事件源是否进入暂停状态。返回true是进行处理,将会继续调用插件的OnEvent方法;false将进入事件源PauseDispatch方法,进行处理,然后继续执行后续操作 */ 60020a203aSopenharmony_ci virtual bool CanProcessMoreEvents() override; 61020a203aSopenharmony_ci 62020a203aSopenharmony_ci /* 可以通过hidumper命令行查询当前插件的dump信息,该接口就是实现能dump出来那些内容 */ 63020a203aSopenharmony_ci virtual void Dump(int fd, const std::vector<std::string>& cmds); 64020a203aSopenharmony_ci 65020a203aSopenharmony_ci /* 当前插件作为一个事件动态订阅者,接收通过动态订阅来的外部驱动事件,并且处理事件 */ 66020a203aSopenharmony_ci virtual void OnEventListeningCallback(const Event &msg); 67020a203aSopenharmony_ci 68020a203aSopenharmony_ci // 以下为接口 69020a203aSopenharmony_ci /* 当前插件作为动态订阅者时,添加需要订阅的事件。订阅的事件分为依靠eventName订阅和EventIdRange(eventId范围也可以是全范围或者单一id)订阅。type是事件类型 */ 70020a203aSopenharmony_ci void AddEventListenerInfo(uint32_t type, const EventListener::EventIdRange &range = EventListener::EventIdRange(0)); 71020a203aSopenharmony_ci void AddEventListenerInfo(uint32_t type, const std::set<EventListener::EventIdRange> &listenerInfo); 72020a203aSopenharmony_ci void AddEventListenerInfo(uint32_t type, const std::string& eventName); 73020a203aSopenharmony_ci void AddEventListenerInfo(uint32_t type, const std::set<std::string> &eventNames); 74020a203aSopenharmony_ci 75020a203aSopenharmony_ci /* 设置延时执行事件 等时间到了以后在OnEvent中执行 */ 76020a203aSopenharmony_ci void DelayProcessEvent(std::shared_ptr<Event> event, uint64_t delay); 77020a203aSopenharmony_ci 78020a203aSopenharmony_ci /* 得到hiview插件管理平台接口的上下文 */ 79020a203aSopenharmony_ci HiviewContext* GetHiviewContext(); 80020a203aSopenharmony_ci 81020a203aSopenharmony_ci const std::string& GetName(); 82020a203aSopenharmony_ci const std::string& GetVersion(); 83020a203aSopenharmony_ci void SetVersion(const std::string& version); 84020a203aSopenharmony_ci} 85020a203aSopenharmony_ci``` 86020a203aSopenharmony_ci### 插件的生命周期 87020a203aSopenharmony_ci 88020a203aSopenharmony_ci插件目前只有OnLoad和OnUnload两个生命周期回调。 89020a203aSopenharmony_ci 90020a203aSopenharmony_ci这里的dynamic插件仅仅表示单一插件实体是以so的形式体现,名称为libxxx.z.so。 91020a203aSopenharmony_ci 92020a203aSopenharmony_cidynamic插件与上文的动态加载卸载插件没有关系。dynamic插件的so也与[插件包](#插件包的概念)的so也没有关系。 93020a203aSopenharmony_ci 94020a203aSopenharmony_cidynamic插件与静态插件没有功能上面的区别,只区别插件的实现形式。 95020a203aSopenharmony_ci 96020a203aSopenharmony_ci其生命周期调用逻辑如下 97020a203aSopenharmony_ci 98020a203aSopenharmony_ci 99020a203aSopenharmony_ci 100020a203aSopenharmony_ci### 插件的注册方式: 101020a203aSopenharmony_ci 102020a203aSopenharmony_ci插件的注册方式有三种: 103020a203aSopenharmony_ci 104020a203aSopenharmony_ci| 名称 | 说明 | 实例 | 105020a203aSopenharmony_ci| -------- | -------- | -------- | 106020a203aSopenharmony_ci| 静态注册 | 通过使用宏定义REGISTER(xxx);注册,该种注册方式的插件不能被卸载 | 实例详见test/plugins/examples/event_processor_example1中的插件 | 107020a203aSopenharmony_ci| 代理注册 | 通过使用宏定义REGISTER_PROXY(xxx);注册,开机不加载运行时动态加载卸载 | 实例详见test/plugins/examples/event_processor_example3中的插件 | 108020a203aSopenharmony_ci| 代理注册且开机加载 | 通过使用宏定义REGISTER_PROXY_WITH_LOADED(xxx);注册,开机加载之后再动态卸载加载 | 实例详见test/plugins/examples/event_processor_example4中的插件 | 109020a203aSopenharmony_ci 110020a203aSopenharmony_ci### 事件源的定义 111020a203aSopenharmony_ci 112020a203aSopenharmony_ci事件源是继承于EventSource实现特定的事件源功能。事件源也是一种特殊的插件,EventSource继承于[Plugin](#插件的定义)可以实现或者使用其中公共的方法。事件源作为事件的驱动者,不能被代理加载,只能静态加载。 113020a203aSopenharmony_ci 114020a203aSopenharmony_ci事件源需要继承EventSource这个类实现如下方法或者使用如下的接口,根据需求也需实现[Plugin](#插件的定义)类中的虚方法: 115020a203aSopenharmony_ci``` 116020a203aSopenharmony_ciclass EventSource : public PipelineEventProducer, public Plugin { 117020a203aSopenharmony_cipublic: 118020a203aSopenharmony_ci 119020a203aSopenharmony_ci /* 开启事件源,当平台加载完成,加载事件源之后执行,可以用于初始化或者开启一些事件源数据或者事件 */ 120020a203aSopenharmony_ci virtual void StartEventSource(); 121020a203aSopenharmony_ci 122020a203aSopenharmony_ci /* 通知事件生产者事件已完成其传递 */ 123020a203aSopenharmony_ci virtual void Recycle(PipelineEvent* event); 124020a203aSopenharmony_ci 125020a203aSopenharmony_ci /* 暂停调度并安排恢复调度 */ 126020a203aSopenharmony_ci virtual void PauseDispatch(std::weak_ptr<Plugin> plugin); 127020a203aSopenharmony_ci 128020a203aSopenharmony_ci //以下为接口 129020a203aSopenharmony_ci /* 将事件下发到各个流水线,开始当前事件源下流水线的运作 */ 130020a203aSopenharmony_ci bool PublishPipelineEvent(std::shared_ptr<PipelineEvent> event); 131020a203aSopenharmony_ci 132020a203aSopenharmony_ci /* 动态添加流水线到当前事件源 */ 133020a203aSopenharmony_ci void AddPipeline(std::shared_ptr<Pipeline> pipeline); 134020a203aSopenharmony_ci}; 135020a203aSopenharmony_ci``` 136020a203aSopenharmony_ci 137020a203aSopenharmony_ci事件源实例详见test/plugins/examples/event_source_example或者test/plugins/examples_bundle/bundle_event_source_example 138020a203aSopenharmony_ci 139020a203aSopenharmony_ci### 插件包的概念 140020a203aSopenharmony_ci 141020a203aSopenharmony_ci根据业务的需求,插件可以不用全部编译在hiview二进制中。支持将若干个插件编译成为独立的插件包,以独立so的形式提供,并且一个so对应于一个plugin_config文件。 142020a203aSopenharmony_ci例如libxxx.z.so,对应于xxx_plugin_config配置文件。 143020a203aSopenharmony_ci 144020a203aSopenharmony_cihiview插件管理平台插件包做如下说明: 145020a203aSopenharmony_ci 146020a203aSopenharmony_ci1、插件包作为一个独立的个体在插件管理平台中运行,内部插件、流水线或者事件源都与在hiview二进制中的插件没有功能上的差异。 147020a203aSopenharmony_ci 148020a203aSopenharmony_ci2、插件包中的插件可以插入到hiview二进制中的流水线中。 149020a203aSopenharmony_ci 150020a203aSopenharmony_ci3、无论在何处的订阅者,根据其订阅的规则都可以收到全平台发送出来的相应事件。 151020a203aSopenharmony_ci 152020a203aSopenharmony_ci插件包实例详见test/plugins/examples_bundle/,其[插件配置文件](#插件配置文件)详见test/resource/base/bundleplugintest_plugin_config 153020a203aSopenharmony_ci 154020a203aSopenharmony_ci插件跨包注册流水线实例详见test/plugins/examples_bundle/bundle_plugin_example2中的插件 155020a203aSopenharmony_ci 156020a203aSopenharmony_ci## 流水线的概念 157020a203aSopenharmony_ci 158020a203aSopenharmony_ci流水线是用于处理多个插件协同完成任务。流水线上面可以对应多个插件,流水线上面的执行插件的顺序是根据配置文件上写的先后顺序执行。 159020a203aSopenharmony_ci 160020a203aSopenharmony_ci事件源与流水线的概念对应,关系为一对多关系。一个事件源可以有n个流水线,一个流水线可以有n个插件。 161020a203aSopenharmony_ci 162020a203aSopenharmony_ci事件源在平台初始化后可以循环的调用PublishPipelineEvent方法将事件源新建的事件向绑定的流水线分发,分发前会向流水线询问是否处理该事件,这里默认使用流水线中的第一个插件的CanProcessEvent接口。如果返回true处理该事件,则会进行后续的处理;如果返回false则当前整条流水线不处理该事件。 163020a203aSopenharmony_ci 164020a203aSopenharmony_ci流水线处理流程详见整个test/plugins/examples模块,其[插件配置文件](#插件配置文件)详见test/resource/base/holistic_platform/plugin_config 165020a203aSopenharmony_ci 166020a203aSopenharmony_ci## hiview配置文件 167020a203aSopenharmony_ci 168020a203aSopenharmony_cihiview插件管理平台通过“[平台配置文件](#平台配置文件)”配置相关“[插件配置文件](#插件配置文件)”的路径信息、生成日志路径等信息。 169020a203aSopenharmony_ci 170020a203aSopenharmony_ci### 平台配置文件 171020a203aSopenharmony_ci 172020a203aSopenharmony_ci“平台配置文件”默认在设备/system/etc/hiview/下面的hiview_platform_config,具体内容如下: 173020a203aSopenharmony_ci``` 174020a203aSopenharmony_ciDEFAULT_PLUGIN_CONFIG_NAME = "plugin_config" 175020a203aSopenharmony_ciPLUGIN_CONFIG_FILE_DIR = "/system/etc/hiview/" 176020a203aSopenharmony_ciDYNAMIC_LIB_SEARCH_DIR = "/system/lib/" 177020a203aSopenharmony_ciDYNAMIC_LIB64_SEARCH_DIR = "/system/lib64/" 178020a203aSopenharmony_ciWORK_DIR = "/data/log/hiview/" 179020a203aSopenharmony_ciCOMMERCIAL_WORK_DIR = "/log/LogService/" 180020a203aSopenharmony_ciPERSIST_DIR = "/log/hiview/" 181020a203aSopenharmony_ci``` 182020a203aSopenharmony_ci 183020a203aSopenharmony_ci| 名称 | 说明 | 184020a203aSopenharmony_ci| -------- | -------- | 185020a203aSopenharmony_ci| DEFAULT_PLUGIN_CONFIG_NAME | 表示默认的插件配置文件名字,plugin_config表示编译在hiview二进制中插件的配置文件名字,基于此名字 | 186020a203aSopenharmony_ci| DEFAULT_PLUGIN_CONFIG_NAME | xxx_plugin_config表示编译在libxxx.z.so中插件的配置文件名字 | 187020a203aSopenharmony_ci| PLUGIN_CONFIG_FILE_DIR | 表示插件配置文件所在的位置 | 188020a203aSopenharmony_ci| DYNAMIC_LIB_SEARCH_DIR | 表示插件包在32位系统中的位置 | 189020a203aSopenharmony_ci| DYNAMIC_LIB64_SEARCH_DIR | 表示插件包在64位系统中的位置 | 190020a203aSopenharmony_ci| WORK_DIR | 工作日志路径 | 191020a203aSopenharmony_ci| PERSIST_DIR | 持久日志路径 | 192020a203aSopenharmony_ci 193020a203aSopenharmony_ci### 插件配置文件 194020a203aSopenharmony_ci 195020a203aSopenharmony_ci在hiview二进制中的插件需要通过编写build/plugin_build.json文件来配置相关信息,编译的时候会自动生成plugin_config文件。 196020a203aSopenharmony_ci 197020a203aSopenharmony_ci插件配置需要考虑下面几个部分的内容: 198020a203aSopenharmony_ci 199020a203aSopenharmony_ci| 名称 | 说明 | 200020a203aSopenharmony_ci| -------- | -------- | 201020a203aSopenharmony_ci| 插件信息 | 包含插件类的名称、插件对应的gn的路径、gn中编译的名称 | 202020a203aSopenharmony_ci| 平台配置规则 | 包含对应的rom、ram、加载时间等信息 | 203020a203aSopenharmony_ci| 插件加载的顺序 | 平台将安装配置的先后顺序加载。优先根据加载时间排序,若加载时间相同、则按照配置的顺序加载。 | 204020a203aSopenharmony_ci| 流水线配置 | 如果插件参与流水线,将插件配置到相应的流水线下 | 205020a203aSopenharmony_ci| 流水线组(事件源)的配置 | 将流水线配置到对应的事件源下面 | 206020a203aSopenharmony_ci| 线程配置模型 | 配置插件是否需要线程 | 207020a203aSopenharmony_ci 208020a203aSopenharmony_ci实例plugin_build.json如下: 209020a203aSopenharmony_ci``` 210020a203aSopenharmony_ci{ 211020a203aSopenharmony_ci "plugins": { # 插件列表信息 212020a203aSopenharmony_ci "SysEventSource": { # 插件名,必须为对应的类名(事件源也是插件,也需要在此配置) 213020a203aSopenharmony_ci "path": "core", # 插件位置,插件gn所在的位置 214020a203aSopenharmony_ci "name": "sysevent_source" # 插件的编译名,在gn中插件所对应的部分的编译名 215020a203aSopenharmony_ci }, 216020a203aSopenharmony_ci "SysEventService": { 217020a203aSopenharmony_ci "path": "plugins/eventservice", 218020a203aSopenharmony_ci "name": "sys_event_service" 219020a203aSopenharmony_ci }, 220020a203aSopenharmony_ci "Faultlogger": { 221020a203aSopenharmony_ci "path": "plugins/faultlogger", 222020a203aSopenharmony_ci "name": "faultlogger" 223020a203aSopenharmony_ci }, 224020a203aSopenharmony_ci "EventLogger": { 225020a203aSopenharmony_ci "path": "plugins/eventlogger", 226020a203aSopenharmony_ci "name": "eventlogger" 227020a203aSopenharmony_ci }, 228020a203aSopenharmony_ci }, 229020a203aSopenharmony_ci "rules": [ # 平台平台配置规则列表 230020a203aSopenharmony_ci { 231020a203aSopenharmony_ci "rule": [ 232020a203aSopenharmony_ci { 233020a203aSopenharmony_ci "rom": "1G", # rom规则 234020a203aSopenharmony_ci "ram": "1G" # ram规则 235020a203aSopenharmony_ci } 236020a203aSopenharmony_ci ], 237020a203aSopenharmony_ci "info": { 238020a203aSopenharmony_ci "loadorder": { # 插件的载入时间配置列表 239020a203aSopenharmony_ci "SysEventSource": { # 插件名称,与上面"plugins"列表中的插件名称对应 240020a203aSopenharmony_ci "loadtime": 0 # 当前插件延时多少时间之后加载,为0就是立即加载 241020a203aSopenharmony_ci }, # 插件加载顺序,先按加载时间先后加载,然后按照当前列表顺序加载。 242020a203aSopenharmony_ci "Faultlogger": { 243020a203aSopenharmony_ci "loadtime": 0 244020a203aSopenharmony_ci }, 245020a203aSopenharmony_ci "EventLogger": { 246020a203aSopenharmony_ci "loadtime": 0 247020a203aSopenharmony_ci }, 248020a203aSopenharmony_ci "SysEventService": { 249020a203aSopenharmony_ci "loadtime": 0 250020a203aSopenharmony_ci } 251020a203aSopenharmony_ci }, 252020a203aSopenharmony_ci "pipelines": { # 流水线配置列表 253020a203aSopenharmony_ci "SysEventPipeline": [ # 流水线名称 254020a203aSopenharmony_ci "SysEventService", # 流水线中的插件,与上面"plugins"列表中的插件名称对应 255020a203aSopenharmony_ci "Faultlogger", # 流水线中插件的执行顺序按照列表中先后顺序执行 256020a203aSopenharmony_ci "EventLogger" 257020a203aSopenharmony_ci ] 258020a203aSopenharmony_ci }, 259020a203aSopenharmony_ci "pipelinegroups": { # 流水线组(事件源)配置列表 260020a203aSopenharmony_ci "SysEventSource": [ # 事件源名称,与上面"plugins"列表中的插件名称对应 261020a203aSopenharmony_ci "SysEventPipeline" 262020a203aSopenharmony_ci ] 263020a203aSopenharmony_ci }, 264020a203aSopenharmony_ci "threads": { # 流线程配置模型列表 265020a203aSopenharmony_ci "singledthread": { # 独享线程模式 266020a203aSopenharmony_ci "SysEventSource": "sysevent_source", # 将对应插件配置,名为"sysevent_source"的线程 267020a203aSopenharmony_ci "SysEventService": "sysevent_service", # 独享线程模式 268020a203aSopenharmony_ci }, 269020a203aSopenharmony_ci "sharedthread": { 270020a203aSopenharmony_ci "sharedthread1": ["Faultlogger", "EventLogger"] #当前两个插件共享一个名为"sharedthread1"的线程 271020a203aSopenharmony_ci } 272020a203aSopenharmony_ci } 273020a203aSopenharmony_ci } 274020a203aSopenharmony_ci } 275020a203aSopenharmony_ci ] 276020a203aSopenharmony_ci} 277020a203aSopenharmony_ci``` 278020a203aSopenharmony_ci 279020a203aSopenharmony_ci在独立插件包的插件配置文件,由于插件实体可以不参与整体hiview的编译,所以直接编写xxx_plugin_config配置文件。不编写plugin_build.json 280020a203aSopenharmony_ci 281020a203aSopenharmony_ciplugin_config实例完整文件可以参考test/resource/base/plugin_config,文件讲解如下: 282020a203aSopenharmony_ci``` 283020a203aSopenharmony_ciplugins:7 // 插件总数是七个,与下面插件个数必须对应 284020a203aSopenharmony_ciEventProcessorExample4[thread:t-example-2]:0 static // 插件名称[thread:线程名称]:加载时间 插件模式 285020a203aSopenharmony_ciEventProcessorExample1[thread:t-example-4]:0 static // 插件名称必须是类名 286020a203aSopenharmony_ciEventProcessorExample2[thread:t-example-1]:0 static // 线程名称一样表示这两个插件共享线程,中括号内为空表示不配置线程 287020a203aSopenharmony_ciEventProcessorExample3[thread:t-example-4]:0 static // 加载时间,延时多长时间以后加载,0为立马加载 288020a203aSopenharmony_ciEventProcessorExample5[]:0 static // 插件加载的顺序先按照加载时间顺序,然后在按照当前配置顺序加载 289020a203aSopenharmony_ciEventSourceExample[thread:t-example-3]:0 static // 插件模式,static表示当前插件实体静态的编译在hiview二进制中 290020a203aSopenharmony_ciDynamicLoadPluginExample[thread:t-example-5]:0 dynamic // 插件模式,dynamic表示当前插件实体是以so的形式体现,名称为libDynamicLoadPluginExample.z.so 291020a203aSopenharmony_cipipelines:3 // 表示当前流水线有三个,与下面流水线个数必须对应 292020a203aSopenharmony_ciNormalPipeline:EventProcessorExample1 EventProcessorExample2 EventProcessorExample3 EventProcessorExample4 // 流水线名称:插件1 插件2 插件3 插件4(插件名需要与上面定义的插件对应) 293020a203aSopenharmony_ciReversePipeline:EventProcessorExample4 EventProcessorExample3 EventProcessorExample2 EventProcessorExample1 // 流水线上插件的执行顺序是按照这个的先后顺序 294020a203aSopenharmony_ciSimplePipeline:EventProcessorExample3 EventProcessorExample2 // 流水线名称注意不要跟其他包的流水线重复 295020a203aSopenharmony_cipipelinegroups:1 // 流水线组(事件源)列表,该表示,事件源有1个 296020a203aSopenharmony_ciEventSourceExample:NormalPipeline ReversePipeline SimplePipeline // 事件源:流水线1 流水线2 流水线3 (流水线名需要与上面定义的流水线对应) 297020a203aSopenharmony_ci // 事件源执行流程,按照先后顺序执行流水线,每个流水线按其在的插件的顺序执行 298020a203aSopenharmony_ci // 前一个插件流水线中所以的插件执行完毕,才能只能下一个流水线 299020a203aSopenharmony_ci``` 300020a203aSopenharmony_ci 301020a203aSopenharmony_ci## 插件平台提供的能力 302020a203aSopenharmony_ci 303020a203aSopenharmony_ci### 事件 304020a203aSopenharmony_ci 305020a203aSopenharmony_ci插件与插件之间,插件与平台之间的交互均采用事件驱动的模式,事件定义请参考文件base/include/event.h,这里不详细讲解。 306020a203aSopenharmony_ci 307020a203aSopenharmony_ci事件预定义的若干类型,在Event::MessageType中,业务也可以在\include\public_defines.h中定义自己的事件类型。 308020a203aSopenharmony_ci 309020a203aSopenharmony_ci### 事件订阅 310020a203aSopenharmony_ci 311020a203aSopenharmony_ci插件与插件之间,或者插件与单独的订阅者模块之间,可以通过事件订阅的方式进行交互。 312020a203aSopenharmony_ci 313020a203aSopenharmony_ci事件订阅分为两种: 314020a203aSopenharmony_ci 315020a203aSopenharmony_ci一种是单独的订阅者模式EventListener,该模式可以单独形成一个EventListener模块专门订阅事件、处理事件的小模块;也可以被插件继承用于插件监听事件,当插件选择这种监听模式将不能被动态加载和卸载 316020a203aSopenharmony_ci 317020a203aSopenharmony_ci需要继承EventListener并且实现如下方法或者使用如下的接口: 318020a203aSopenharmony_ci``` 319020a203aSopenharmony_ciclass EventListener { 320020a203aSopenharmony_cipublic: 321020a203aSopenharmony_ci /* 该方法已经弃用,为了兼容以前的代码没有删除,新代码中不需要实现 */ 322020a203aSopenharmony_ci virtual bool OnOrderedEvent(const Event &msg); 323020a203aSopenharmony_ci 324020a203aSopenharmony_ci /* 该方法为接收订阅来的外部驱动事件,并且处理事件 */ 325020a203aSopenharmony_ci virtual void OnUnorderedEvent(const Event &msg) = 0; 326020a203aSopenharmony_ci 327020a203aSopenharmony_ci /* 该方法为定义当前订阅者的名字 */ 328020a203aSopenharmony_ci virtual std::string GetListenerName() = 0; 329020a203aSopenharmony_ci 330020a203aSopenharmony_ci // 以下为接口 331020a203aSopenharmony_ci /* 添加需要订阅的事件。订阅的事件分为依靠eventName订阅和EventIdRange(eventId范围也可以是全范围或者单一id)订阅。type是事件类型 */ 332020a203aSopenharmony_ci void AddListenerInfo(uint32_t type, const EventListener::EventIdRange &range = EventListener::EventIdRange(0)); 333020a203aSopenharmony_ci void AddListenerInfo(uint32_t type, const std::set<EventListener::EventIdRange> &listenerInfo); 334020a203aSopenharmony_ci void AddListenerInfo(uint32_t type, const std::string& eventName); 335020a203aSopenharmony_ci void AddListenerInfo(uint32_t type, const std::set<std::string> &eventNames); 336020a203aSopenharmony_ci 337020a203aSopenharmony_ci /* 可以获取当前订阅者订阅的事件信息 */ 338020a203aSopenharmony_ci bool GetListenerInfo(uint32_t type, std::set<std::string> &eventNames); 339020a203aSopenharmony_ci bool GetListenerInfo(uint32_t type, std::set<EventListener::EventIdRange> &listenerInfo); 340020a203aSopenharmony_ci}; 341020a203aSopenharmony_ci``` 342020a203aSopenharmony_ci 343020a203aSopenharmony_ciEventListener订阅者实例详见test/plugins/examples/event_processor_example2中的插件 344020a203aSopenharmony_ci 345020a203aSopenharmony_ci另一种是在插件中动态订阅者,可以被动态卸载和加载。当插件是在代理模式的时候,订阅的事件到来可以动态加载起来插件进行执行,过一点时间以后动态插件再被卸载。 346020a203aSopenharmony_ci具体的实现详见[插件的定义](#插件的定义)一节。 347020a203aSopenharmony_ci 348020a203aSopenharmony_ci插件中动态订阅者实例详见test/plugins/examples/event_processor_example4中的插件 349020a203aSopenharmony_ci 350020a203aSopenharmony_ci**注意:区分两种订阅模式的接口,不要混合调用了,混合调用添加的订阅事件将不会被另一种方式监听到。** 351020a203aSopenharmony_ci 352020a203aSopenharmony_ci### 平台提供的功能接口 353020a203aSopenharmony_ci 354020a203aSopenharmony_ci平台提供的功能在插件中可以通过调用GetHiviewContext()获得平台接口上下文。平台提供的主要的功能接口如下: 355020a203aSopenharmony_ci``` 356020a203aSopenharmony_ciclass HiviewContext { 357020a203aSopenharmony_cipublic: 358020a203aSopenharmony_ci 359020a203aSopenharmony_ci /* 将继承了EventListener类的订阅者,注册到平台中,开启订阅 */ 360020a203aSopenharmony_ci void RegisterUnorderedEventListener(std::weak_ptr<EventListener> listener); 361020a203aSopenharmony_ci 362020a203aSopenharmony_ci /* 将作为插件中的动态订阅者,注册到平台中,开启订阅。动态插件和静态插件只要是想通过插件内部接口和方法定义的订阅者都可以使用这个注册 */ 363020a203aSopenharmony_ci void RegisterDynamicListenerInfo(std::weak_ptr<Plugin> listener); 364020a203aSopenharmony_ci 365020a203aSopenharmony_ci /* 发送事件到订阅者,该接口发送的事件,无论那种订阅方式都可以按规则被订阅到 */ 366020a203aSopenharmony_ci void PostUnorderedEvent(std::shared_ptr<Plugin> plugin, std::shared_ptr<Event> event); 367020a203aSopenharmony_ci 368020a203aSopenharmony_ci /* 卸载并从平台移除插件,之后再也不能被加载起来,慎用 */ 369020a203aSopenharmony_ci void RequestUnloadPlugin(std::shared_ptr<Plugin> caller); 370020a203aSopenharmony_ci 371020a203aSopenharmony_ci /* 获得平台中共享的EventLoop线程 */ 372020a203aSopenharmony_ci std::shared_ptr<EventLoop> GetSharedWorkLoop(); 373020a203aSopenharmony_ci 374020a203aSopenharmony_ci /* 按照流水线名称获得流水线当中的插件 */ 375020a203aSopenharmony_ci std::list<std::weak_ptr<Plugin>> GetPipelineSequenceByName(const std::string& name); 376020a203aSopenharmony_ci 377020a203aSopenharmony_ci /* 检测平台是否已经全部加载完毕,返回true是全部初始化和加载完毕,返回false就是平台没有初始化和加载完成 */ 378020a203aSopenharmony_ci bool IsReady(); 379020a203aSopenharmony_ci 380020a203aSopenharmony_ci /* 按照key值获得平台参数 */ 381020a203aSopenharmony_ci std::string GetHiviewProperty(const std::string& key, const std::string& defaultValue); 382020a203aSopenharmony_ci 383020a203aSopenharmony_ci /* 可以向平台中设置平台参数 key-value形式 */ 384020a203aSopenharmony_ci bool SetHiviewProperty(const std::string& key, const std::string& value, bool forceUpdate); 385020a203aSopenharmony_ci 386020a203aSopenharmony_ci /* 向平台的特定流水线中添加特定插件 */ 387020a203aSopenharmony_ci void AppendPluginToPipeline(const std::string& pluginName, const std::string& pipelineName); 388020a203aSopenharmony_ci 389020a203aSopenharmony_ci /* 通过插件名称获取插件或者插件的代理 */ 390020a203aSopenharmony_ci std::shared_ptr<Plugin> GetPluginByName(const std::string& name); 391020a203aSopenharmony_ci}; 392020a203aSopenharmony_ci``` 393020a203aSopenharmony_ci 394020a203aSopenharmony_ci## 实例解析 395020a203aSopenharmony_ci 396020a203aSopenharmony_ci这里以test/plugins/examples/event_source_example事件源为例讲解其注册、流转、监控等机制。 397020a203aSopenharmony_ci 398020a203aSopenharmony_ci``` 399020a203aSopenharmony_ci//event_source_example.h 400020a203aSopenharmony_ci// 该类继承FileDescriptorEventCallback,可以监听文件夹文件的变化,使用该类方法必须配置线程 401020a203aSopenharmony_ciclass EventSourceExample : public FileDescriptorEventCallback, public EventSource { 402020a203aSopenharmony_cipublic: 403020a203aSopenharmony_ci EventSourceExample(); 404020a203aSopenharmony_ci ~EventSourceExample(); 405020a203aSopenharmony_ci 406020a203aSopenharmony_ci /* 为了记录当前全局的插件构造和析构的数据结构 */ 407020a203aSopenharmony_ci static std::set<std::string> count; 408020a203aSopenharmony_ci 409020a203aSopenharmony_ci /* 重载事件源相关的虚方法,详情参考[事件源的定义]一节 */ 410020a203aSopenharmony_ci void OnLoad() override; 411020a203aSopenharmony_ci void OnUnload() override; 412020a203aSopenharmony_ci void Recycle(PipelineEvent* event) override; 413020a203aSopenharmony_ci void PauseDispatch(std::weak_ptr<Plugin> plugin) override; 414020a203aSopenharmony_ci void StartEventSource() override 415020a203aSopenharmony_ci { 416020a203aSopenharmony_ci /* 添加文件监听到eventLoop线程 */ 417020a203aSopenharmony_ci GetWorkLoop()->AddFileDescriptorEventCallback("Example", 418020a203aSopenharmony_ci std::static_pointer_cast<EventSourceExample>(shared_from_this())); 419020a203aSopenharmony_ci } 420020a203aSopenharmony_ci 421020a203aSopenharmony_ci 422020a203aSopenharmony_ci /* 监听的文件夹文件发生变化的回调 */ 423020a203aSopenharmony_ci bool OnFileDescriptorEvent(int fd, int type) override; 424020a203aSopenharmony_ci 425020a203aSopenharmony_ci /* 初始化需要监听的文件夹文件 */ 426020a203aSopenharmony_ci int32_t GetPollFd() override; 427020a203aSopenharmony_ci 428020a203aSopenharmony_ci /* 返回Poll类型 */ 429020a203aSopenharmony_ci int32_t GetPollType() override; 430020a203aSopenharmony_ci 431020a203aSopenharmony_ci const static inline int PIPELINE_EVENT_ID_AAA = 901000000; 432020a203aSopenharmony_ci const static inline int PIPELINE_EVENT_ID_BBB = 901000001; 433020a203aSopenharmony_ci const static inline int PIPELINE_EVENT_ID_CCC = 901000002; 434020a203aSopenharmony_ci const static inline int PIPELINE_EVENT_ID_TAA = 901000010; 435020a203aSopenharmony_ci 436020a203aSopenharmony_ciprivate: 437020a203aSopenharmony_ci /* 文件创建方法 */ 438020a203aSopenharmony_ci void CreateWatchFile(const std::string& path); 439020a203aSopenharmony_ci 440020a203aSopenharmony_ci /* 创建事件方法 */ 441020a203aSopenharmony_ci void CreateAndPublishEvent(const std::string& file); 442020a203aSopenharmony_ci 443020a203aSopenharmony_ci const static inline std::string SYSTEM_FAULT_LOG_PATH = "/data/test/faultlog"; 444020a203aSopenharmony_ci int inotifyFd_; 445020a203aSopenharmony_ci std::map<std::string, int> fileMap_; 446020a203aSopenharmony_ci}; 447020a203aSopenharmony_ci```