README_zh.md
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```