diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/README_zh.md b/PerformanceAnalysisKit/HiAppEvent/EventSub/README_zh.md index af5c022f9681c0c201a135ebe2adaff284b7bd2a..e6383ecc039b4a4805bc5016af234e39ba908214 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/README_zh.md +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/README_zh.md @@ -2,13 +2,17 @@ ### 介绍 -本示例主要展示了使用HiAppEvent提供的事件订阅接口,获取本地应用事件(AppEvent),系统崩溃事件(CrashEvent),系统卡死事件(FreezeEvent),系统资源泄漏事件(PssLeakEvent),系统踩内存事件(ASANEvent)以及主线程超时事件(TimeOutEvent)。 +本示例主要展示用HiAppEvent如何实现事件订阅(AppEvent),并列举了订阅如下系统事件的例子: + +崩溃事件(CrashEvent)、系统卡死事件(FreezeEvent)、系统资源泄漏事件(PssLeakEvent)、系统踩内存事件(ASANEvent)以及主线程超时事件 + +(TimeOutEvent)。 该工程中的展示的代码详细描述可查如下链接: -- [订阅应用事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-app-events-arkts.md) +- [事件订阅(ArkTS)](https://gitcode.com/openharmony/docs/blob/master/zh-cn/application-dev/dfx/hiappevent-watcher-app-events-arkts.md) -- [订阅应用事件(C/C++)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-app-events-ndk.md) +- [事件订阅(C/C++)](https://gitcode.com/openharmony/docs/blob/master/zh-cn/application-dev/dfx/hiappevent-watcher-app-events-ndk.md) - [订阅崩溃事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-crash-events-arkts.md) @@ -34,83 +38,105 @@ | 主页 | | :----------------------------------------------------------: | -| z | +| z | #### 使用说明 -请先按照工程目录添加json相关文件,否则编译无法通过 +请先按照工程目录添加三方库文件jsoncpp相关文件,否则编译无法通过;jsoncpp官方下载地址为https://github.com/open-source-parsers/jsoncpp,下载完成后在文件夹内运行python脚本“amalgamate.py”(需要有python环境),脚本运行完成后将生成名为“dist”的文件夹,打开后即可得到jsoncpp.cpp,json.h和json-forward.h三个文件。 -##### 1.订阅应用事件(ArkTS)使用说明 +##### 1.事件订阅(ArkTS&C++)使用说明:订阅崩溃(APP_CRASH)事件 -1.在应用侧主界面,点击"writeEvent ArkTS"按钮,从ets层触发一次按钮点击事件打点; +1.在应用侧主界面,点击"WatchAppCrash ArkTS&C++"按钮,触发一次崩溃(APP_CRASH)事件; -2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"testTag"。此时窗口仅显示符合条件的日志,打印日志结果为: +2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"AppEvent HiAppEvent"。此时窗口仅显示符合条件的日志,打印日志结果为: +```text +AppEvent HiAppEvent succeed to read events with onReceive callback form C API // C++读事件成功 +AppEvent HiAppEvent eventInfo.domain=OS +AppEvent HiAppEvent eventInfo.name=APP_CRASH +AppEvent HiAppEvent eventInfo.eventType=1 +AppEvent HiAppEvent eventInfo.params.time=1503513021502 +AppEvent HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub +AppEvent HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1503513021744_16523.log"] +AppEvent HiAppEvent succeed to read event with onReceive callback from ArkTS // ArkTS读事件成功 +AppEvent HiAppEvent eventName=APP_CRASH +AppEvent HiAppEvent eventInfo.params.time=1503513021502 +AppEvent HiAppEvent eventInfo.params.bundle_name="com.samples.eventsub" +AppEvent HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1503513021744_16523.log"] ``` -HiAppEvent eventInfo.WatcherType=OnReceive -HiAppEvent eventInfo.domain=button -HiAppEvent eventInfo.name=click -HiAppEvent eventInfo.eventType=4 -readEvent C++ Success // C++读事件成功 -HiAppEvent eventInfo.params.click_time=100 -HiAppEvent eventInfo.WatcherType=OnTrigger -HiAppEvent eventInfo.domain=button -HiAppEvent eventInfo.name=click -HiAppEvent eventInfo.eventType=4 -HiAppEvent eventInfo.params.click_time=100 -writeEvent ArkTS success // ArkTS写事件成功 -HiAppEvent onTrigger: curRow=1, curSize=124 -readEvent ArkTS Success // ArkTS读事件成功 -HiAppEvent eventPkg.packageId=0 -HiAppEvent eventPkg.row=1 -HiAppEvent eventPkg.size=124 -HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1501889519611,"tz_":"+0800","pid_":2579,"tid_":2579,"click_time":100 + +注意: + +1.EntryAbility.ets的onCreate()方法中同时注册了崩溃事件的ArkTS观察者和C++观察者,故读取时均能读到,不影响结果。 + +2.C++读事件比ArkTS写事件先出现的原因可能是C++层的日志打印执行速度更快,不影响结果。 + +##### 2.事件订阅(ArkTS)使用说明:订阅按钮点击(click)事件 + +1.在应用侧主界面,点击"writeEvent ArkTS"按钮,从ets层触发一次按钮点击事件打点; + +2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"AppEvent HiAppEvent"。此时窗口仅显示符合条件的日志,打印日志结果为: + +```text +AppEvent HiAppEvent succeed to read events with onTrigger callback form C API +AppEvent HiAppEvent eventInfo={"domain_":"button","name_":"click","type_":4,"time_":1503514787492,"tz_":"","pid_":18178,"tid_":18178,"clickTime":100} +AppEvent HiAppEvent eventInfo.domain=button +AppEvent HiAppEvent eventInfo.name=click +AppEvent HiAppEvent eventInfo.eventType=4 +AppEvent HiAppEvent eventInfo.params.clickTime=100 +AppEvent HiAppEvent succeed to read event with onTrigger callback from ArkTS. +AppEvent HiAppEvent onTrigger: curRow=1, curSize=120 +AppEvent HiAppEvent eventPkg.packageId=0 +AppEvent HiAppEvent eventPkg.row=1 +AppEvent HiAppEvent eventPkg.size=120 +AppEvent HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1503514787492,"tz_":"","pid_":18178,"tid_":18178,"clickTime":100} +AppEvents writeEvent ArkTS success ``` 注意: -1.出现C++读事件成功的原因是本示例中ArkTS和C++写的打点事件是相同的,故读取时均能读到,不影响结果。 +1.EntryAbility.ets的onCreate()方法中同时注册了按钮点击事件的ArkTS观察者和C++观察者,故读取时均能读到,不影响结果。 2.C++读事件比ArkTS写事件先出现的原因可能是C++层的日志打印执行速度更快,不影响结果。 -##### 2.订阅应用事件(C/C++)使用说明 +##### 3.事件订阅(C/C++)使用说明:订阅按钮点击(click)事件 1.在应用侧主界面,点击"writeEvent C++"按钮,从c++层触发一次按钮点击事件打点; -2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"testTag"。此时窗口仅显示符合条件的日志,打印日志结果为: - -``` -writeEvent C++ success // C++写事件成功 -HiAppEvent eventInfo.WatcherType=OnReceive -HiAppEvent eventInfo.domain=button -HiAppEvent eventInfo.name=click -HiAppEvent eventInfo.eventType=4 -readEvent C++ Success // C++读事件成功 -HiAppEvent eventInfo.params.click_time=1501890218 -HiAppEvent eventInfo.WatcherType=OnTrigger -HiAppEvent eventInfo.domain=button -HiAppEvent eventInfo.name=click -HiAppEvent eventInfo.eventType=4 -HiAppEvent eventInfo.params.click_time=1501890218 -HiAppEvent onTrigger: curRow=1, curSize=131 -readEvent ArkTS Success // ArkTS读事件成功 -HiAppEvent eventPkg.packageId=2 -HiAppEvent eventPkg.row=1 -HiAppEvent eventPkg.size=131 -HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1501890218641,"tz_":"+0800","pid_":2579,"tid_":2579,"click_time":1501890218} +2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"AppEvent HiAppEvent"。此时窗口仅显示符合条件的日志,打印日志结果为: + +```text +AppEvent HiAppEvent succeed to read events with onTrigger callback form C API +AppEvent HiAppEvent eventInfo={"domain_":"button","name_":"click","type_":4,"time_":1503515278195,"tz_":"","pid_":18178,"tid_":18178,"clickTime":1503515278} +AppEvent HiAppEvent eventInfo.domain=button +AppEvent HiAppEvent eventInfo.name=click +AppEvent HiAppEvent eventInfo.eventType=4 +AppEvent HiAppEvent eventInfo.params.clickTime=1503515278 +AppEvent HiAppEvent succeed to read event with onTrigger callback from ArkTS. +AppEvent HiAppEvent onTrigger: curRow=1, curSize=127 +AppEvent HiAppEvent eventPkg.packageId=1 +AppEvent HiAppEvent eventPkg.row=1 +AppEvent HiAppEvent eventPkg.size=127 +AppEvent HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1503515278195,"tz_":"","pid_":18178,"tid_":18178,"clickTime":1503515278} ``` 注意: -1.出现ArkTS读事件成功的原因是本示例中ArkTS和C++写、读的打点事件是相同的,故读取时均能读到,不影响结果。 +1.EntryAbility.ets的onCreate()方法中同时注册了按钮点击事件的ArkTS观察者和C++观察者,故读取时均能读到,不影响结果。 + +2.为了区分ArkTS、C++中设置的自定义打点参数clickTime,点击"writeEvent C++"按钮,配置的clickTime是一个时间戳,而点击"writeEvent ArkTS"按钮,配置的 -##### 3.订阅崩溃事件(ArkTS&C++) +clickTime是整数100。 + +3.C++读事件比ArkTS写事件先出现的原因可能是C++层的日志打印执行速度更快,不影响结果。 + +##### 4.订阅崩溃事件(ArkTS&C++) 1.在应用侧主界面,点击"appCrash ArkTS&C++"按钮触发崩溃,应用退出后重启应用; 2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: -``` +```text HiAppEvent eventInfo.WatcherType=OnTrigger HiAppEvent eventInfo.domain=OS HiAppEvent eventInfo.name=APP_CRASH @@ -172,13 +198,13 @@ HiAppEvent eventInfo.params.test_data=100 2.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 -##### 4.订阅卡死事件(ArkTS&C++) +##### 5.订阅卡死事件(ArkTS&C++) 1.在应用侧主界面,点击"appFreeze ArkTS&C++"按钮触发卡死(可能需要几秒),应用退出后重启应用; 2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: -``` +```text HiAppEvent eventInfo.WatcherType=OnReceive HiAppEvent eventInfo.domain=OS HiAppEvent eventInfo.name=APP_FREEZE @@ -260,7 +286,7 @@ HiAppEvent eventInfo.params.test_data=100 3.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 -##### 5.订阅资源泄漏事件(ArkTS&C++) +##### 6.订阅资源泄漏事件(ArkTS&C++) 1.先在设备“开发者选项”中打开“系统资源泄漏日志”,并重启设备; @@ -268,7 +294,7 @@ HiAppEvent eventInfo.params.test_data=100 3.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: -``` +```text HiAppEvent eventInfo.WatcherType=OnReceive HiAppEvent eventInfo.domain=OS HiAppEvent eventInfo.name=RESOURCE_OVERLIMIT @@ -311,7 +337,7 @@ HiAppEvent eventInfo={"domain":"OS","name":"RESOURCE_OVERLIMIT","eventType":1,"p 3.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 -##### 6.订阅踩内存事件(ArkTS&C++) +##### 7.订阅踩内存事件(ArkTS&C++) 1.点击DevEco Studio界面中的“entry”,点击“Edit Configurations”,点击“Diagnostics”,勾选“Address Sanitizer”,保存设置。 @@ -319,7 +345,7 @@ HiAppEvent eventInfo={"domain":"OS","name":"RESOURCE_OVERLIMIT","eventType":1,"p 3.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: -``` +```text HiAppEvent eventInfo.WatcherType=OnTrigger HiAppEvent eventInfo.domain=OS HiAppEvent eventInfo.name=ADDRESS_SANITIZER @@ -372,7 +398,7 @@ HiAppEvent eventInfo.params.log_over_limit=0 3.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 -##### 7.订阅主线程超时事件(ArkTS&C++) +##### 8.订阅主线程超时事件(ArkTS&C++) 1.测试设备应能使用开发者使用nolog版本,开发者模式处于关闭状态,可以使能主线程超时检测抓取trace的功能,建议使用真机测试; @@ -380,7 +406,7 @@ HiAppEvent eventInfo.params.log_over_limit=0 3.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: -``` +```text HiAppEvent eventInfo.WatcherType=OnReceive HiAppEvent eventInfo.domain=OS HiAppEvent eventInfo.name=MAIN_THREAD_JANK @@ -420,7 +446,7 @@ HiAppEvent eventInfo.params.log_over_limit=0 ### 工程目录 -``` +```text entry/src/main ├─cpp │ ├─json @@ -466,10 +492,10 @@ entry/src/main 如需单独下载本工程,执行如下命令: -``` +```text git init git config core.sparsecheckout true echo code/DocsSample/PerformanceAnalysisKit/HiAppEvent/EventSub/ > .git/info/sparse-checkout -git remote add origin https://gitee.com/openharmony/applications_app_samples.git +git remote add origin https://gitcode.com/openharmony/applications_app_samples.git git pull origin master -``` \ No newline at end of file +``` diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/napi_init.cpp b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/napi_init.cpp index 1d5060000c0cdea73402017d753afa7ff84ed0da..e525f468ff2a39836e302a46debc2a2db111de58 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/napi_init.cpp +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/napi_init.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ +// [Start EventSub_napi_Header] #include "napi/native_api.h" #include "json/json.h" #include "hilog/log.h" @@ -21,25 +22,17 @@ #undef LOG_TAG #define LOG_TAG "testTag" +// [End EventSub_napi_Header] // 定义一变量,用来缓存创建的观察者的指针。 +// [Start EventSub_onReceive_ptr] static HiAppEvent_Watcher *eventWatcherR; +// [End EventSub_onReceive_ptr] +// [Start EventSub_onTrigger_ptr] static HiAppEvent_Watcher *eventWatcherT; +// [End EventSub_onTrigger_ptr] -static void OnReceiveDottingEvent(const struct HiAppEvent_AppEventGroup *appEventGroups, int i, int j) -{ - if (strcmp(appEventGroups[i].appEventInfos[j].domain, "button") == 0 && - strcmp(appEventGroups[i].appEventInfos[j].name, "click") == 0) { - Json::Value params; - Json::Reader reader(Json::Features::strictMode()); - if (reader.parse(appEventGroups[i].appEventInfos[j].params, params)) { - auto time = params["click_time"].asInt64(); - OH_LOG_INFO(LogType::LOG_APP, "readEvent C++ Success"); - OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.params.click_time=%{public}lld", time); - } - } -} - +// [Start CrashEvent_OnReceive] static void OnReceiveCrashEvent(const struct HiAppEvent_AppEventGroup *appEventGroups, int i, int j) { if (strcmp(appEventGroups[i].appEventInfos[j].domain, DOMAIN_OS) == 0 && @@ -81,6 +74,8 @@ static void OnReceiveCrashEvent(const struct HiAppEvent_AppEventGroup *appEventG } } } +// [End CrashEvent_OnReceive] +// [Start FreezeEvent_OnReceive_Output] // OnReceiveFreezeEvent超出50行限制,将日志输出单独抽出 static void FreezeEventOutput(Json::Value params, Json::FastWriter writer) { @@ -131,7 +126,8 @@ static void FreezeEventOutput(Json::Value params, Json::FastWriter writer) OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.params.log_over_limit=%{public}d", logOverLimit); } - +// [End FreezeEvent_OnReceive_Output] +// [Start FreezeEvent_OnReceive] static void OnReceiveFreezeEvent(const struct HiAppEvent_AppEventGroup *appEventGroups, int i, int j) { if (strcmp(appEventGroups[i].appEventInfos[j].domain, DOMAIN_OS) == 0 && @@ -144,7 +140,8 @@ static void OnReceiveFreezeEvent(const struct HiAppEvent_AppEventGroup *appEvent } } } - +// [End FreezeEvent_OnReceive] +// [Start PssLeakEvent_OnReceive] static void OnReceivePssLeakEvent(const struct HiAppEvent_AppEventGroup *appEventGroups, int i, int j) { if (strcmp(appEventGroups[i].appEventInfos[j].domain, DOMAIN_OS) == 0 && @@ -179,7 +176,8 @@ static void OnReceivePssLeakEvent(const struct HiAppEvent_AppEventGroup *appEven } } } - +// [End PssLeakEvent_OnReceive] +// [Start AsanEvent_OnReceive] static void OnReceiveAsanEvent(const struct HiAppEvent_AppEventGroup *appEventGroups, int i, int j) { if (strcmp(appEventGroups[i].appEventInfos[j].domain, DOMAIN_OS) == 0 && @@ -212,7 +210,8 @@ static void OnReceiveAsanEvent(const struct HiAppEvent_AppEventGroup *appEventGr } } } - +// [End AsanEvent_OnReceive] +// [Start TimeOutEvent_OnReceive] static void OnReceiveTimeOutEvent(const struct HiAppEvent_AppEventGroup *appEventGroups, int i, int j) { if (strcmp(appEventGroups[i].appEventInfos[j].domain, DOMAIN_OS) == 0 && @@ -246,7 +245,112 @@ static void OnReceiveTimeOutEvent(const struct HiAppEvent_AppEventGroup *appEven } } } +// [End TimeOutEvent_OnReceive] +// [Start AppEvent_Crash_C++_Add_Watcher] +// 定义变量,用来缓存创建的观察者的指针。 +static HiAppEvent_Watcher *eventWatcherR1; +static void OnReceive1(const char *domain, const struct HiAppEvent_AppEventGroup *appEventGroups, uint32_t groupLen) +{ + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent success to read events with onReceive callback form C API \n"); + for (int i = 0; i < groupLen; ++i) { + for (int j = 0; j < appEventGroups[i].infoLen; ++j) { + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.domain=%{public}s", + appEventGroups[i].appEventInfos[j].domain); + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.name=%{public}s", + appEventGroups[i].appEventInfos[j].name); + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.eventType=%{public}d", + appEventGroups[i].appEventInfos[j].type); + if (strcmp(appEventGroups[i].appEventInfos[j].domain, DOMAIN_OS) != 0 || + strcmp(appEventGroups[i].appEventInfos[j].name, EVENT_APP_CRASH) != 0) { + continue; + } + Json::Value params; + Json::Reader reader(Json::Features::strictMode()); + Json::FastWriter writer; + if (reader.parse(appEventGroups[i].appEventInfos[j].params, params)) { + // 开发者可以获取到崩溃事件发生的时间戳 + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.params.time=%{public}lld", + params["time"].asInt64()); + // 开发者可以获取到崩溃应用的包名 + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.params.bundle_name=%{public}s", + params["bundle_name"].asString().c_str()); + auto external_log = writer.write(params["external_log"]); + // 开发者可以获取到崩溃事件发生时的故障日志文件 + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.params.external_log=%{public}s", + external_log.c_str()); + } + } + } +} +static napi_value RegisterWatcherCrash(napi_env env, napi_callback_info info) +{ + // 开发者自定义观察者名称,系统根据不同的名称来识别不同的观察者。 + eventWatcherR1 = OH_HiAppEvent_CreateWatcher("AppCrashWatcher1"); + // 设置订阅的事件名称为EVENT_APP_CRASH,即崩溃事件。 + const char *names[] = {EVENT_APP_CRASH}; + // 开发者订阅感兴趣的事件,此处订阅了系统事件。 + OH_HiAppEvent_SetAppEventFilter(eventWatcherR1, DOMAIN_OS, 0, names, 1); + // 开发者设置已实现的回调函数,观察者接收到事件后回立即触发OnReceive1回调。 + OH_HiAppEvent_SetWatcherOnReceive(eventWatcherR1, OnReceive1); + // 使观察者开始监听订阅的事件。 + OH_HiAppEvent_AddWatcher(eventWatcherR1); + return {}; +} +// [End AppEvent_Crash_C++_Add_Watcher] +// [Start AppEvent_Click_C++_Add_Watcher] +// 定义变量,用来缓存创建的观察者的指针。 +static HiAppEvent_Watcher *eventWatcherT1; +// 开发者可以自行实现获取已监听到事件的回调函数,其中events指针指向内容仅在该函数内有效。 +static void OnTake1(const char *const *events, uint32_t eventLen) +{ + Json::Reader reader(Json::Features::strictMode()); + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent success to read events with onTrigger callback form C API \n"); + for (int i = 0; i < eventLen; ++i) { + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo=%{public}s", events[i]); + Json::Value eventInfo; + if (reader.parse(events[i], eventInfo)) { + auto domain = eventInfo["domain_"].asString(); + auto name = eventInfo["name_"].asString(); + auto type = eventInfo["type_"].asInt(); + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.domain=%{public}s", domain.c_str()); + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.name=%{public}s", name.c_str()); + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.eventType=%{public}d", type); + if (domain == "button" && name == "click") { + auto clickTime = eventInfo["clickTime"].asInt64(); + OH_LOG_INFO(LogType::LOG_APP, "AppEvents HiAppEvent eventInfo.params.clickTime=%{public}lld", + clickTime); + } + } + } +} + +// 开发者可以自行实现订阅回调函数,以便对获取到的事件打点数据进行自定义处理。 +static void OnTrigger1(int row, int size) +{ + // 接收回调后,获取指定数量的已接收事件。 + OH_HiAppEvent_TakeWatcherData(eventWatcherT1, row, OnTake1); +} + +static napi_value RegisterWatcherClick(napi_env env, napi_callback_info info) +{ + // 开发者自定义观察者名称,系统根据不同的名称来识别不同的观察者。 + eventWatcherT1 = OH_HiAppEvent_CreateWatcher("ButtonClickWatcher1"); + // 设置订阅的事件名称为click。 + const char *names[] = {"click"}; + // 开发者订阅感兴趣的应用事件,此处订阅了button相关事件。 + OH_HiAppEvent_SetAppEventFilter(eventWatcherT1, "button", 0, names, 1); + // 开发者设置已实现的回调函数,需OH_HiAppEvent_SetTriggerCondition设置的条件满足方可触发。 + OH_HiAppEvent_SetWatcherOnTrigger(eventWatcherT1, OnTrigger1); + // 开发者可以设置订阅触发回调的条件,此处是设置新增事件打点数量为1个时,触发onTrigger回调。 + OH_HiAppEvent_SetTriggerCondition(eventWatcherT1, 1, 0, 0); + // 使观察者开始监听订阅的事件。 + OH_HiAppEvent_AddWatcher(eventWatcherT1); + return {}; +} +// [End AppEvent_Click_C++_Add_Watcher] + +// [Start EventSub_OnReceive_All] static void OnReceive(const char *domain, const struct HiAppEvent_AppEventGroup *appEventGroups, uint32_t groupLen) { for (int i = 0; i < groupLen; ++i) { @@ -258,8 +362,7 @@ static void OnReceive(const char *domain, const struct HiAppEvent_AppEventGroup appEventGroups[i].appEventInfos[j].name); OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.eventType=%{public}d", appEventGroups[i].appEventInfos[j].type); - // 处理打点事件 - OnReceiveDottingEvent(appEventGroups, i, j); + // 处理崩溃事件 OnReceiveCrashEvent(appEventGroups, i, j); // 处理卡死事件 @@ -273,15 +376,9 @@ static void OnReceive(const char *domain, const struct HiAppEvent_AppEventGroup } } } +// [End EventSub_OnReceive_All] -static void OnTriggerDottingEvent(std::string domain, std::string name, Json::Value eventInfo) -{ - if (domain == "button" && name == "click") { - auto clickTime = eventInfo["click_time"].asInt64(); - OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.params.click_time=%{public}lld", clickTime); - } -} - +// [Start CrashEvent_OnTrigger] static void OnTriggerCrashEvent(std::string domain, std::string name, Json::Value eventInfo, Json::FastWriter writer) { if (domain == DOMAIN_OS && name == EVENT_APP_CRASH) { @@ -313,7 +410,8 @@ static void OnTriggerCrashEvent(std::string domain, std::string name, Json::Valu OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.params.log_over_limit=%{public}d", logOverLimit); } } - +// [End CrashEvent_OnTrigger] +// [Start FreezeEvent_OnTrigger] static void OnTriggerFreezeEvent(std::string domain, std::string name, Json::Value eventInfo, Json::FastWriter writer) { if (domain == DOMAIN_OS && name == EVENT_APP_FREEZE) { @@ -360,7 +458,8 @@ static void OnTriggerFreezeEvent(std::string domain, std::string name, Json::Val OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.params.log_over_limit=%{public}d", logOverLimit); } } - +// [End FreezeEvent_OnTrigger] +// [Start PssLeakEvent_OnTrigger] static void OnTriggerPssLeakEvent(std::string domain, std::string name, Json::Value eventInfo, Json::FastWriter writer) { if (domain == DOMAIN_OS && name == EVENT_RESOURCE_OVERLIMIT) { @@ -388,7 +487,8 @@ static void OnTriggerPssLeakEvent(std::string domain, std::string name, Json::Va logOverLimit.c_str()); } } - +// [End PssLeakEvent_OnTrigger] +// [Start AsanEvent_OnTrigger] static void OnTriggerAsanEvent(std::string domain, std::string name, Json::Value eventInfo, Json::FastWriter writer) { if (domain == DOMAIN_OS && name == EVENT_ADDRESS_SANITIZER) { @@ -413,7 +513,8 @@ static void OnTriggerAsanEvent(std::string domain, std::string name, Json::Value logOverLimit.c_str()); } } - +// [End AsanEvent_OnTrigger] +// [Start EventSub_OnTake_All] // 开发者可以自行实现获取已监听到事件的回调函数,其中events指针指向内容仅在该函数内有效。 static void OnTake(const char *const *events, uint32_t eventLen) { @@ -429,8 +530,7 @@ static void OnTake(const char *const *events, uint32_t eventLen) OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.domain=%{public}s", domain.c_str()); OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.name=%{public}s", name.c_str()); OH_LOG_INFO(LogType::LOG_APP, "HiAppEvent eventInfo.eventType=%{public}d", type); - // 处理打点事件 - OnTriggerDottingEvent(domain, name, eventInfo); + // 处理崩溃事件 OnTriggerCrashEvent(domain, name, eventInfo, writer); // 处理卡死事件 @@ -442,14 +542,16 @@ static void OnTake(const char *const *events, uint32_t eventLen) } } } - +// [End EventSub_OnTake_All] +// [Start EventSub_OnTrigger] // 开发者可以自行实现订阅回调函数,以便对获取到的事件打点数据进行自定义处理。 static void OnTrigger(int row, int size) { // 接收回调后,获取指定数量的已接收事件。 OH_HiAppEvent_TakeWatcherData(eventWatcherT, row, OnTake); } - +// [End EventSub_OnTrigger] +// [Start EventSub_RegisterWatcher_All] static napi_value RegisterWatcher(napi_env env, napi_callback_info info) { // 开发者自定义观察者名称,系统根据不同的名称来识别不同的观察者。 @@ -477,35 +579,53 @@ static napi_value RegisterWatcher(napi_env env, napi_callback_info info) OH_HiAppEvent_AddWatcher(eventWatcherR); return {}; } - +// [End EventSub_RegisterWatcher_All] +// [Start EventSub_RemoveWatcher_All] +// [Start AppEvent_C++_RemoveWatcher] static napi_value RemoveWatcher(napi_env env, napi_callback_info info) { // 使观察者停止监听事件 + // [StartExclude AppEvent_C++_RemoveWatcher] OH_HiAppEvent_RemoveWatcher(eventWatcherT); OH_HiAppEvent_RemoveWatcher(eventWatcherR); + // [EndExclude AppEvent_C++_RemoveWatcher] + OH_HiAppEvent_RemoveWatcher(eventWatcherT1); + OH_HiAppEvent_RemoveWatcher(eventWatcherR1); return {}; } - +// [End AppEvent_C++_RemoveWatcher] +// [End EventSub_RemoveWatcher_All] +// [Start EventSub_DestroyWatcher_All] +// [Start AppEvent_C++_DestroyWatcher] static napi_value DestroyWatcher(napi_env env, napi_callback_info info) { - // 销毁创建的观察者,并置appEventWatcher为nullptr。 + // 销毁创建的观察者,并置eventWatcher为nullptr。 + // [StartExclude AppEvent_C++_DestroyWatcher] OH_HiAppEvent_DestroyWatcher(eventWatcherT); OH_HiAppEvent_DestroyWatcher(eventWatcherR); eventWatcherT = nullptr; eventWatcherR = nullptr; + // [EndExclude AppEvent_C++_DestroyWatcher] + OH_HiAppEvent_DestroyWatcher(eventWatcherT1); + OH_HiAppEvent_DestroyWatcher(eventWatcherR1); + eventWatcherT1 = nullptr; + eventWatcherR1 = nullptr; return {}; } - +// [End AppEvent_C++_DestroyWatcher] +// [End EventSub_DestroyWatcher_All] +// [Start AppEvent_Click_C++_WriteAppEvent] static napi_value WriteAppEvent(napi_env env, napi_callback_info info) { auto params = OH_HiAppEvent_CreateParamList(); - OH_HiAppEvent_AddInt64Param(params, "click_time", time(nullptr)); + OH_HiAppEvent_AddInt64Param(params, "clickTime", time(nullptr)); OH_HiAppEvent_Write("button", "click", EventType::BEHAVIOR, params); OH_HiAppEvent_DestroyParamList(params); OH_LOG_INFO(LogType::LOG_APP, "writeEvent C++ success"); return {}; } - +// [End AppEvent_Click_C++_WriteAppEvent] +// [Start AsanEvent_AddressTest] static napi_value AddressTest(napi_env env, napi_callback_info info) { // 任意实数 @@ -516,18 +636,25 @@ static napi_value AddressTest(napi_env env, napi_callback_info info) a[length] = num; return {}; } - +// [End AsanEvent_AddressTest] +// [Start EventSub_Init_All] +// [Start AppEvent_C++_Init] static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { + // [StartExclude AppEvent_C++_Init] {"registerWatcher", nullptr, RegisterWatcher, nullptr, nullptr, nullptr, napi_default, nullptr}, - {"writeAppEvent", nullptr, WriteAppEvent, nullptr, nullptr, nullptr, napi_default, nullptr}, - {"addressTest", nullptr, AddressTest, nullptr, nullptr, nullptr, napi_default, nullptr} + {"addressTest", nullptr, AddressTest, nullptr, nullptr, nullptr, napi_default, nullptr}, + // [EndExclude AppEvent_C++_Init] + { "registerWatcherCrash", nullptr, RegisterWatcherCrash, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "registerWatcherClick", nullptr, RegisterWatcherClick, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "writeAppEvent", nullptr, WriteAppEvent, nullptr, nullptr, nullptr, napi_default, nullptr } }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } - +// [End AppEvent_C++_Init] +// [End EventSub_Init_All] static napi_module demoModule = { .nm_version = 1, .nm_flags = 0, diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/types/libentry/Index.d.ts b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/types/libentry/Index.d.ts index 4e870719082f0d84a4ae15d1c360d451680fea9b..6829fba35cdc34f11c08cadc1db975a10fda3d99 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/types/libentry/Index.d.ts +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/cpp/types/libentry/Index.d.ts @@ -13,6 +13,12 @@ * limitations under the License. */ +// [Start EventSub_Index.d.ts_All] export const registerWatcher: () => void; +export const addressTest: () => void; +// [Start AppEvent_C++_Index.d.ts] +export const registerWatcherCrash: () => void; +export const registerWatcherClick: () => void; export const writeAppEvent: () => void; -export const addressTest: () => void; \ No newline at end of file +// [End AppEvent_C++_Index.d.ts] +// [End EventSub_Index.d.ts_All] diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/entryability/EntryAbility.ets b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/entryability/EntryAbility.ets index 0baefdeaf32512342d52873977a666f38e17a460..e049d357c7ec2b8e6ba66ed7dd60d050a3a8b0c8 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/entryability/EntryAbility.ets +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/entryability/EntryAbility.ets @@ -13,50 +13,83 @@ * limitations under the License. */ +// [Start EventSub_EntryAbility_Header] import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; -import { hiAppEvent, hilog, hidebug } from '@kit.PerformanceAnalysisKit'; +// [Start AppEvent_Crash_Click_ArkTS_Header] +import { hiAppEvent, hilog } from '@kit.PerformanceAnalysisKit'; +// [End AppEvent_Crash_Click_ArkTS_Header] +import { hidebug } from '@kit.PerformanceAnalysisKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { window } from '@kit.ArkUI'; +// [End EventSub_EntryAbility_Header] +// [Start EventSub_Capi_Header] import testNapi from 'libentry.so'; - +// [End EventSub_Capi_Header] export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); - // 添加按钮事件观察者 + // [Start AppEvent_Crash_ArkTS_Add_Watcher] + hiAppEvent.addWatcher({ + // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 + name: 'AppCrashWatcher', + // 订阅过滤条件,这里是订阅了系统事件中的崩溃事件 + appEventFilters: [ + { + domain: hiAppEvent.domain.OS, + names: [hiAppEvent.event.APP_CRASH] + } + ], + // 实现onReceive回调,监听到事件后实时回调 + onReceive: (domain: string, appEventGroups: Array) => { + hilog.info(0x0000, 'testTag', 'AppEvents HiAppEvent success to read event with onReceive callback from ArkTS'); + hilog.info(0x0000, 'testTag', `domain=${domain}`); + for (const eventGroup of appEventGroups) { + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventName=${eventGroup.name}`); + for (const eventInfo of eventGroup.appEventInfos) { + // 开发者可以获取到崩溃事件发生的时间戳 + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventInfo.params.time=${JSON.stringify(eventInfo.params['time'])}`); + // 开发者可以获取到崩溃应用的包名 + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventInfo.params.bundle_name=${JSON.stringify(eventInfo.params['bundle_name'])}`); + // 开发者可以获取到崩溃事件发生时的故障日志文件 + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventInfo.params.external_log=${JSON.stringify(eventInfo.params['external_log'])}`); + } + } + } + }); + // [End AppEvent_Crash_ArkTS_Add_Watcher] + // [Start AppEvent_Click_ArkTS_Add_Watcher] hiAppEvent.addWatcher({ // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 - name: 'appEventWatcher', + name: 'ButtonClickWatcher', // 开发者可以订阅感兴趣的应用事件,此处是订阅了按钮事件 - appEventFilters: [{ - domain: 'button' - }], + appEventFilters: [{ domain: 'button' }], // 开发者可以设置订阅回调触发的条件,此处是设置为事件打点数量满足1个 - triggerCondition: { - row: 1 - }, + triggerCondition: { row: 1 }, // 开发者可以自行实现订阅回调函数,以便对订阅获取到的事件打点数据进行自定义处理 onTrigger: (curRow: number, curSize: number, holder: hiAppEvent.AppEventPackageHolder) => { - // 返回的holder对象为null,表示订阅过程发生异常,因此在记录错误日志后直接返回 + // 如果返回的holder对象为null,表示订阅过程发生异常。因此,在记录错误日志后直接返回 if (holder == null) { - hilog.error(0x0000, 'testTag', `HiAppEvent holder is null`); + hilog.error(0x0000, 'testTag', 'AppEvents HiAppEvent holder is null'); return; } - hilog.info(0x0000, 'testTag', `HiAppEvent onTrigger: curRow=%{public}d, curSize=%{public}d`, curRow, curSize); + hilog.info(0x0000, 'testTag', 'AppEvents HiAppEvent success to read event with onTrigger callback from ArkTS'); + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent onTrigger: curRow=%{public}d, curSize=%{public}d`, curRow, curSize); let eventPkg: hiAppEvent.AppEventPackage | null = null; - // 根据设置阈值大小(默认为512KB)去获取订阅事件包,直到将订阅数据全部取出 + // 根据设置阈值大小(默认为1条事件)去获取订阅事件包,直到将订阅数据全部取出 // 返回的事件包对象为null,表示当前订阅数据已被全部取出,此次订阅回调触发结束 while ((eventPkg = holder.takeNext()) != null) { // 开发者可以对事件包中的事件打点数据进行自定义处理,此处是将事件打点数据打印在日志中 - hilog.info(0x0000, 'testTag', `readEvent ArkTS Success`); - hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.packageId=%{public}d`, eventPkg.packageId); - hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.row=%{public}d`, eventPkg.row); - hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.size=%{public}d`, eventPkg.size); + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventPkg.packageId=%{public}d`, eventPkg.packageId); + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventPkg.row=%{public}d`, eventPkg.row); + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventPkg.size=%{public}d`, eventPkg.size); for (const eventInfo of eventPkg.data) { - hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.info=%{public}s`, eventInfo); + hilog.info(0x0000, 'testTag', `AppEvents HiAppEvent eventPkg.info=%{public}s`, eventInfo); } } } }); + // [End AppEvent_Click_ArkTS_Add_Watcher] + // [Start Crash&FreezeEvent_ArkTS_Add_Event] // 开发者完成参数键值对赋值 let params: Record = { 'testData': 100, @@ -70,6 +103,8 @@ export default class EntryAbility extends UIAbility { }).catch((err: BusinessError) => { hilog.error(0x0000, 'testTag', `HiAppEvent code: ${err.code}, message: ${err.message}`); }); + // [End Crash&FreezeEvent_ArkTS_Add_Event] + // [Start CrashEvent_ArkTS_Add_Watcher] // 添加崩溃事件观察者 hiAppEvent.addWatcher({ // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 @@ -123,6 +158,8 @@ export default class EntryAbility extends UIAbility { } } }); + // [End CrashEvent_ArkTS_Add_Watcher] + // [Start FreezeEvent_ArkTS_Add_Watcher] // 添加卡死事件观察者 hiAppEvent.addWatcher({ // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 @@ -193,6 +230,8 @@ export default class EntryAbility extends UIAbility { } } }); + // [End FreezeEvent_ArkTS_Add_Watcher] + // [Start PssleakEvent_ArkTS_Add_Watcher] // 添加资源泄露事件观察者 hiAppEvent.addWatcher({ // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 @@ -217,6 +256,8 @@ export default class EntryAbility extends UIAbility { } } }); + // [End PssleakEvent_ArkTS_Add_Watcher] + // [Start AsanEvent_ArkTS_Add_Watcher] // 添加踩地址事件观察者 hiAppEvent.addWatcher({ // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 @@ -252,6 +293,8 @@ export default class EntryAbility extends UIAbility { } } }); + // [End AsanEvent_ArkTS_Add_Watcher] + // [Start TimeOutEvent_ArkTS_Add_Watcher] // 添加主线程超时事件观察者 hiAppEvent.addWatcher({ // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 @@ -296,8 +339,18 @@ export default class EntryAbility extends UIAbility { } } }); + // [End TimeOutEvent_ArkTS_Add_Watcher] + // [Start EventSub_Call_Capi_Function] // 调用C++观察者 testNapi.registerWatcher(); + // [End EventSub_Call_Capi_Function] + // [Start AppEvent_Call_Capi_Function] + // 在onCreate()函数中添加C API接口调用 + // 启动时,注册崩溃事件观察者 + testNapi.registerWatcherCrash(); + // 启动时,注册按钮点击事件观察者 + testNapi.registerWatcherClick(); + // [End AppEvent_Call_Capi_Function] } onDestroy(): void { diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/pages/Index.ets b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/pages/Index.ets index 2f9e0e9e5cc890c125eb1f7b2a3faa729c2c8d6e..012f585f486d6aa13d409b327a955d2104c85541 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/pages/Index.ets +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/ets/pages/Index.ets @@ -12,11 +12,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +// [Start EventSub_Header] import { BusinessError } from '@kit.BasicServicesKit'; import { hiAppEvent, hilog } from '@kit.PerformanceAnalysisKit'; +// [End EventSub_Header] +// [Start PssleakEvent_Header] import hidebug from '@ohos.hidebug'; +// [End PssleakEvent_Header] +// [Start EventSub_Index_Capi_Header] import testNapi from 'libentry.so'; - +// [End EventSub_Index_Capi_Header] @Entry @Component struct Index { @@ -25,7 +31,22 @@ struct Index { build() { Row() { Column() { - Button($r('app.string.WriteEventArkTS_Button')) + // [Start AppEvent_Crash_Button] + Button('WatchAppCrash ArkTS&C++') + .type(ButtonType.Capsule) + .margin({ + top: 20 + }) + .backgroundColor('#0D9FFB') + .width('80%') + .height('5%') + .onClick(() => { + // 在按钮点击函数中构造一个crash场景,触发崩溃事件 + let result: object = JSON.parse(''); + }) + // [End AppEvent_Crash_Button] + // [Start AppEvent_Click_ArkTS_Button] + Button('writeEvent ArkTS') .type(ButtonType.Capsule) .margin({ top: 20 @@ -47,11 +68,13 @@ struct Index { params: eventParams, }; hiAppEvent.write(eventInfo).then(() => { - hilog.info(0x0000, 'testTag', `writeEvent ArkTS success`); + hilog.info(0x0000, 'testTag', `AppEvents writeEvent ArkTS success`); }).catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `HiAppEvent err.code: ${err.code}, err.message: ${err.message}`); + hilog.error(0x0000, 'testTag', `AppEvents HiAppEvent err.code: ${err.code}, err.message: ${err.message}`); }); }) + // [End AppEvent_Click_ArkTS_Button] + // [Start CrashEvent_Button] Button($r('app.string.Crash_Button')) .type(ButtonType.Capsule) .margin({ @@ -64,6 +87,8 @@ struct Index { // 在按钮点击函数中构造一个crash场景,触发应用崩溃事件 JSON.parse(''); }) + // [End CrashEvent_Button] + // [Start PssleakEvent_Button] Button($r('app.string.Pssleak_Button')) .type(ButtonType.Capsule) .margin({ @@ -79,6 +104,8 @@ struct Index { this.leakedArray.push(new Array(1).fill('leak')); } }) + // [End PssleakEvent_Button] + // [Start TimeOutEvent_Button] Button($r('app.string.TimeOut_Button')) .type(ButtonType.Capsule) .margin({ @@ -92,11 +119,13 @@ struct Index { while (Date.now() - t <= 350) { } }) + // [End TimeOutEvent_Button] } .width('50%') Column() { - Button($r('app.string.WriteEventCPP_Button')) + // [Start AppEvent_CPP_Button] + Button('writeEvent C++') .type(ButtonType.Capsule) .margin({ top: 20 @@ -107,6 +136,8 @@ struct Index { .onClick(() => { testNapi.writeAppEvent(); }) + // [End AppEvent_CPP_Button] + // [Start FreezeEvent_Button] Button($r('app.string.Freeze_Button')) .type(ButtonType.Capsule) .margin({ @@ -121,6 +152,8 @@ struct Index { } }, 1000) }) + // [End FreezeEvent_Button] + // [Start AsanEvent_Button] Button($r('app.string.AsanEvent_Button')) .type(ButtonType.Capsule) .margin({ @@ -132,6 +165,7 @@ struct Index { .onClick(() => { testNapi.addressTest(); }) + // [End AsanEvent_Button] } .width('50%') } diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/base/element/string.json b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/base/element/string.json index 3a434d5a3c1ebeba93429c665379ef216500e65e..0d26f1acdb40e72a2e7b63750b3868e3243e857a 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/base/element/string.json +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/base/element/string.json @@ -12,6 +12,10 @@ "name": "EntryAbility_label", "value": "EventSub" }, + { + "name": "WatchAppCrash_Button", + "value": "WatchAppCrash ArkTS&C++" + }, { "name": "WriteEventArkTS_Button", "value": "writeEvent ArkTS" @@ -41,4 +45,4 @@ "value": "appAsanEvent ArkTS&C++" } ] -} \ No newline at end of file +} diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/en_US/element/string.json b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/en_US/element/string.json index 3a434d5a3c1ebeba93429c665379ef216500e65e..0d26f1acdb40e72a2e7b63750b3868e3243e857a 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/en_US/element/string.json +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/en_US/element/string.json @@ -12,6 +12,10 @@ "name": "EntryAbility_label", "value": "EventSub" }, + { + "name": "WatchAppCrash_Button", + "value": "WatchAppCrash ArkTS&C++" + }, { "name": "WriteEventArkTS_Button", "value": "writeEvent ArkTS" @@ -41,4 +45,4 @@ "value": "appAsanEvent ArkTS&C++" } ] -} \ No newline at end of file +} diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/zh_CN/element/string.json b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/zh_CN/element/string.json index 135de82be37eb2c8bbd8dc536275877670cc3e3f..be2be09f9623cc56844054669224befc0de5d0ac 100644 --- a/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/zh_CN/element/string.json +++ b/PerformanceAnalysisKit/HiAppEvent/EventSub/entry/src/main/resources/zh_CN/element/string.json @@ -12,6 +12,10 @@ "name": "EntryAbility_label", "value": "事件订阅" }, + { + "name": "WatchAppCrash_Button", + "value": "WatchAppCrash ArkTS&C++" + }, { "name": "WriteEventArkTS_Button", "value": "writeEvent ArkTS" @@ -41,4 +45,4 @@ "value": "appAsanEvent ArkTS&C++" } ] -} \ No newline at end of file +} diff --git a/PerformanceAnalysisKit/HiAppEvent/EventSub/screenshots/Screenshot_20250909094941818.jpg b/PerformanceAnalysisKit/HiAppEvent/EventSub/screenshots/Screenshot_20250909094941818.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de3513d5bc942739d2ed609b0c6b197f8f42019a Binary files /dev/null and b/PerformanceAnalysisKit/HiAppEvent/EventSub/screenshots/Screenshot_20250909094941818.jpg differ