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 @@
| 主页 |
| :----------------------------------------------------------: |
-|
|
+|
|
#### 使用说明
-请先按照工程目录添加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