0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙實(shí)戰(zhàn)開(kāi)發(fā)學(xué)習(xí):【HiView插件開(kāi)發(fā)】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-12 11:52 ? 次閱讀

概述

Hiview是一個(gè)跨平臺(tái)的終端設(shè)備維測(cè)服務(wù)集,其中是由插件管理平臺(tái)和插件實(shí)現(xiàn)的各自功能構(gòu)成整套系統(tǒng)。 本文描述了hiview插件開(kāi)發(fā)的全部流程。

插件的概念

整節(jié)部分包括了插件的概念,事件源的概念,流水線的概念等基本概念

插件的定義

hiview插件可以理解為運(yùn)行在hiview進(jìn)程中,隨hiview二進(jìn)制一同交付的完成獨(dú)立功能的維測(cè)、故障管理模塊。

插件可以是自驅(qū)動(dòng)的事件源,也可以是由外部事件驅(qū)動(dòng)的一般插件。其中事件驅(qū)動(dòng)有兩種方式:流水線驅(qū)動(dòng)和訂閱查詢驅(qū)動(dòng)。

單個(gè)插件可以靜態(tài)加載(永遠(yuǎn)不會(huì)被卸載)和插件代理加載,代理加載其中包含:開(kāi)機(jī)不加載運(yùn)行時(shí)動(dòng)態(tài)加載卸載、開(kāi)機(jī)加載之后再動(dòng)態(tài)卸載加載。

插件選擇被代理時(shí)插件可以被動(dòng)態(tài)卸載和加載,在已經(jīng)被卸載的情況下,當(dāng)外部驅(qū)動(dòng)事件到來(lái)以后被加載。

特定的插件是通過(guò)繼承Plugin這個(gè)類實(shí)現(xiàn)特定的插件功能,其相對(duì)應(yīng)的插件由多態(tài)的形式存在并且流轉(zhuǎn)在插件管理平臺(tái)中。

事件處理或者驅(qū)動(dòng)插件根據(jù)不同需求,需要繼承Plugin并且實(shí)現(xiàn)如下方法或者使用如下的接口

class Plugin {
public:
    /* 插件生命周期中,當(dāng)前插件被平臺(tái)加載起來(lái)后調(diào)用,可以用于初始化一些數(shù)據(jù) */
    virtual void OnLoad();

    /* 插件生命周期中,當(dāng)前插件被平臺(tái)卸載前調(diào)用,可以用于回收一些數(shù)據(jù) */
    virtual void OnUnload();

    /* 運(yùn)行期判斷當(dāng)前插件是否被加載,返回true是被需要被平臺(tái)加載;false是將永遠(yuǎn)不會(huì)被平臺(tái)加載。Plugin默認(rèn)返回true */
    virtual bool ReadyToLoad();

    /* 當(dāng)前插件在流水線上時(shí),接收流水線上外部驅(qū)動(dòng)事件,或者當(dāng)前插件自己設(shè)置的延時(shí)事件,并且處理事件。其處理過(guò)程是當(dāng)前插件定義是的線程中,若沒(méi)有指定則在當(dāng)前線程進(jìn)行 */
    virtual bool OnEvent(std::shared_ptr< Event >& event) override;

    /* 當(dāng)前插件在流水線上,且是當(dāng)前流水線上第一個(gè)插件時(shí),判斷是否流轉(zhuǎn)整條流水線。返回true是流轉(zhuǎn)整條流水線;false是不流轉(zhuǎn)整條流水線 */
    virtual bool CanProcessEvent(std::shared_ptr< Event > event) override;

    /* 當(dāng)前插件在流水線上時(shí),判斷當(dāng)前事件源是否進(jìn)入暫停狀態(tài)。返回true是進(jìn)行處理,將會(huì)繼續(xù)調(diào)用插件的OnEvent方法;false將進(jìn)入事件源PauseDispatch方法,進(jìn)行處理,然后繼續(xù)執(zhí)行后續(xù)操作 */
    virtual bool CanProcessMoreEvents() override;

    /* 可以通過(guò)hidumper命令行查詢當(dāng)前插件的dump信息,該接口就是實(shí)現(xiàn)能dump出來(lái)那些內(nèi)容 */
    virtual void Dump(int fd, const std::vector< std::string >& cmds);

    /* 當(dāng)前插件作為一個(gè)事件動(dòng)態(tài)訂閱者,接收通過(guò)動(dòng)態(tài)訂閱來(lái)的外部驅(qū)動(dòng)事件,并且處理事件 */
    virtual void OnEventListeningCallback(const Event &msg);

    // 以下為接口
    /* 當(dāng)前插件作為動(dòng)態(tài)訂閱者時(shí),添加需要訂閱的事件。訂閱的事件分為依靠eventName訂閱和EventIdRange(eventId范圍也可以是全范圍或者單一id)訂閱。type是事件類型 */
    void AddEventListenerInfo(uint32_t type, const EventListener::EventIdRange &range = EventListener::EventIdRange(0));
    void AddEventListenerInfo(uint32_t type, const std::set< EventListener::EventIdRange > &listenerInfo);
    void AddEventListenerInfo(uint32_t type, const std::string& eventName);
    void AddEventListenerInfo(uint32_t type, const std::set< std::string > &eventNames);

    /* 設(shè)置延時(shí)執(zhí)行事件 等時(shí)間到了以后在OnEvent中執(zhí)行 */
    void DelayProcessEvent(std::shared_ptr< Event > event, uint64_t delay);

    /* 得到hiview插件管理平臺(tái)接口的上下文 */
    HiviewContext* GetHiviewContext();

    const std::string& GetName();
    const std::string& GetVersion();
    void SetVersion(const std::string& version);
}

插件的生命周期

插件目前只有OnLoad和OnUnload兩個(gè)生命周期回調(diào)。

這里的dynamic插件僅僅表示單一插件實(shí)體是以so的形式體現(xiàn),名稱為libxxx.z.so。

dynamic插件與上文的動(dòng)態(tài)加載卸載插件沒(méi)有關(guān)系。dynamic插件的so也與[插件包]的so也沒(méi)有關(guān)系。

dynamic插件與靜態(tài)插件沒(méi)有功能上面的區(qū)別,只區(qū)別插件的實(shí)現(xiàn)形式。

其生命周期調(diào)用邏輯如下

插件的注冊(cè)方式:

插件的注冊(cè)方式有三種:

名稱說(shuō)明實(shí)例
靜態(tài)注冊(cè)通過(guò)使用宏定義REGISTER(xxx);注冊(cè),該種注冊(cè)方式的插件不能被卸載實(shí)例詳見(jiàn)test/plugins/examples/event_processor_example1中的插件
代理注冊(cè)通過(guò)使用宏定義REGISTER_PROXY(xxx);注冊(cè),開(kāi)機(jī)不加載運(yùn)行時(shí)動(dòng)態(tài)加載卸載實(shí)例詳見(jiàn)test/plugins/examples/event_processor_example3中的插件
代理注冊(cè)且開(kāi)機(jī)加載通過(guò)使用宏定義REGISTER_PROXY_WITH_LOADED(xxx);注冊(cè),開(kāi)機(jī)加載之后再動(dòng)態(tài)卸載加載實(shí)例詳見(jiàn)test/plugins/examples/event_processor_example4中的插件

事件源的定義

事件源是繼承于EventSource實(shí)現(xiàn)特定的事件源功能。事件源也是一種特殊的插件,EventSource繼承于[Plugin]可以實(shí)現(xiàn)或者使用其中公共的方法。事件源作為事件的驅(qū)動(dòng)者,不能被代理加載,只能靜態(tài)加載。

事件源需要繼承EventSource這個(gè)類實(shí)現(xiàn)如下方法或者使用如下的接口,根據(jù)需求也需實(shí)現(xiàn)[Plugin]類中的虛方法:

class EventSource : public PipelineEventProducer, public Plugin {
public:

    /* 開(kāi)啟事件源,當(dāng)平臺(tái)加載完成,加載事件源之后執(zhí)行,可以用于初始化或者開(kāi)啟一些事件源數(shù)據(jù)或者事件 */
    virtual void StartEventSource();

    /* 通知事件生產(chǎn)者事件已完成其傳遞 */
    virtual void Recycle(PipelineEvent* event);

    /* 暫停調(diào)度并安排恢復(fù)調(diào)度 */
    virtual void PauseDispatch(std::weak_ptr< Plugin > plugin);

    //以下為接口
    /* 將事件下發(fā)到各個(gè)流水線,開(kāi)始當(dāng)前事件源下流水線的運(yùn)作 */
    bool PublishPipelineEvent(std::shared_ptr< PipelineEvent > event);

    /* 動(dòng)態(tài)添加流水線到當(dāng)前事件源 */
    void AddPipeline(std::shared_ptr< Pipeline > pipeline);
};

事件源實(shí)例詳見(jiàn)test/plugins/examples/event_source_example或者test/plugins/examples_bundle/bundle_event_source_example

插件包的概念

根據(jù)業(yè)務(wù)的需求,插件可以不用全部編譯在hiview二進(jìn)制中。支持將若干個(gè)插件編譯成為獨(dú)立的插件包,以獨(dú)立so的形式提供,并且一個(gè)so對(duì)應(yīng)于一個(gè)plugin_config文件。 例如libxxx.z.so,對(duì)應(yīng)于xxx_plugin_config配置文件。

hiview插件管理平臺(tái)插件包做如下說(shuō)明:

1、插件包作為一個(gè)獨(dú)立的個(gè)體在插件管理平臺(tái)中運(yùn)行,內(nèi)部插件、流水線或者事件源都與在hiview二進(jìn)制中的插件沒(méi)有功能上的差異。

2、插件包中的插件可以插入到hiview二進(jìn)制中的流水線中。

3、無(wú)論在何處的訂閱者,根據(jù)其訂閱的規(guī)則都可以收到全平臺(tái)發(fā)送出來(lái)的相應(yīng)事件。

插件跨包注冊(cè)流水線實(shí)例詳見(jiàn)test/plugins/examples_bundle/bundle_plugin_example2中的插件

流水線的概念

流水線是用于處理多個(gè)插件協(xié)同完成任務(wù)。流水線上面可以對(duì)應(yīng)多個(gè)插件,流水線上面的執(zhí)行插件的順序是根據(jù)配置文件上寫(xiě)的先后順序執(zhí)行。

事件源與流水線的概念對(duì)應(yīng),關(guān)系為一對(duì)多關(guān)系。一個(gè)事件源可以有n個(gè)流水線,一個(gè)流水線可以有n個(gè)插件。

事件源在平臺(tái)初始化后可以循環(huán)的調(diào)用PublishPipelineEvent方法將事件源新建的事件向綁定的流水線分發(fā),分發(fā)前會(huì)向流水線詢問(wèn)是否處理該事件,這里默認(rèn)使用流水線中的第一個(gè)插件的CanProcessEvent接口。如果返回true處理該事件,則會(huì)進(jìn)行后續(xù)的處理;如果返回false則當(dāng)前整條流水線不處理該事件。

流水線處理流程詳見(jiàn)整個(gè)test/plugins/examples模塊。

hiview配置文件

hiview插件管理平臺(tái)通過(guò)“[平臺(tái)配置文件]”配置相關(guān)“[插件配置文件]”的路徑信息、生成日志路徑等信息。

平臺(tái)配置文件

“平臺(tái)配置文件”默認(rèn)在設(shè)備/system/etc/hiview/下面的hiview_platform_config,具體內(nèi)容如下:

DEFAULT_PLUGIN_CONFIG_NAME = "plugin_config"
PLUGIN_CONFIG_FILE_DIR = "/system/etc/hiview/"
DYNAMIC_LIB_SEARCH_DIR = "/system/lib/"
DYNAMIC_LIB64_SEARCH_DIR = "/system/lib64/"
WORK_DIR = "/data/log/hiview/"
COMMERCIAL_WORK_DIR = "/log/LogService/"
PERSIST_DIR = "/log/hiview/"
名稱說(shuō)明
DEFAULT_PLUGIN_CONFIG_NAME表示默認(rèn)的插件配置文件名字,plugin_config表示編譯在hiview二進(jìn)制中插件的配置文件名字,基于此名字
DEFAULT_PLUGIN_CONFIG_NAMExxx_plugin_config表示編譯在libxxx.z.so中插件的配置文件名字
PLUGIN_CONFIG_FILE_DIR表示插件配置文件所在的位置
DYNAMIC_LIB_SEARCH_DIR表示插件包在32位系統(tǒng)中的位置
DYNAMIC_LIB64_SEARCH_DIR表示插件包在64位系統(tǒng)中的位置
WORK_DIR工作日志路徑
PERSIST_DIR持久日志路徑

插件配置文件

在hiview二進(jìn)制中的插件需要通過(guò)編寫(xiě)build/plugin_build.json文件來(lái)配置相關(guān)信息,編譯的時(shí)候會(huì)自動(dòng)生成plugin_config文件。

插件配置需要考慮下面幾個(gè)部分的內(nèi)容:

名稱說(shuō)明
插件信息包含插件類的名稱、插件對(duì)應(yīng)的gn的路徑、gn中編譯的名稱
平臺(tái)配置規(guī)則包含對(duì)應(yīng)的romram、加載時(shí)間等信息
插件加載的順序平臺(tái)將安裝配置的先后順序加載。優(yōu)先根據(jù)加載時(shí)間排序,若加載時(shí)間相同、則按照配置的順序加載。
流水線配置如果插件參與流水線,將插件配置到相應(yīng)的流水線下
流水線組(事件源)的配置將流水線配置到對(duì)應(yīng)的事件源下面
線程配置模型配置插件是否需要線程

實(shí)例plugin_build.json如下:

{
    "plugins": {                                # 插件列表信息
        "SysEventSource": {                     # 插件名,必須為對(duì)應(yīng)的類名(事件源也是插件,也需要在此配置)
            "path": "core",                     # 插件位置,插件gn所在的位置
            "name": "sysevent_source"           # 插件的編譯名,在gn中插件所對(duì)應(yīng)的部分的編譯名
        },
        "SysEventService": {
            "path": "plugins/eventservice",
            "name": "sys_event_service"
        },
        "Faultlogger": {
            "path": "plugins/faultlogger",
            "name": "faultlogger"
        },
        "EventLogger": {
            "path": "plugins/eventlogger",
            "name": "eventlogger"
        },
    },
    "rules": [                                  # 平臺(tái)平臺(tái)配置規(guī)則列表
        {
            "rule": [
                {
                    "rom": "1G",                # rom規(guī)則
                    "ram": "1G"                 # ram規(guī)則
                }
            ],
            "info": {
                "loadorder": {                  # 插件的載入時(shí)間配置列表
                    "SysEventSource": {         # 插件名稱,與上面"plugins"列表中的插件名稱對(duì)應(yīng)
                        "loadtime": 0           # 當(dāng)前插件延時(shí)多少時(shí)間之后加載,為0就是立即加載
                    },                          # 插件加載順序,先按加載時(shí)間先后加載,然后按照當(dāng)前列表順序加載。
                    "Faultlogger": {
                        "loadtime": 0
                    },
                    "EventLogger": {
                        "loadtime": 0
                    },
                    "SysEventService": {
                        "loadtime": 0
                    }
                },
                "pipelines": {                  # 流水線配置列表
                    "SysEventPipeline": [       # 流水線名稱
                        "SysEventService",      # 流水線中的插件,與上面"plugins"列表中的插件名稱對(duì)應(yīng)
                        "Faultlogger",          # 流水線中插件的執(zhí)行順序按照列表中先后順序執(zhí)行
                        "EventLogger"
                    ]
                },
                "pipelinegroups": {             # 流水線組(事件源)配置列表
                    "SysEventSource": [         # 事件源名稱,與上面"plugins"列表中的插件名稱對(duì)應(yīng)
                        "SysEventPipeline"
                    ]
                },
                "threads": {                                    # 流線程配置模型列表
                    "singledthread": {                          # 獨(dú)享線程模式
                        "SysEventSource": "sysevent_source",    # 將對(duì)應(yīng)插件配置,名為"sysevent_source"的線程
                        "SysEventService": "sysevent_service",  # 獨(dú)享線程模式
                    },
                    "sharedthread": {
                        "sharedthread1": ["Faultlogger", "EventLogger"]    #當(dāng)前兩個(gè)插件共享一個(gè)名為"sharedthread1"的線程
                    }
                }
            }
        }
    ]
}

在獨(dú)立插件包的插件配置文件,由于插件實(shí)體可以不參與整體hiview的編譯,所以直接編寫(xiě)xxx_plugin_config配置文件。不編寫(xiě)plugin_build.json

plugin_config實(shí)例完整文件可以參考test/resource/base/plugin_config,文件講解如下:

plugins:7                                                       // 插件總數(shù)是七個(gè),與下面插件個(gè)數(shù)必須對(duì)應(yīng)
EventProcessorExample4[thread:t-example-2]:0 static             // 插件名稱[thread:線程名稱]:加載時(shí)間 插件模式
EventProcessorExample1[thread:t-example-4]:0 static             // 插件名稱必須是類名
EventProcessorExample2[thread:t-example-1]:0 static             // 線程名稱一樣表示這兩個(gè)插件共享線程,中括號(hào)內(nèi)為空表示不配置線程
EventProcessorExample3[thread:t-example-4]:0 static             // 加載時(shí)間,延時(shí)多長(zhǎng)時(shí)間以后加載,0為立馬加載
EventProcessorExample5[]:0 static                               // 插件加載的順序先按照加載時(shí)間順序,然后在按照當(dāng)前配置順序加載
EventSourceExample[thread:t-example-3]:0 static                 // 插件模式,static表示當(dāng)前插件實(shí)體靜態(tài)的編譯在hiview二進(jìn)制中
DynamicLoadPluginExample[thread:t-example-5]:0 dynamic          // 插件模式,dynamic表示當(dāng)前插件實(shí)體是以so的形式體現(xiàn),名稱為libDynamicLoadPluginExample.z.so
pipelines:3                                                     // 表示當(dāng)前流水線有三個(gè),與下面流水線個(gè)數(shù)必須對(duì)應(yīng)
NormalPipeline:EventProcessorExample1 EventProcessorExample2 EventProcessorExample3 EventProcessorExample4      // 流水線名稱:插件1 插件2 插件3 插件4(插件名需要與上面定義的插件對(duì)應(yīng))
ReversePipeline:EventProcessorExample4 EventProcessorExample3 EventProcessorExample2 EventProcessorExample1     // 流水線上插件的執(zhí)行順序是按照這個(gè)的先后順序
SimplePipeline:EventProcessorExample3 EventProcessorExample2                                                    // 流水線名稱注意不要跟其他包的流水線重復(fù)
pipelinegroups:1                                                    // 流水線組(事件源)列表,該表示,事件源有1個(gè)
EventSourceExample:NormalPipeline ReversePipeline SimplePipeline    // 事件源:流水線1 流水線2 流水線3 (流水線名需要與上面定義的流水線對(duì)應(yīng))
                                                                    // 事件源執(zhí)行流程,按照先后順序執(zhí)行流水線,每個(gè)流水線按其在的插件的順序執(zhí)行
                                                                    // 前一個(gè)插件流水線中所以的插件執(zhí)行完畢,才能只能下一個(gè)流水線

插件平臺(tái)提供的能力

事件

插件與插件之間,插件與平臺(tái)之間的交互均采用事件驅(qū)動(dòng)的模式,事件定義請(qǐng)參考文件base/include/event.h,這里不詳細(xì)講解。

事件預(yù)定義的若干類型,在Event::MessageType中,業(yè)務(wù)也可以在includepublic_defines.h中定義自己的事件類型。

事件訂閱

插件與插件之間,或者插件與單獨(dú)的訂閱者模塊之間,可以通過(guò)事件訂閱的方式進(jìn)行交互。

事件訂閱分為兩種:

一種是單獨(dú)的訂閱者模式EventListener,該模式可以單獨(dú)形成一個(gè)EventListener模塊專門(mén)訂閱事件、處理事件的小模塊;也可以被插件繼承用于插件監(jiān)聽(tīng)事件,當(dāng)插件選擇這種監(jiān)聽(tīng)模式將不能被動(dòng)態(tài)加載和卸載

需要繼承EventListener并且實(shí)現(xiàn)如下方法或者使用如下的接口:

class EventListener {
public:
    /* 該方法已經(jīng)棄用,為了兼容以前的代碼沒(méi)有刪除,新代碼中不需要實(shí)現(xiàn) */
    virtual bool OnOrderedEvent(const Event &msg);

    /* 該方法為接收訂閱來(lái)的外部驅(qū)動(dòng)事件,并且處理事件 */
    virtual void OnUnorderedEvent(const Event &msg) = 0;

    /* 該方法為定義當(dāng)前訂閱者的名字 */
    virtual std::string GetListenerName() = 0;

    // 以下為接口
    /* 添加需要訂閱的事件。訂閱的事件分為依靠eventName訂閱和EventIdRange(eventId范圍也可以是全范圍或者單一id)訂閱。type是事件類型 */
    void AddListenerInfo(uint32_t type, const EventListener::EventIdRange &range = EventListener::EventIdRange(0));
    void AddListenerInfo(uint32_t type, const std::set< EventListener::EventIdRange > &listenerInfo);
    void AddListenerInfo(uint32_t type, const std::string& eventName);
    void AddListenerInfo(uint32_t type, const std::set< std::string > &eventNames);

    /* 可以獲取當(dāng)前訂閱者訂閱的事件信息 */
    bool GetListenerInfo(uint32_t type, std::set< std::string > &eventNames);  
    bool GetListenerInfo(uint32_t type, std::set< EventListener::EventIdRange > &listenerInfo);
};

EventListener訂閱者實(shí)例詳見(jiàn)test/plugins/examples/event_processor_example2中的插件

另一種是在插件中動(dòng)態(tài)訂閱者,可以被動(dòng)態(tài)卸載和加載。當(dāng)插件是在代理模式的時(shí)候,訂閱的事件到來(lái)可以動(dòng)態(tài)加載起來(lái)插件進(jìn)行執(zhí)行,過(guò)一點(diǎn)時(shí)間以后動(dòng)態(tài)插件再被卸載。

插件中動(dòng)態(tài)訂閱者實(shí)例詳見(jiàn)test/plugins/examples/event_processor_example4中的插件

注意:區(qū)分兩種訂閱模式的接口,不要混合調(diào)用了,混合調(diào)用添加的訂閱事件將不會(huì)被另一種方式監(jiān)聽(tīng)到。

平臺(tái)提供的功能接口

平臺(tái)提供的功能在插件中可以通過(guò)調(diào)用GetHiviewContext()獲得平臺(tái)接口上下文。平臺(tái)提供的主要的功能接口如下:

class HiviewContext {
public:
    
    /* 將繼承了EventListener類的訂閱者,注冊(cè)到平臺(tái)中,開(kāi)啟訂閱 */
    void RegisterUnorderedEventListener(std::weak_ptr< EventListener > listener);

    /* 將作為插件中的動(dòng)態(tài)訂閱者,注冊(cè)到平臺(tái)中,開(kāi)啟訂閱。動(dòng)態(tài)插件和靜態(tài)插件只要是想通過(guò)插件內(nèi)部接口和方法定義的訂閱者都可以使用這個(gè)注冊(cè) */
    void RegisterDynamicListenerInfo(std::weak_ptr< Plugin > listener);

    /* 發(fā)送事件到訂閱者,該接口發(fā)送的事件,無(wú)論那種訂閱方式都可以按規(guī)則被訂閱到 */
     void PostUnorderedEvent(std::shared_ptr< Plugin > plugin, std::shared_ptr< Event > event);

    /* 卸載并從平臺(tái)移除插件,之后再也不能被加載起來(lái),慎用 */
    void RequestUnloadPlugin(std::shared_ptr< Plugin > caller);

    /* 獲得平臺(tái)中共享的EventLoop線程 */
    std::shared_ptr< EventLoop > GetSharedWorkLoop();

    /* 按照流水線名稱獲得流水線當(dāng)中的插件 */
    std::list< std::weak_ptr< Plugin >> GetPipelineSequenceByName(const std::string& name);

    /* 檢測(cè)平臺(tái)是否已經(jīng)全部加載完畢,返回true是全部初始化和加載完畢,返回false就是平臺(tái)沒(méi)有初始化和加載完成 */
    bool IsReady();

    /* 按照key值獲得平臺(tái)參數(shù) */
    std::string GetHiviewProperty(const std::string& key, const std::string& defaultValue);

    /* 可以向平臺(tái)中設(shè)置平臺(tái)參數(shù) key-value形式 */
    bool SetHiviewProperty(const std::string& key, const std::string& value, bool forceUpdate);

    /* 向平臺(tái)的特定流水線中添加特定插件 */
    void AppendPluginToPipeline(const std::string& pluginName, const std::string& pipelineName);

    /* 通過(guò)插件名稱獲取插件或者插件的代理 */
    std::shared_ptr< Plugin > GetPluginByName(const std::string& name);
};

實(shí)例解析

這里以test/plugins/examples/event_source_example事件源為例講解其注冊(cè)、流轉(zhuǎn)、監(jiān)控等機(jī)制。

//event_source_example.h
// 該類繼承FileDescriptorEventCallback,可以監(jiān)聽(tīng)文件夾文件的變化,使用該類方法必須配置線程
class EventSourceExample : public FileDescriptorEventCallback, public EventSource {
public:
    EventSourceExample();
    ~EventSourceExample();

    /* 為了記錄當(dāng)前全局的插件構(gòu)造和析構(gòu)的數(shù)據(jù)結(jié)構(gòu) */
    static std::set< std::string > count;

    /* 重載事件源相關(guān)的虛方法,詳情參考[事件源的定義]一節(jié) */
    void OnLoad() override;
    void OnUnload() override;
    void Recycle(PipelineEvent* event) override;
    void PauseDispatch(std::weak_ptr< Plugin > plugin) override;
    void StartEventSource() override
    {
        /* 添加文件監(jiān)聽(tīng)到eventLoop線程 */
        GetWorkLoop()- >AddFileDescriptorEventCallback("Example",
            std::static_pointer_cast< EventSourceExample >(shared_from_this()));
    }
    

    /* 監(jiān)聽(tīng)的文件夾文件發(fā)生變化的回調(diào) */
    bool OnFileDescriptorEvent(int fd, int type) override;

    /* 初始化需要監(jiān)聽(tīng)的文件夾文件 */
    int32_t GetPollFd() override;

    /* 返回Poll類型 */
    int32_t GetPollType() override;

    const static inline int PIPELINE_EVENT_ID_AAA = 901000000;
    const static inline int PIPELINE_EVENT_ID_BBB = 901000001;
    const static inline int PIPELINE_EVENT_ID_CCC = 901000002;
    const static inline int PIPELINE_EVENT_ID_TAA = 901000010;

private:
    /* 文件創(chuàng)建方法 */
    void CreateWatchFile(const std::string& path);

    /* 創(chuàng)建事件方法 */
    void CreateAndPublishEvent(const std::string& file);

    const static inline std::string SYSTEM_FAULT_LOG_PATH = "/data/test/faultlog";
    int inotifyFd_;
    std::map< std::string, int > fileMap_;
};

鴻蒙OpenHarmony知識(shí)已更新 ←前往

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2634

    瀏覽量

    66153
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2302

    瀏覽量

    42689
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1966

    瀏覽量

    29962
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3635

    瀏覽量

    16061
  • 鴻蒙星河
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    30
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    免費(fèi)學(xué)習(xí)鴻蒙(HarmonyOS)開(kāi)發(fā),一些地址分享

    國(guó)內(nèi)一流高校。通過(guò)鴻蒙班的設(shè)立,高??梢詾閷W(xué)生提供專業(yè)的鴻蒙OS學(xué)習(xí)環(huán)境和豐富的實(shí)踐機(jī)會(huì),培養(yǎng)出更多的鴻蒙開(kāi)發(fā)人才,為
    發(fā)表于 01-12 20:48

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開(kāi)發(fā):【短信服務(wù)】

    的道路上更進(jìn)一步。 《鴻蒙 (OpenHarmony)開(kāi)發(fā)學(xué)習(xí)視頻》 ? 《鴻蒙生態(tài)應(yīng)用開(kāi)發(fā)V2.0白皮書(shū)》 《
    發(fā)表于 03-03 21:29

    鴻蒙開(kāi)發(fā)就業(yè)前景到底怎么樣?

    鴻蒙, 作為華為自主研發(fā)的基于微內(nèi)核的下一代操作系統(tǒng),正在逐漸走進(jìn)人們的視野 。隨著鴻蒙系統(tǒng)的不斷發(fā)展和完善,越來(lái)越多的人開(kāi)始關(guān)注鴻蒙開(kāi)發(fā)這一領(lǐng)域,想要了解
    發(fā)表于 05-09 17:37

    鴻蒙Flutter實(shí)戰(zhàn):05-使用第三方插件

    # 鴻蒙Flutter 實(shí)戰(zhàn):使用第三方插件鴻蒙Flutter開(kāi)發(fā)中,如果涉及到使用原生功能,就要使用
    發(fā)表于 10-22 21:54

    鴻蒙Flutter實(shí)戰(zhàn):06-使用ArkTs開(kāi)發(fā)Flutter鴻蒙插件

    # 使用 ArkTs 開(kāi)發(fā) Flutter 鴻蒙平臺(tái)插件 本文講述如何開(kāi)發(fā)一個(gè) Flutter 鴻蒙
    發(fā)表于 10-22 21:56

    鴻蒙Flutter實(shí)戰(zhàn):07混合開(kāi)發(fā)

    # 鴻蒙Flutter實(shí)戰(zhàn):混合開(kāi)發(fā) 鴻蒙Flutter混合開(kāi)發(fā)主要有兩種形式。 ## 1.基于har 將flutter module
    發(fā)表于 10-23 16:00

    鴻蒙應(yīng)用開(kāi)發(fā)基礎(chǔ)術(shù)語(yǔ)學(xué)習(xí) 輕應(yīng)用

    開(kāi)發(fā)者可以通過(guò)鴻蒙輕應(yīng)用,通過(guò)點(diǎn)擊關(guān)鍵詞解鎖詳細(xì)解釋的方式,方便快速第了解鴻蒙的基礎(chǔ)術(shù)語(yǔ)??梢元?dú)立作為一個(gè)應(yīng)用發(fā)展,也可以作為各種應(yīng)用中的一個(gè)模塊。適合HarmonyOS開(kāi)發(fā)者及潛在
    發(fā)表于 05-19 18:33

    HIVIEW海思開(kāi)發(fā)板-單linux系統(tǒng)

    HIVIEW開(kāi)發(fā)HIVIEW是個(gè)小而專業(yè)的設(shè)計(jì)公司(海思軟/硬件設(shè)計(jì)能力13年以上)我們的目標(biāo) **以開(kāi)放的軟/硬件助力客戶自研定制化產(chǎn)品**HIVIEW現(xiàn)階段成果正在銷售的產(chǎn)品
    發(fā)表于 07-06 14:57

    LabVIEW入門(mén)與實(shí)戰(zhàn)開(kāi)發(fā)100例

    LabVIEW入門(mén)與實(shí)戰(zhàn)開(kāi)發(fā)100例LabVIEW入門(mén)與實(shí)戰(zhàn)開(kāi)發(fā)100例LabVIEW入門(mén)與實(shí)戰(zhàn)開(kāi)發(fā)
    發(fā)表于 02-18 11:44 ?0次下載

    要成為鴻蒙開(kāi)發(fā)者,應(yīng)該學(xué)習(xí)哪些編程語(yǔ)言

    據(jù)了解,鴻蒙系統(tǒng)是基于Linux開(kāi)發(fā)的,源碼是C語(yǔ)言。那么,作為一名開(kāi)發(fā)者,如何幫助鴻蒙系統(tǒng)構(gòu)建生態(tài)呢?在以往安卓、蘋(píng)果系統(tǒng)構(gòu)建過(guò)程,有哪些可以值得借鑒的地方呢?要成為
    的頭像 發(fā)表于 09-24 12:06 ?1.3w次閱讀

    《labview入門(mén)與實(shí)戰(zhàn)開(kāi)發(fā)》經(jīng)典案例

    labview入門(mén)與實(shí)戰(zhàn)開(kāi)發(fā)案例100例書(shū)中的案例資料供大家學(xué)習(xí)
    發(fā)表于 01-11 18:10 ?176次下載

    華為開(kāi)發(fā)者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)

    HDC 2021華為開(kāi)發(fā)者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)
    的頭像 發(fā)表于 10-23 16:40 ?1775次閱讀
    華為<b class='flag-5'>開(kāi)發(fā)</b>者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>鴻蒙</b>智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)

    插件開(kāi)發(fā)之VSCode

    開(kāi)發(fā)。這篇文章,**強(qiáng)烈推薦大家轉(zhuǎn)發(fā)學(xué)習(xí)哦!**謝謝!因?yàn)槲矣X(jué)得任何開(kāi)發(fā)人員都應(yīng)該或多或少的掌握一些插件開(kāi)發(fā)知識(shí),當(dāng)然更多的是因?yàn)槲矣X(jué)得這篇
    發(fā)表于 11-21 18:36 ?11次下載
    <b class='flag-5'>插件</b><b class='flag-5'>開(kāi)發(fā)</b>之VSCode

    arduino開(kāi)發(fā)實(shí)戰(zhàn)指南

    arduino開(kāi)發(fā)實(shí)戰(zhàn)指南
    發(fā)表于 02-22 14:56 ?0次下載

    Python項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)

    Python項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)
    發(fā)表于 06-13 14:51 ?2次下載