事件订阅
介绍
本示例主要展示用HiAppEvent如何实现事件订阅(AppEvent),并列举了订阅如下系统事件的例子:
崩溃事件(CrashEvent)、系统卡死事件(FreezeEvent)、系统资源泄漏事件(PssLeakEvent)、系统地址越界事件(ASANEvent)以及主线程超时事件
(TimeOutEvent)。
该工程中的展示的代码详细描述可查如下链接:
效果预览
| 主页 |
|---|
![]() |
使用说明
在napi_init.cpp中需要使用三方库jsoncpp来解析订阅事件(C/C++)中的json字符串。该工程已经将jsoncpp源码交叉编译后以动态库的方式导入,可直接编译。 jsoncpp 1.9.6版本官方下载地址:https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.6.tar.gz。jsoncpp的库文件位置可以查阅[工程目录](#工程目录)。
1.事件订阅(ArkTS&C++)使用说明:订阅崩溃(APP_CRASH)事件
1.在应用侧主界面,点击"WatchAppCrash ArkTS&C++"按钮,触发一次崩溃(APP_CRASH)事件;
2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"AppEvent HiAppEvent"。此时窗口仅显示符合条件的日志,打印日志结果为:
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"]
注意:
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"。此时窗口仅显示符合条件的日志,打印日志结果为:
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.EntryAbility.ets的onCreate()方法中同时注册了按钮点击事件的ArkTS观察者和C++观察者,故读取时均能读到,不影响结果。
2.C++读事件比ArkTS写事件先出现的原因可能是C++层的日志打印执行速度更快,不影响结果。
3.事件订阅(C/C++)使用说明:订阅按钮点击(click)事件
1.在应用侧主界面,点击"writeEvent C++"按钮,从c++层触发一次按钮点击事件打点;
2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"AppEvent HiAppEvent"。此时窗口仅显示符合条件的日志,打印日志结果为:
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.EntryAbility.ets的onCreate()方法中同时注册了按钮点击事件的ArkTS观察者和C++观察者,故读取时均能读到,不影响结果。
2.为了区分ArkTS、C++中设置的自定义打点参数clickTime,点击"writeEvent C++"按钮,配置的clickTime是一个时间戳,而点击"writeEvent ArkTS"按钮,配置的
clickTime是整数100。
3.C++读事件比ArkTS写事件先出现的原因可能是C++层的日志打印执行速度更快,不影响结果。
4.订阅崩溃事件(ArkTS&C++)
1.在应用侧主界面,点击"appCrash ArkTS&C++"按钮触发崩溃,应用退出后重启应用;
2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为:
HiAppEvent eventInfo.WatcherType=OnTrigger
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=APP_CRASH
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1501890680817
HiAppEvent eventInfo.params.crash_type=JsError
HiAppEvent eventInfo.params.foreground=1
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub
HiAppEvent eventInfo.params.pid=2579
HiAppEvent eventInfo.params.uid=20010051
HiAppEvent eventInfo.params.uuid=114e22cab85a934b58dca7442edb14bad4301a7fe9a4f5ee5c662c557ada08b1
HiAppEvent eventInfo.params.exception={"message":"Unexpected Text in JSON: Empty Text","name":"SyntaxError","stack":" at anonymous entry (entry/src/main/ets/pages/Index.ets:65:13)\n"}
HiAppEvent eventInfo.params.hilog.size=100
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1501890680961_2579.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ onTrigger类型观察者日志输出
HiAppEvent eventInfo.WatcherType=OnReceive
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=APP_CRASH
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1501890680817
HiAppEvent eventInfo.params.crash_type=JsError
HiAppEvent eventInfo.params.foreground=1
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub
HiAppEvent eventInfo.params.pid=2579
HiAppEvent eventInfo.params.uid=20010051
HiAppEvent eventInfo.params.uuid=114e22cab85a934b58dca7442edb14bad4301a7fe9a4f5ee5c662c557ada08b1
HiAppEvent eventInfo.params.exception={"message":"Unexpected Text in JSON: Empty Text","name":"SyntaxError","stack":" at anonymous entry (entry/src/main/ets/pages/Index.ets:65:13)\n"}
HiAppEvent eventInfo.params.hilog.size=100
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1501890680961_2579.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ onReceive类型观察者日志输出
HiAppEvent onReceive: domain=OS
HiAppEvent eventName=APP_CRASH
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=APP_CRASH
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1501890680817
HiAppEvent eventInfo.params.crash_type=JsError
HiAppEvent eventInfo.params.foreground=true
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub
HiAppEvent eventInfo.params.pid=2579
HiAppEvent eventInfo.params.uid=20010051
HiAppEvent eventInfo.params.uuid=114e22cab85a934b58dca7442edb14bad4301a7fe9a4f5ee5c662c557ada08b1
HiAppEvent eventInfo.params.exception={"message":"Unexpected Text in JSON: Empty Text","name":"SyntaxError","stack":" at anonymous entry (entry/src/main/ets/pages/Index.ets:65:13)\n"}
HiAppEvent eventInfo.params.hilog.size=100
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1501890680961_2579.log"]
HiAppEvent eventInfo.params.log_over_limit=false
HiAppEvent eventInfo.params.test_data=100
// 以上为ArkTS onReceive类型观察者日志输出
注意:
1.要确认日志输出中的eventInfo.name为APP_CRASH。
2.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。
5.订阅卡死事件(ArkTS&C++)
1.在应用侧主界面,点击"appFreeze ArkTS&C++"按钮触发卡死(可能需要几秒),应用退出后重启应用;
2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为:
HiAppEvent eventInfo.WatcherType=OnReceive
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=APP_FREEZE
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1501891964864
HiAppEvent eventInfo.params.foreground=1
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub
HiAppEvent eventInfo.params.process_name=com.samples.eventsub
HiAppEvent eventInfo.params.pid=5105
HiAppEvent eventInfo.params.uid=20010051
HiAppEvent eventInfo.params.uuid=c450b09dcefc0f9bd9b6cb4230e0c8f2d1b1e3c5becf82d272ef1a3241c958da
HiAppEvent eventInfo.params.exception={"message":"App main thread is not response!","name":"THREAD_BLOCK_6S"}
HiAppEvent eventInfo.params.hilog.size=88
HiAppEvent eventInfo.params.event_handler.size=0
HiAppEvent eventInfo.params.event_handler_3s.size=0
HiAppEvent eventInfo.params.event_handler_6s.size=0
HiAppEvent eventInfo.params.peer_binder.size=0
HiAppEvent eventInfo.params.threads.size=38
HiAppEvent eventInfo.params.memory={"pss":0,"rss":0,"sys_avail_mem":1000060,"sys_free_mem":485304,"sys_total_mem":1935816,"vss":0}
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_FREEZE_1501891977850_5105.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ onReceive类型观察者日志输出
HiAppEvent eventInfo.WatcherType=OnTrigger
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=APP_FREEZE
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1501891964864
HiAppEvent eventInfo.params.foreground=1
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub
HiAppEvent eventInfo.params.process_name=com.samples.eventsub
HiAppEvent eventInfo.params.pid=5105
HiAppEvent eventInfo.params.uid=20010051
HiAppEvent eventInfo.params.uuid=c450b09dcefc0f9bd9b6cb4230e0c8f2d1b1e3c5becf82d272ef1a3241c958da
HiAppEvent eventInfo.params.exception={"message":"App main thread is not response!","name":"THREAD_BLOCK_6S"}
HiAppEvent eventInfo.params.hilog.size=88
HiAppEvent eventInfo.params.event_handler.size=0
HiAppEvent eventInfo.params.event_handler_3s.size=0
HiAppEvent eventInfo.params.event_handler_6s.size=0
HiAppEvent eventInfo.params.peer_binder.size=0
HiAppEvent eventInfo.params.threads.size=38
HiAppEvent eventInfo.params.memory={"pss":0,"rss":0,"sys_avail_mem":1000060,"sys_free_mem":485304,"sys_total_mem":1935816,"vss":0}
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_FREEZE_1501891977850_5105.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ onTrigger类型观察者日志输出
HiAppEvent onReceive: domain=OS
HiAppEvent eventName=APP_FREEZE
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=APP_FREEZE
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1501891964864
HiAppEvent eventInfo.params.foreground=true
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub
HiAppEvent eventInfo.params.process_name=com.samples.eventsub
HiAppEvent eventInfo.params.pid=5105
HiAppEvent eventInfo.params.uid=20010051
HiAppEvent eventInfo.params.uuid=c450b09dcefc0f9bd9b6cb4230e0c8f2d1b1e3c5becf82d272ef1a3241c958da
HiAppEvent eventInfo.params.exception={"message":"App main thread is not response!","name":"THREAD_BLOCK_6S"}
HiAppEvent eventInfo.params.hilog.size=88
HiAppEvent eventInfo.params.event_handler.size=0
HiAppEvent eventInfo.params.event_handler_size_3s=0
HiAppEvent eventInfo.params.event_handler_size_6s=0
HiAppEvent eventInfo.params.peer_binder.size=0
HiAppEvent eventInfo.params.threads.size=38
HiAppEvent eventInfo.params.memory={"pss":0,"rss":0,"sys_avail_mem":1000060,"sys_free_mem":485304,"sys_total_mem":1935816,"vss":0}
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_FREEZE_1501891977850_5105.log"]
HiAppEvent eventInfo.params.log_over_limit=false
HiAppEvent eventInfo.params.test_data=100
// 以上为ArkTS onReceive类型观察者日志输出
注意:
1.如果在应用重启时立即在log窗口搜索日志会出现日志暂时未出现的情况,原因是Freeze事件处理时间较长,等待10秒即可。
2.要确认日志输出中的eventInfo.name为APP_FREEZE。
3.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。
6.订阅资源泄漏事件(ArkTS&C++)
1.先在设备“开发者选项”中打开“系统资源泄漏日志”,并重启设备;
2.在应用侧主界面,点击"pss leak"按钮触发资源泄露事件,等待15~30分钟,会上报应用内存泄漏事件;
3.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为:
HiAppEvent eventInfo.WatcherType=OnReceive
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=RESOURCE_OVERLIMIT
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1502049167732
HiAppEvent eventInfo.params.pid=1587
HiAppEvent eventInfo.params.uid=20010043
HiAppEvent eventInfo.params.resource_type=pss_memory
HiAppEvent eventInfo.params.bundle_name=com.example.eventsub
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.memory={"pss":2100257,"rss":1352644,"sys_avail_mem":250272,"sys_free_mem":60004,"sys_total_mem":1992340,"vss":2462936}
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572401_6808.log","/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572412_6808.log"]
HiAppEvent eventInfo.params.log_over_limit=0
以上为C++ OnReceive类型观察者日志输出
HiAppEvent eventInfo.WatcherType=OnTrigger
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=RESOURCE_OVERLIMIT
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1502049167732
HiAppEvent eventInfo.params.pid=1587
HiAppEvent eventInfo.params.uid=20010043
HiAppEvent eventInfo.params.resource_type=pss_memory
HiAppEvent eventInfo.params.bundle_name=com.example.eventsub
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.memory={"pss":2100257,"rss":1352644,"sys_avail_mem":250272,"sys_free_mem":60004,"sys_total_mem":1992340,"vss":2462936}
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572401_6808.log","/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572412_6808.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ onTrigger类型观察者日志输出
HiAppEvent onReceive: domain=OS
HiAppEvent eventName=RESOURCE_OVERLIMIT
HiAppEvent eventInfo={"domain":"OS","name":"RESOURCE_OVERLIMIT","eventType":1,"params":{"bundle_name":"com.example.eventsub","bundle_version":"1.0.0","memory":{"pss":2100257,"rss":1352644,"sys_avail_mem":250272,"sys_free_mem":60004,"sys_total_mem":1992340,"vss":2462936},"pid":20731,"resource_type":"pss_memory","time":1502348798106,"uid":20010044,"external_log": ["/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572401_6808.log", "/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572412_6808.log"], "log_over_limit": false}}eventInfo.params.bundle_version=1.0.0
// 以上为ArkTS onReceive类型观察者日志输出
注意:
1.如果设备“开发者选项”中没有“系统资源泄漏日志”选项,或有该选项但重启后该选项自动关闭,则无法测试该功能。
2.要确认日志输出中的eventInfo.name为RESOURCE_OVERLIMIT。
3.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。
7.订阅地址越界事件(ArkTS&C++)
1.点击DevEco Studio界面中的“entry”,点击“Edit Configurations”,点击“Diagnostics”,勾选“Address Sanitizer”,保存设置。
2.在应用侧主界面,点击"address-sanitizer"按钮触发地址越界事件,应用退出后重启应用;
3.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为:
HiAppEvent eventInfo.WatcherType=OnTrigger
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=ADDRESS_SANITIZER
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1609739933049
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.example.cpp
HiAppEvent eventInfo.params.pid=6628
HiAppEvent eventInfo.params.uid=20010050
HiAppEvent eventInfo.params.type="stack-buffer-overflow"
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/ADDRESS_SANITIZER_1609739933234_6628.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ OnTrigger观察者日志输出
HiAppEvent eventInfo.WatcherType=OnReceive
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=ADDRESS_SANITIZER
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1609739933049
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.example.cpp
HiAppEvent eventInfo.params.pid=6628
HiAppEvent eventInfo.params.uid=20010050
HiAppEvent eventInfo.params.type="stack-buffer-overflow"
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/ADDRESS_SANITIZER_1609739933234_6628.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ OnReceiver观察者日志输出
HiAppEvent onReceive: domain=OS
HiAppEvent eventName=ADDRESS_SANITIZER
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=ADDRESS_SANITIZER
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1609739473665
HiAppEvent eventInfo.params.crash_type=JsError
HiAppEvent eventInfo.params.foreground=true
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.example.eventsub
HiAppEvent eventInfo.params.pid=4116
HiAppEvent eventInfo.params.uid=20010053
HiAppEvent eventInfo.type=stack-buffer-overflow
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/ADDRESS_SANITIZER_1609739473837_4116.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为ArkTS onReceive类型观察者日志输出
注意:
1.如果在勾选“Address Sanitizer”设置后,应用无法在设备上打开,可能是DevEco Studio和设备版本的原因,请切换版本尝试。
2.要确认日志输出中的eventInfo.name为ADDRESS_SANITIZER。
3.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。
8.订阅主线程超时事件(ArkTS&C++)
1.测试设备应能使用开发者使用nolog版本,开发者模式处于关闭状态,可以使能主线程超时检测抓取trace的功能,建议使用真机测试;
2.在应用侧主界面,快速连续点击两次"timeOut350 ArkTS&C++"按钮触发主线程超时事件;
3.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为:
HiAppEvent eventInfo.WatcherType=OnReceive
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=MAIN_THREAD_JANK
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1609739933049
HiAppEvent eventInfo.params.pid=6628
HiAppEvent eventInfo.params.uid=20010050
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.example.cpp
HiAppEvent eventInfo.params.begin_time=1609739932900
HiAppEvent eventInfo.params.end_time=1609739933049
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/MAIN_THREAD_JANK_1609739933234_6628.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为C++ OnReceiver观察者日志输出
HiAppEvent onReceive: domain=OS
HiAppEvent eventName=MAIN_THREAD_JANK
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=1609739473665
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.bundle_name=com.example.eventsub
HiAppEvent eventInfo.params.pid=4116
HiAppEvent eventInfo.params.uid=20010053
HiAppEvent eventInfo.params.begin_time=1717593620016
HiAppEvent eventInfo.params.end_time=1717593620518
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1609739473837_4116.log"]
HiAppEvent eventInfo.params.log_over_limit=0
// 以上为ArkTS onReceive类型观察者日志输出
注意:
1.如果测试设备无法达到"使用nolog版本,开发者模式处于关闭状态,可以使能主线程超时检测抓取trace的功能"的条件,无法触发回调,日志不会输出。
2.要确认日志输出中的eventInfo.name为MAIN_THREAD_JANK。
3.C++实现了onReceive观察者,ArkTS实现了onReceive观察者。
9.订阅任务执行超时事件(C/C++)
本示例主要展示了订阅任务执行超时事件的功能,包括构造任务执行超时事件及其订阅处理。OH_HiAppEvent_AddWatcher接口用于添加对该超时事件的订阅。
1.在应用侧主界面,点击“TestHiCollieTimerNdk”按钮; 2.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"No filters",搜索内容设置为"testTag"。此时窗口仅显示符合条件的日志,打印日志示例结果为:
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=APP_HICOLLIE
HiAppEvent eventInfo.eventType=1
HiAppEvent eventInfo.params.time=xx
HiAppEvent eventInfo.params.foreground=1
HiAppEvent eventInfo.params.bundle_version=1.0.0
HiAppEvent eventInfo.params.process_name=xx
HiAppEvent eventInfo.params.pid=xx
HiAppEvent eventInfo.params.uid=xx
HiAppEvent eventInfo.params.uuid=xx
HiAppEvent eventInfo.params.exception={"message":"","name":"APP_HICOLLIE"}
HiAppEvent eventInfo.params.hilog.size=xx
HiAppEvent eventInfo.params.peer_binder.size=xx
HiAppEvent eventInfo.params.memory={"pss":0,"rss":xx,"sys_avail_mem":xx,"sys_free_mem":xx,"sys_total_mem":xx,"vss":xx}
HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_HICOLLIE_xx_xx.log"]
HiAppEvent eventInfo.params.log_over_limit=xx
注意:
1.本示例适配API19及以上版本SDK。
2.要确认日志输出中的eventInfo.name为APP_HICOLLIE。
3.C++实现了onReceive和onTrigger两种观察者。
10.订阅Arkweb抛滑丢帧事件(ArkTS)
1.在应用侧主界面,点击“ArkWebFlingJank ArkTs”按钮,跳转到Web页面,等待页面加载完成;
2.多次滑动页面,会触发页面丢帧,上报Arkweb抛滑丢帧事件;
3.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"No filters",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志示例结果为:
HiAppEvent eventInfo.domain=OS
HiAppEvent eventInfo.name=SCROLL_ARKWEB_FLING_JANK
HiAppEvent eventInfo.params.start_time=1765892111768
HiAppEvent eventInfo.params.duration=1554
HiAppEvent eventInfo.params.web_id=1
HiAppEvent eventInfo.params.max_app_frame_time=195
HiAppEvent get currentUrl=https://www.baidu.com
注意:
1.本示例适配API23及以上版本SDK。
2.要确认日志输出中的eventInfo.name为SCROLL_ARKWEB_FLING_JANK。
工程目录
entry
├── libs // 自行创建文件夹,放入相关的三方库
│ ├── arm64-v8a
│ │ └── libjsoncpp.so.26
│ ├── armeabi-v7a
│ │ └── libjsoncpp.so.26
│ └── x86_64
│ └── libjsoncpp.so.26
└── src
├── main
│ ├── cpp
│ │ ├── CMakeLists.txt // 导入so链接
│ │ ├── napi_init.cpp // 功能函数,观察者定义
│ │ ├── thirdparty // 自行创建文件夹,放入相关的三方库
│ │ │ └── jsoncpp
│ │ └── types
│ │ └── libentry
│ │ ├── Index.d.ts // 定义ArkTS接口
│ │ └── oh-package.json5
│ ├── ets
│ │ ├── entryability
│ │ │ └── EntryAbility.ets // 新增接口调用
│ │ ├── entrybackupability
│ │ │ └── EntryBackupAbility.ets
│ │ └── pages
│ │ ├── ArkWebPage.ets
│ │ └── Index.ets // 主页
具体实现
1.在entry/src/main/cpp下添加目录thirdparty,并导入三方库文件jsoncpp的库文件(拷贝jsoncpp整个文件夹);在entry目录下添加libs目录,并导入jsoncpp的库文件。 2.编辑"CMakeLists.txt"文件,添加所需的源文件及动态库; 3.编辑"napi_init.cpp"文件,导入依赖的文件,定义onReceive和onTrigger类型观察者相关方法,注册为ArkTS接口; 4.编辑"index.d.ts"文件,定义ArkTS接口; 5.编辑"EntryAbility.ets"文件,在onCreate()函数中新增观察者调用(包括ArkTS添加观察者和调用C++接口从而调用观察者); 6.编辑"Index.ets"文件,新增按钮触发各种事件。
相关权限
不涉及。
依赖
不涉及。
约束与限制
- 本示例仅支持标准系统上运行,支持设备:华为手机;
- 本示例已适配API 23版本SDK,版本号:6.1.0.23,镜像版本号:OpenHarmony 6.1.0.23;
- 本示例需要使用DevEco Studio 6.1.0 Release(6.1.0.830)及以上版本才可编译运行。
下载
如需单独下载本工程,执行如下命令:
git init
git config core.sparsecheckout true
echo code/DocsSample/PerformanceAnalysisKit/HiAppEvent/EventSub/ > .git/info/sparse-checkout
git remote add origin https://gitcode.com/openharmony/applications_app_samples.git
git pull origin master
