1# 事件订阅 2 3### 介绍 4 5本示例主要展示了使用HiAppEvent提供的事件订阅接口,获取本地应用事件(AppEvent),系统崩溃事件(CrashEvent),系统卡死事件(FreezeEvent),系统资源泄漏事件(PssLeakEvent),系统踩内存事件(ASANEvent)以及主线程超时事件(TimeOutEvent)。 6 7该工程中的展示的代码详细描述可查如下链接: 8 9- [订阅应用事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-app-events-arkts.md) 10 11- [订阅应用事件(C/C++)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-app-events-ndk.md) 12 13- [订阅崩溃事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-crash-events-arkts.md) 14 15- [订阅崩溃事件(C/C++)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-crash-events-ndk.md) 16 17- [订阅卡死事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-freeze-events-arkts.md) 18 19- [订阅卡死事件(C/C++)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-freeze-events-ndk.md) 20 21- [订阅资源泄漏事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-resourceleak-events-arkts.md) 22 23- [订阅资源泄漏事件(C/C++)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-resourceleak-events-ndk.md) 24 25- [订阅踩内存事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-address-sanitizer-events-arkts.md) 26 27- [订阅踩内存事件(C/C++)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-address-sanitizer-events-ndk.md) 28 29- [订阅主线程超时事件(ArkTS)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-mainthreadjank-events-arkts.md) 30 31- [订阅主线程超时事件(C/C++)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/dfx/hiappevent-watcher-mainthreadjank-events-ndk.md) 32 33### 效果预览 34 35| 主页 | 36| :----------------------------------------------------------: | 37| <img src="./screenshots/Screenshot_20250219094941818.jpeg" alt="z" width = "400" /> | 38 39#### 使用说明 40 41请先按照工程目录添加三方库文件jsoncpp相关文件,否则编译无法通过;jsoncpp官方下载地址为https://github.com/open-source-parsers/jsoncpp,下载完成后在文件夹内运行python脚本“amalgamate.py”(需要有python环境),脚本运行完成后将生成名为“dist”的文件夹,打开后即可得到jsoncpp.cpp,json.h和json-forward.h三个文件。 42 43##### 1.订阅应用事件(ArkTS)使用说明 44 451.在应用侧主界面,点击"writeEvent ArkTS"按钮,从ets层触发一次按钮点击事件打点; 46 472.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"testTag"。此时窗口仅显示符合条件的日志,打印日志结果为: 48 49``` 50HiAppEvent eventInfo.WatcherType=OnReceive 51HiAppEvent eventInfo.domain=button 52HiAppEvent eventInfo.name=click 53HiAppEvent eventInfo.eventType=4 54readEvent C++ Success // C++读事件成功 55HiAppEvent eventInfo.params.click_time=100 56HiAppEvent eventInfo.WatcherType=OnTrigger 57HiAppEvent eventInfo.domain=button 58HiAppEvent eventInfo.name=click 59HiAppEvent eventInfo.eventType=4 60HiAppEvent eventInfo.params.click_time=100 61writeEvent ArkTS success // ArkTS写事件成功 62HiAppEvent onTrigger: curRow=1, curSize=124 63readEvent ArkTS Success // ArkTS读事件成功 64HiAppEvent eventPkg.packageId=0 65HiAppEvent eventPkg.row=1 66HiAppEvent eventPkg.size=124 67HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1501889519611,"tz_":"+0800","pid_":2579,"tid_":2579,"click_time":100 68``` 69 70注意: 71 721.出现C++读事件成功的原因是本示例中ArkTS和C++写的打点事件是相同的,故读取时均能读到,不影响结果。 73 742.C++读事件比ArkTS写事件先出现的原因可能是C++层的日志打印执行速度更快,不影响结果。 75 76##### 2.订阅应用事件(C/C++)使用说明 77 781.在应用侧主界面,点击"writeEvent C++"按钮,从c++层触发一次按钮点击事件打点; 79 802.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"testTag"。此时窗口仅显示符合条件的日志,打印日志结果为: 81 82``` 83writeEvent C++ success // C++写事件成功 84HiAppEvent eventInfo.WatcherType=OnReceive 85HiAppEvent eventInfo.domain=button 86HiAppEvent eventInfo.name=click 87HiAppEvent eventInfo.eventType=4 88readEvent C++ Success // C++读事件成功 89HiAppEvent eventInfo.params.click_time=1501890218 90HiAppEvent eventInfo.WatcherType=OnTrigger 91HiAppEvent eventInfo.domain=button 92HiAppEvent eventInfo.name=click 93HiAppEvent eventInfo.eventType=4 94HiAppEvent eventInfo.params.click_time=1501890218 95HiAppEvent onTrigger: curRow=1, curSize=131 96readEvent ArkTS Success // ArkTS读事件成功 97HiAppEvent eventPkg.packageId=2 98HiAppEvent eventPkg.row=1 99HiAppEvent eventPkg.size=131 100HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1501890218641,"tz_":"+0800","pid_":2579,"tid_":2579,"click_time":1501890218} 101``` 102 103注意: 104 1051.出现ArkTS读事件成功的原因是本示例中ArkTS和C++写、读的打点事件是相同的,故读取时均能读到,不影响结果。 106 107##### 3.订阅崩溃事件(ArkTS&C++) 108 1091.在应用侧主界面,点击"appCrash ArkTS&C++"按钮触发崩溃,应用退出后重启应用; 110 1112.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: 112 113``` 114HiAppEvent eventInfo.WatcherType=OnTrigger 115HiAppEvent eventInfo.domain=OS 116HiAppEvent eventInfo.name=APP_CRASH 117HiAppEvent eventInfo.eventType=1 118HiAppEvent eventInfo.params.time=1501890680817 119HiAppEvent eventInfo.params.crash_type=JsError 120HiAppEvent eventInfo.params.foreground=1 121HiAppEvent eventInfo.params.bundle_version=1.0.0 122HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub 123HiAppEvent eventInfo.params.pid=2579 124HiAppEvent eventInfo.params.uid=20010051 125HiAppEvent eventInfo.params.uuid=114e22cab85a934b58dca7442edb14bad4301a7fe9a4f5ee5c662c557ada08b1 126HiAppEvent 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"} 127HiAppEvent eventInfo.params.hilog.size=100 128HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1501890680961_2579.log"] 129HiAppEvent eventInfo.params.log_over_limit=0 130// 以上为C++ onTrigger类型观察者日志输出 131HiAppEvent eventInfo.WatcherType=OnReceive 132HiAppEvent eventInfo.domain=OS 133HiAppEvent eventInfo.name=APP_CRASH 134HiAppEvent eventInfo.eventType=1 135HiAppEvent eventInfo.params.time=1501890680817 136HiAppEvent eventInfo.params.crash_type=JsError 137HiAppEvent eventInfo.params.foreground=1 138HiAppEvent eventInfo.params.bundle_version=1.0.0 139HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub 140HiAppEvent eventInfo.params.pid=2579 141HiAppEvent eventInfo.params.uid=20010051 142HiAppEvent eventInfo.params.uuid=114e22cab85a934b58dca7442edb14bad4301a7fe9a4f5ee5c662c557ada08b1 143HiAppEvent 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"} 144HiAppEvent eventInfo.params.hilog.size=100 145HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1501890680961_2579.log"] 146HiAppEvent eventInfo.params.log_over_limit=0 147// 以上为C++ onReceive类型观察者日志输出 148HiAppEvent onReceive: domain=OS 149HiAppEvent eventName=APP_CRASH 150HiAppEvent eventInfo.domain=OS 151HiAppEvent eventInfo.name=APP_CRASH 152HiAppEvent eventInfo.eventType=1 153HiAppEvent eventInfo.params.time=1501890680817 154HiAppEvent eventInfo.params.crash_type=JsError 155HiAppEvent eventInfo.params.foreground=true 156HiAppEvent eventInfo.params.bundle_version=1.0.0 157HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub 158HiAppEvent eventInfo.params.pid=2579 159HiAppEvent eventInfo.params.uid=20010051 160HiAppEvent eventInfo.params.uuid=114e22cab85a934b58dca7442edb14bad4301a7fe9a4f5ee5c662c557ada08b1 161HiAppEvent 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"} 162HiAppEvent eventInfo.params.hilog.size=100 163HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1501890680961_2579.log"] 164HiAppEvent eventInfo.params.log_over_limit=false 165HiAppEvent eventInfo.params.test_data=100 166// 以上为ArkTS onReceive类型观察者日志输出 167``` 168 169注意: 170 1711.要确认日志输出中的eventInfo.name为APP_CRASH。 172 1732.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 174 175##### 4.订阅卡死事件(ArkTS&C++) 176 1771.在应用侧主界面,点击"appFreeze ArkTS&C++"按钮触发卡死(可能需要几秒),应用退出后重启应用; 178 1792.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: 180 181``` 182HiAppEvent eventInfo.WatcherType=OnReceive 183HiAppEvent eventInfo.domain=OS 184HiAppEvent eventInfo.name=APP_FREEZE 185HiAppEvent eventInfo.eventType=1 186HiAppEvent eventInfo.params.time=1501891964864 187HiAppEvent eventInfo.params.foreground=1 188HiAppEvent eventInfo.params.bundle_version=1.0.0 189HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub 190HiAppEvent eventInfo.params.process_name=com.samples.eventsub 191HiAppEvent eventInfo.params.pid=5105 192HiAppEvent eventInfo.params.uid=20010051 193HiAppEvent eventInfo.params.uuid=c450b09dcefc0f9bd9b6cb4230e0c8f2d1b1e3c5becf82d272ef1a3241c958da 194HiAppEvent eventInfo.params.exception={"message":"App main thread is not response!","name":"THREAD_BLOCK_6S"} 195HiAppEvent eventInfo.params.hilog.size=88 196HiAppEvent eventInfo.params.event_handler.size=0 197HiAppEvent eventInfo.params.event_handler_3s.size=0 198HiAppEvent eventInfo.params.event_handler_6s.size=0 199HiAppEvent eventInfo.params.peer_binder.size=0 200HiAppEvent eventInfo.params.threads.size=38 201HiAppEvent eventInfo.params.memory={"pss":0,"rss":0,"sys_avail_mem":1000060,"sys_free_mem":485304,"sys_total_mem":1935816,"vss":0} 202HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_FREEZE_1501891977850_5105.log"] 203HiAppEvent eventInfo.params.log_over_limit=0 204// 以上为C++ onReceive类型观察者日志输出 205HiAppEvent eventInfo.WatcherType=OnTrigger 206HiAppEvent eventInfo.domain=OS 207HiAppEvent eventInfo.name=APP_FREEZE 208HiAppEvent eventInfo.eventType=1 209HiAppEvent eventInfo.params.time=1501891964864 210HiAppEvent eventInfo.params.foreground=1 211HiAppEvent eventInfo.params.bundle_version=1.0.0 212HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub 213HiAppEvent eventInfo.params.process_name=com.samples.eventsub 214HiAppEvent eventInfo.params.pid=5105 215HiAppEvent eventInfo.params.uid=20010051 216HiAppEvent eventInfo.params.uuid=c450b09dcefc0f9bd9b6cb4230e0c8f2d1b1e3c5becf82d272ef1a3241c958da 217HiAppEvent eventInfo.params.exception={"message":"App main thread is not response!","name":"THREAD_BLOCK_6S"} 218HiAppEvent eventInfo.params.hilog.size=88 219HiAppEvent eventInfo.params.event_handler.size=0 220HiAppEvent eventInfo.params.event_handler_3s.size=0 221HiAppEvent eventInfo.params.event_handler_6s.size=0 222HiAppEvent eventInfo.params.peer_binder.size=0 223HiAppEvent eventInfo.params.threads.size=38 224HiAppEvent eventInfo.params.memory={"pss":0,"rss":0,"sys_avail_mem":1000060,"sys_free_mem":485304,"sys_total_mem":1935816,"vss":0} 225HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_FREEZE_1501891977850_5105.log"] 226HiAppEvent eventInfo.params.log_over_limit=0 227// 以上为C++ onTrigger类型观察者日志输出 228HiAppEvent onReceive: domain=OS 229HiAppEvent eventName=APP_FREEZE 230HiAppEvent eventInfo.domain=OS 231HiAppEvent eventInfo.name=APP_FREEZE 232HiAppEvent eventInfo.eventType=1 233HiAppEvent eventInfo.params.time=1501891964864 234HiAppEvent eventInfo.params.foreground=true 235HiAppEvent eventInfo.params.bundle_version=1.0.0 236HiAppEvent eventInfo.params.bundle_name=com.samples.eventsub 237HiAppEvent eventInfo.params.process_name=com.samples.eventsub 238HiAppEvent eventInfo.params.pid=5105 239HiAppEvent eventInfo.params.uid=20010051 240HiAppEvent eventInfo.params.uuid=c450b09dcefc0f9bd9b6cb4230e0c8f2d1b1e3c5becf82d272ef1a3241c958da 241HiAppEvent eventInfo.params.exception={"message":"App main thread is not response!","name":"THREAD_BLOCK_6S"} 242HiAppEvent eventInfo.params.hilog.size=88 243HiAppEvent eventInfo.params.event_handler.size=0 244HiAppEvent eventInfo.params.event_handler_size_3s=0 245HiAppEvent eventInfo.params.event_handler_size_6s=0 246HiAppEvent eventInfo.params.peer_binder.size=0 247HiAppEvent eventInfo.params.threads.size=38 248HiAppEvent eventInfo.params.memory={"pss":0,"rss":0,"sys_avail_mem":1000060,"sys_free_mem":485304,"sys_total_mem":1935816,"vss":0} 249HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_FREEZE_1501891977850_5105.log"] 250HiAppEvent eventInfo.params.log_over_limit=false 251HiAppEvent eventInfo.params.test_data=100 252// 以上为ArkTS onReceive类型观察者日志输出 253``` 254 255注意: 256 2571.如果在应用重启时立即在log窗口搜索日志会出现日志暂时未出现的情况,原因是Freeze事件处理时间较长,等待10秒即可。 258 2592.要确认日志输出中的eventInfo.name为APP_FREEZE。 260 2613.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 262 263##### 5.订阅资源泄漏事件(ArkTS&C++) 264 2651.先在设备“开发者选项”中打开“系统资源泄漏日志”,并重启设备; 266 2672.在应用侧主界面,点击"pssLeak ArkTS&C++"按钮触发资源泄露事件,等待15~30分钟,会上报应用内存泄漏事件; 268 2693.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: 270 271``` 272HiAppEvent eventInfo.WatcherType=OnReceive 273HiAppEvent eventInfo.domain=OS 274HiAppEvent eventInfo.name=RESOURCE_OVERLIMIT 275HiAppEvent eventInfo.eventType=1 276HiAppEvent eventInfo.params.time=1502049167732 277HiAppEvent eventInfo.params.pid=1587 278HiAppEvent eventInfo.params.uid=20010043 279HiAppEvent eventInfo.params.resource_type=pss_memory 280HiAppEvent eventInfo.params.bundle_name=com.example.eventsub 281HiAppEvent eventInfo.params.bundle_version=1.0.0 282HiAppEvent eventInfo.params.memory={"pss":2100257,"rss":1352644,"sys_avail_mem":250272,"sys_free_mem":60004,"sys_total_mem":1992340,"vss":2462936} 283HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572401_6808.log","/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572412_6808.log"] 284HiAppEvent eventInfo.params.log_over_limit=0 285以上为C++ OnReceive类型观察者日志输出 286HiAppEvent eventInfo.WatcherType=OnTrigger 287HiAppEvent eventInfo.domain=OS 288HiAppEvent eventInfo.name=RESOURCE_OVERLIMIT 289HiAppEvent eventInfo.eventType=1 290HiAppEvent eventInfo.params.time=1502049167732 291HiAppEvent eventInfo.params.pid=1587 292HiAppEvent eventInfo.params.uid=20010043 293HiAppEvent eventInfo.params.resource_type=pss_memory 294HiAppEvent eventInfo.params.bundle_name=com.example.eventsub 295HiAppEvent eventInfo.params.bundle_version=1.0.0 296HiAppEvent eventInfo.params.memory={"pss":2100257,"rss":1352644,"sys_avail_mem":250272,"sys_free_mem":60004,"sys_total_mem":1992340,"vss":2462936} 297HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572401_6808.log","/data/storage/el2/log/resourcelimit/RESOURCE_OVERLIMIT_1725614572412_6808.log"] 298HiAppEvent eventInfo.params.log_over_limit=0 299// 以上为C++ onTrigger类型观察者日志输出 300HiAppEvent onReceive: domain=OS 301HiAppEvent eventName=RESOURCE_OVERLIMIT 302HiAppEvent 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 303// 以上为ArkTS onReceive类型观察者日志输出 304``` 305 306注意: 307 3081.如果设备“开发者选项”中没有“系统资源泄漏日志”选项,或有该选项但重启后该选项自动关闭,则无法测试该功能。 309 3102.要确认日志输出中的eventInfo.name为RESOURCE_OVERLIMIT。 311 3123.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 313 314##### 6.订阅踩内存事件(ArkTS&C++) 315 3161.点击DevEco Studio界面中的“entry”,点击“Edit Configurations”,点击“Diagnostics”,勾选“Address Sanitizer”,保存设置。 317 3182.在应用侧主界面,点击"appAsanEvent ArkTS&C++"按钮触发踩内存事件,应用退出后重启应用; 319 3203.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: 321 322``` 323HiAppEvent eventInfo.WatcherType=OnTrigger 324HiAppEvent eventInfo.domain=OS 325HiAppEvent eventInfo.name=ADDRESS_SANITIZER 326HiAppEvent eventInfo.eventType=1 327HiAppEvent eventInfo.params.time=1609739933049 328HiAppEvent eventInfo.params.bundle_version=1.0.0 329HiAppEvent eventInfo.params.bundle_name=com.example.cpp 330HiAppEvent eventInfo.params.pid=6628 331HiAppEvent eventInfo.params.uid=20010050 332HiAppEvent eventInfo.params.type="stack-buffer-overflow" 333HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/ADDRESS_SANITIZER_1609739933234_6628.log"] 334HiAppEvent eventInfo.params.log_over_limit=0 335// 以上为C++ OnTrigger观察者日志输出 336HiAppEvent eventInfo.WatcherType=OnReceive 337HiAppEvent eventInfo.domain=OS 338HiAppEvent eventInfo.name=ADDRESS_SANITIZER 339HiAppEvent eventInfo.eventType=1 340HiAppEvent eventInfo.params.time=1609739933049 341HiAppEvent eventInfo.params.bundle_version=1.0.0 342HiAppEvent eventInfo.params.bundle_name=com.example.cpp 343HiAppEvent eventInfo.params.pid=6628 344HiAppEvent eventInfo.params.uid=20010050 345HiAppEvent eventInfo.params.type="stack-buffer-overflow" 346HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/ADDRESS_SANITIZER_1609739933234_6628.log"] 347HiAppEvent eventInfo.params.log_over_limit=0 348// 以上为C++ OnReceiver观察者日志输出 349HiAppEvent onReceive: domain=OS 350HiAppEvent eventName=ADDRESS_SANITIZER 351HiAppEvent eventInfo.domain=OS 352HiAppEvent eventInfo.name=ADDRESS_SANITIZER 353HiAppEvent eventInfo.eventType=1 354HiAppEvent eventInfo.params.time=1609739473665 355HiAppEvent eventInfo.params.crash_type=JsError 356HiAppEvent eventInfo.params.foreground=true 357HiAppEvent eventInfo.params.bundle_version=1.0.0 358HiAppEvent eventInfo.params.bundle_name=com.example.eventsub 359HiAppEvent eventInfo.params.pid=4116 360HiAppEvent eventInfo.params.uid=20010053 361HiAppEvent eventInfo.type=stack-buffer-overflow 362HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/ADDRESS_SANITIZER_1609739473837_4116.log"] 363HiAppEvent eventInfo.params.log_over_limit=0 364// 以上为ArkTS onReceive类型观察者日志输出 365``` 366 367注意: 368 3691.如果在勾选“Address Sanitizer”设置后,应用无法在设备上打开,可能是DevEco Studio和设备版本的原因,请切换版本尝试。 370 3712.要确认日志输出中的eventInfo.name为ADDRESS_SANITIZER。 372 3733.C++实现了onReceive和onTrigger两种观察者,ArkTS实现了onReceive观察者。 374 375##### 7.订阅主线程超时事件(ArkTS&C++) 376 3771.测试设备应能使用开发者使用nolog版本,开发者模式处于关闭状态,可以使能主线程超时检测抓取trace的功能,建议使用真机测试; 378 3792.在应用侧主界面,快速连续点击两次"timeOut350 ArkTS&C++"按钮触发主线程超时事件; 380 3813.在DevEco Studio侧下方导航栏,切换到"Log"窗口,日志过滤选择"All log of selected app",搜索内容设置为"HiAppevent"。此时窗口仅显示符合条件的日志,打印日志结果为: 382 383``` 384HiAppEvent eventInfo.WatcherType=OnReceive 385HiAppEvent eventInfo.domain=OS 386HiAppEvent eventInfo.name=MAIN_THREAD_JANK 387HiAppEvent eventInfo.eventType=1 388HiAppEvent eventInfo.params.time=1609739933049 389HiAppEvent eventInfo.params.pid=6628 390HiAppEvent eventInfo.params.uid=20010050 391HiAppEvent eventInfo.params.bundle_version=1.0.0 392HiAppEvent eventInfo.params.bundle_name=com.example.cpp 393HiAppEvent eventInfo.params.begin_time=1609739932900 394HiAppEvent eventInfo.params.end_time=1609739933049 395HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/MAIN_THREAD_JANK_1609739933234_6628.log"] 396HiAppEvent eventInfo.params.log_over_limit=0 397// 以上为C++ OnReceiver观察者日志输出 398HiAppEvent onReceive: domain=OS 399HiAppEvent eventName=MAIN_THREAD_JANK 400HiAppEvent eventInfo.eventType=1 401HiAppEvent eventInfo.params.time=1609739473665 402HiAppEvent eventInfo.params.bundle_version=1.0.0 403HiAppEvent eventInfo.params.bundle_name=com.example.eventsub 404HiAppEvent eventInfo.params.pid=4116 405HiAppEvent eventInfo.params.uid=20010053 406HiAppEvent eventInfo.params.begin_time=1717593620016 407HiAppEvent eventInfo.params.end_time=1717593620518 408HiAppEvent eventInfo.params.external_log=["/data/storage/el2/log/hiappevent/APP_CRASH_1609739473837_4116.log"] 409HiAppEvent eventInfo.params.log_over_limit=0 410// 以上为ArkTS onReceive类型观察者日志输出 411``` 412 413注意: 414 4151.如果测试设备无法达到"使用nolog版本,开发者模式处于关闭状态,可以使能主线程超时检测抓取trace的功能"的条件,无法触发回调,日志不会输出。 416 4172.要确认日志输出中的eventInfo.name为MAIN_THREAD_JANK。 418 4193.C++实现了onReceive观察者,ArkTS实现了onReceive观察者。 420 421### 工程目录 422 423``` 424entry/src/main 425├─cpp 426│ ├─json 427│ │ └─json.h // 自行添加 428│ │ └─json-forwards.h // 自行添加 429│ ├─types 430│ │ └─libentry 431│ │ └─Index.d.ts // 定义ArkTS接口 432│ ├─CMakeLists.txt // 导入so链接 433│ ├─napi_init.cpp // 功能函数,观察者定义 434│ └─jsoncpp.cpp // 自行添加 435└─ets 436 ├─entryability 437 │ └─EntryAbility.ets // 新增接口调用 438 └─pages 439 └─Index.ets // 主页 440``` 441 442### 具体实现 443 4441.在entry/src/main/cpp下添加三方库文件jsoncpp.cpp和目录"json","json"目录下添加json.h和json-forwards.h; 4452.编辑"CMakeLists.txt"文件,添加源文件及动态库; 4463.编辑"napi_init.cpp"文件,导入依赖的文件,定义onReceive和onTrigger类型观察者相关方法,注册为ArkTS接口; 4474.编辑"index.d.ts"文件,定义ArkTS接口; 4485.编辑"EntryAbility.ets"文件,在onCreate()函数中新增观察者调用(包括ArkTS添加观察者和调用C++接口从而调用观察者); 4496.编辑"Index.ets"文件,新增按钮触发各种事件。 450 451### 相关权限 452 453不涉及。 454 455### 依赖 456 457不涉及。 458 459### 约束与限制 460 4611. 本示例仅支持标准系统上运行,支持设备:RK3568; 4622. 本示例已适配API14版本SDK,版本号:5.0.2.58,镜像版本号:OpenHarmony5.0.2.58; 4633. 本示例需要使用DevEco Studio(5.0.3.910)及以上版本才可编译运行。 464 465### 下载 466 467如需单独下载本工程,执行如下命令: 468 469``` 470git init 471git config core.sparsecheckout true 472echo code/DocsSample/PerformanceAnalysisKit/HiAppEvent/EventSub/ > .git/info/sparse-checkout 473git remote add origin https://gitee.com/openharmony/applications_app_samples.git 474git pull origin master 475```