• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# AppFreeze(应用冻屏)检测
2
3## 简介
4
5用户在使用应用时,如果出现点击无反应或应用无响应等情况,并且持续时间超过一定限制,就会被定义为应用冻屏(AppFreeze),即应用无响应或卡死。系统会检测应用无响应,并生成AppFreeze日志,供应用开发者分析。
6
7> **说明:**
8>
9> 本文仅适用于Stage模型下的应用。在根据本文分析日志前,开发者需要具备JS在系统中运行情况、C++程序堆栈信息的相关基础知识,并对应用相关的子系统有一定了解。
10
11## 检测原理
12
13目前应用冻屏检测从以下三个维度检测,了解其原理有助于应用开发者定位和分析AppFreeze故障。
14
15> **注意:**
16>
17> AppFreeze检测仅对[release版本应用](performance-analysis-kit-terminology.md#release版本应用)生效,对[debug版本应用](performance-analysis-kit-terminology.md#debug版本应用)不生效。
18
19| 故障类型 | 说明 |
20| -------- | -------- |
21| THREAD_BLOCK_6S | 应用主线程卡死超时 |
22| APP_INPUT_BLOCK | 用户输入响应超时 |
23| LIFECYCLE_TIMEOUT | Ability生命周期切换超时 |
24
25当应用发生上述故障时,为了保证可恢复,会杀死应用。并上报应用冻屏事件,可通过HiAppEvent订阅[应用冻屏事件](hiappevent-watcher-freeze-events.md)。
26
27### THREAD_BLOCK_6S 应用主线程卡死超时
28
29**概述**:发生该故障,表示当前应用主线程有卡死或者执行任务过多的情况,影响应用的流畅度和体验。
30
31**检测原理**:应用的watchdog线程定期向主线程插入判活检测任务。如果判活检测超过3s未被执行,将上报THREAD_BLOCK_3S告警事件;如果超过6s仍未被执行,将上报THREAD_BLOCK_6S主线程卡死事件。两个事件匹配生成THREAD_BLOCK的应用无响应日志。
32
33检测原理如下图:
34
35**图1**
36
37![thread_block](figures/thread_block.png)
38
39### APP_INPUT_BLOCK 用户输入响应超时
40
41**概述**:该故障是指点击事件超过5s未得到响应。
42
43**检测原理**:用户点击应用时,输入系统会向应用侧发送点击事件;应用侧的响应反馈回执超时,则上报该故障。
44
45检测原理如下图:
46
47**图2**
48
49![app_input_block](figures/app_input_block.png)
50
51### 生命周期切换超时
52
53**概述**:生命周期切换超时分为[Ability生命周期](../application-models/uiability-lifecycle.md)切换超时和[PageAbility生命周期](../application-models/pageability-lifecycle.md)切换超时。
54
55该故障发生在生命周期切换过程中,影响应用内Ability的切换或者不同PageAbility之间的切换。
56
57**检测原理**:foundation的AMS服务向应用进程发送生命周期切换指令,随后等待应用返回结果,固定时间内未成功移除任务将上报故障。
58
59生命周期切换超时由LIFECYCLE_HALF_TIMEOUT和LIFECYCLE_TIMEOUT两个事件组合而成。LIFECYCLE_HALF_TIMEOUT作为LIFECYCLE_TIMEOUT的告警事件,抓取binder等信息。
60
61**图3**
62
63![lifecycle_timeout](figures/lifecycle_timeout.png)
64
65不同的生命周期超时,对应的超时时间各不相同。具体如下表所示:
66
67| 生命周期 | 超时时间 |
68| -------- | -------- |
69| Load | 10s |
70| Foreground | 5s |
71
72## 日志获取
73
74应用冻屏日志和进程崩溃日志一致,都是由Faultlogger模块进行管理,可通过以下方式获取:
75
76**方式一:通过DevEco Studio获取日志**
77
78DevEco Studio会收集设备/data/log/faultlog/faultlogger/路径下的进程崩溃故障日志到FaultLog下,根据进程名和故障时间分类显示。获取日志的方法参见:[DevEco Studio使用指南-FaultLog](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-fault-log)79
80**方式二:通过HiAppEvent接口订阅**
81
82HiAppEvent给开发者提供了故障订阅接口,详见[HiAppEvent介绍](hiappevent-intro.md)。参考[订阅应用冻屏事件(ArkTS)](hiappevent-watcher-freeze-events-arkts.md)或[订阅应用冻屏事件(C/C++)](hiappevent-watcher-freeze-events-ndk.md)完成应用冻屏事件订阅,并通过事件的[external_log](hiappevent-watcher-freeze-events.md#事件字段说明)字段读取故障日志文件内容。
83
84**方式三:通过hdc获取日志,需打开开发者选项**
85
86在开发者选项打开的情况下,开发者可以通过hdc file recv /data/log/faultlog/faultlogger D:\命令导出故障日志到本地,故障日志文件名格式为appfreeze-进程名-进程UID-毫秒级时间.log。
87
88## 日志规格
89
90应用冻屏(AppFreeze)问题需要结合应用冻屏日志和hilog流水日志进行分析。
91
92当前提供一个故障分析示例,请开发者根据具体问题具体分析。
93
94应用冻屏日志主要分以下几个模块信息:
95
96### 日志头部信息
97
98```
99Generated by HiviewDFX@OpenHarmony
100================================================================
101Device info:HUAWEI Mate 60 Pro
102Build info:ALN-AL00 6.0.0.328(C00E1R4P3DEVDUlog)
103Fingerprint:e18a33c12e1361173ec9ac1c93f2bd0c2daa88f03c7f76b228cca14bdc6a21b1
104Module name:com.samples.freezedebug
105Version:1.0.0
106VersionCode:1000000
107PreInstalled:No
108Foreground:Yes
109Pid:13680
110Uid:20020177
111Reason:THREAD_BLOCK_6S
112appfreeze: com.samples.freezedebug THREAD_BLOCK_6S at 20250628140837
113DisplayPowerInfo:powerState:UNKNOWN
114Page switch history:
115  14:08:30:327 /ets/pages/Index:Appfreeze
116  14:08:28:986 /ets/pages/Index
117  14:08:26:502 :enters foreground
118  14:08:07:606 :leaves foreground
119  14:08:06:246 /ets/pages/Index:Appfreeze
120  14:08:01:955 :enters foreground
121>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
122DOMAIN:AAFWK
123STRINGID:THREAD_BLOCK_6S
124TIMESTAMP:2025/06/28-14:08:37:360
125PID:13680
126UID:20020177
127PACKAGE_NAME:com.samples.freezedebug
128PROCESS_NAME:com.samples.freezedebug
129NOTE: Current fault may be caused by the system's low memory or thermal throttling, you may ignore it and analysis other faults.
130***
131```
132从API version 20开始,当整机资源告警(如整机低内存或热限频)时,会输出NOTE行。出现此行时,开发者可以忽略应用冻屏故障。在之前的API版本中,无论整机资源状态如何,均无此行输出。
133
134三种AppFreeze事件都包含以下几部分信息,具体解释如下:
135
136| 字段 | 说明 |
137| -------- | -------- |
138| Reason | 应用无响应原因,与应用无响应检测能力点对应。 |
139| PID | 发生故障时的pid。 |
140| PACKAGE_NAME | 应用进程包名。 |
141|[Page switch history](./cppcrash-guidelines.md#有页面切换轨迹的故障场景日志规格)| 从API 20开始,维测进程会记录应用切换历史。应用发生故障后,生成的故障文件将包含页面切换历史轨迹。如果维测服务进程出现故障或未缓存切换轨迹,则不包含此字段。|
142
143### 日志主干通用信息
144
145```
146start time: 2025/06/28-14:08:34:318
147DOMAIN = AAFWK
148EVENTNAME = THREAD_BLOCK_3S
149TIMESTAMP = 2025/06/28-14:08:34:310
150PID = 13680
151UID = 20020177
152TID = 13680
153PACKAGE_NAME = com.samples.freezedebug
154PROCESS_NAME = com.samples.freezedebug
155eventLog_action = ffrt,t,GpuStack,cmd:m,hot
156eventLog_interval = 10
157MSG =
158Fault time:2025/06/28-14:08:34
159App main thread is not response!
160Main handler dump start time: 2025-06-28 14:08:34.067
161mainHandler dump is:
162 EventHandler dump begin curTime: 2025-06-28 14:08:34.067
163 Event runner (Thread name = , Thread ID = 13680) is running
164 Current Running: start at 2025-06-28 14:08:27.354, Event { send thread = 13680, send time = 2025-06-28 14:08:22.353, handle time = 2025-06-28 14:08:27.353, trigger time = 2025-06-28 14:08:27.354, task name = uv_timer_task, caller = [ohos_loop_handler.cpp(OnTriggered:72)] }
165 History event queue information:
166 No. 0 : Event { send thread = 13856, send time = 2025-06-28 14:08:22.336, handle time = 2025-06-28 14:08:22.336, trigger time = 2025-06-28 14:08:22.336, completeTime time = 2025-06-28 14:08:22.337, priority = VIP, task name = MMITask, caller = [deamon_io_waiter.cpp(HandleFileDescriptorEvent:225)] }
167...
168 No. 31 : Event { send thread = 13856, send time = 2025-06-28 14:08:22.330, handle time = 2025-06-28 14:08:22.380, trigger time = 2025-06-28 14:08:22.330, completeTime time = 2025-06-28 14:08:22.331, priority = VIP, task name = vSyncTask, caller = [deamon_io_waiter.cpp(PostTaskForVsync:159)] }
169 VIP priority event queue information:
170 No.1 : Event { send thread = 13843, send time = 2025-06-28 14:08:31.066, handle time = 2025-06-28 14:08:31.066, id = 1, caller = [watchdog.cpp(Timer:233)] }
171 No.2 : Event { send thread = 13843, send time = 2025-06-28 14:08:34.067, handle time = 2025-06-28 14:08:34.067, id = 1, caller = [watchdog.cpp(Timer:233)] }
172 Total size of VIP events : 2
173 Immediate priority event queue information:
174 Total size of Immediate events : 0
175 High priority event queue information:
176 Total size of High events : 0
177 Low priority event queue information:
178 Total size of Low events : 0
179 Idle priority event queue information:
180 Total size of Idle events : 0
181 Total event size : 2
182```
183
184三种AppFreeze事件都包含以下几部分信息,具体解释如下:
185
186| 主要信息字段 | 说明 |
187| -------- | -------- |
188| EVENTNAME | 组成卡死检测事件。 |
189| TIMESTAMP | 发生故障时上报事件的时刻,可以根据应用无响应检测能力点中说明的超时时间,在相应hilog流水日志中缩小查看日志的时间范围。 |
190| PID | 发生故障时候的pid。 |
191| UID | 故障进程UID。 |
192| TID | 发生故障时候的tid。 |
193| PACKAGE_NAME | 应用进程包名。 |
194| PROCESS_NAME | 应用进程名。 |
195| MSG | 发生故障时间及EventHandler信息。 |
196| task name | 任务队列中的任务名。 |
197| trigger time | 任务执行时间。 |
198| completeTime time | 任务执行完成时间(如果没有打印则表示该任务未执行完成)。 |
199
200### 堆栈信息
201
202显示故障进程堆栈信息。
203
204```
205Tid:13680, Name:les.freezedebug
206#00 pc 000000000000186c [shmm](__kernel_gettimeofday+72)
207#01 pc 00000000001d887c /system/lib/ld-musl-aarch64.so.1(gettimeofday+40)(f1a940981720250b920ee26d2d76af5b)
208#02 pc 000000000058fb5c /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::builtins::BuiltinsDate::Now(panda::ecmascript::EcmaRuntimeCallInfo*)+48)(0f1928b77d36d27edb5512bd89806a6f)
209#03 pc 0000000000cff5dc /system/lib64/module/arkcompiler/stub.an(RTStub_PushCallArgsAndDispatchNative+40)
210#04 pc 000000000036aaf4 /system/lib64/module/arkcompiler/stub.an(BCStub_HandleCallthis0Imm8V8StwCopy+380)
211#05 at wait15s (entry/src/main/ets/pages/Index.ets:16:10)
212#06 pc 000000000026b1dc /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::InterpreterAssembly::Execute(panda::ecmascript::EcmaRuntimeCallInfo*)+536)(0f1928b77d36d27edb5512bd89806a6f)
213#07 pc 000000000096b188 /system/lib64/platformsdk/libark_jsruntime.so(panda::FunctionRef::CallForNapi(panda::ecmascript::EcmaVM const*, panda::JSValueRef*, panda::JSValueRef* const*, int)+1432)(0f1928b77d36d27edb5512bd89806a6f)
214#08 pc 000000000006b7a4 /system/lib64/platformsdk/libace_napi.z.so(napi_call_function+212)(eaa639519e67e8495ca596293a0d33cd)
215#09 pc 000000000000b17c /system/lib64/platformsdk/libtimer.z.so(OHOS::JsSysModule::Timer::TimerCallback(uv_timer_s*) (.cfi)+528)(764291289e89523cdbe9c3c78c1cca35)
216#10 pc 0000000000013ea8 /system/lib64/platformsdk/libuv.so(uv__run_timers+68)(9e7eb59ca1a45f4230b641a7c940a20b)
217#11 pc 000000000001a344 /system/lib64/platformsdk/libuv.so(uv_run+376)(9e7eb59ca1a45f4230b641a7c940a20b)
218#12 pc 00000000000895a8 /system/lib64/platformsdk/libruntime.z.so(OHOS::AbilityRuntime::OHOSLoopHandler::OnTriggered()+140)(daf29e377c47e3e26282e745dd1b3488)
219#13 pc 0000000000089b4c /system/lib64/platformsdk/libruntime.z.so(std::__h::__function::__func<OHOS::AbilityRuntime::OHOSLoopHandler::OnTriggered()::$_0, std::__h::allocator<OHOS::AbilityRuntime::OHOSLoopHandler::OnTriggered()::$_0>, void ()>::operator()() (.9efded9864dc55830f61b3b92d59beab)+52)(daf29e377c47e3e26282e745dd1b3488)
220#14 pc 000000000001ff6c /system/lib64/chipset-sdk-sp/libeventhandler.z.so(OHOS::AppExecFwk::(anonymous namespace)::EventRunnerImpl::ExecuteEventHandler(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)>&)+2228)(475713336c2720d372d5aeb99dda5f9f)
221#15 pc 000000000001a7d8 /system/lib64/chipset-sdk-sp/libeventhandler.z.so(OHOS::AppExecFwk::(anonymous namespace)::EventRunnerImpl::Run()+648)(475713336c2720d372d5aeb99dda5f9f)
222#16 pc 000000000003f5f4 /system/lib64/chipset-sdk-sp/libeventhandler.z.so(OHOS::AppExecFwk::EventRunner::Run()+404)(475713336c2720d372d5aeb99dda5f9f)
223#17 pc 00000000000a50f0 /system/lib64/platformsdk/libappkit_native.z.so(OHOS::AppExecFwk::MainThread::Start()+504)(e794b687fdf46631ae5144eba250f8c0)
224#18 pc 0000000000005278 /system/lib64/appspawn/appspawn/libappspawn_ace.z.so(RunChildProcessor(AppSpawnContent*, AppSpawnClient*)+568)(143c05087e9460f0fd794b9dce5dec29)
225#19 pc 000000000000baa8 /system/bin/appspawn(AppSpawnChild+648)(25ab88f6e04b1d2c8feb5d3eebfb4664)
226#20 pc 0000000000016478 /system/bin/appspawn(ProcessSpawnReqMsg+3260)(25ab88f6e04b1d2c8feb5d3eebfb4664)
227#21 pc 0000000000013aac /system/bin/appspawn(OnReceiveRequest+724)(25ab88f6e04b1d2c8feb5d3eebfb4664)
228#22 pc 0000000000017844 /system/lib64/chipset-sdk-sp/libbegetutil.z.so(HandleRecvMsg_+384)(a9ddb8b84cc09183cc6bd2e5bb875f30)
229#23 pc 000000000001715c /system/lib64/chipset-sdk-sp/libbegetutil.z.so(HandleStreamEvent_+152)(a9ddb8b84cc09183cc6bd2e5bb875f30)
230#24 pc 000000000001444c /system/lib64/chipset-sdk-sp/libbegetutil.z.so(ProcessEvent+380)(a9ddb8b84cc09183cc6bd2e5bb875f30)
231#25 pc 0000000000013edc /system/lib64/chipset-sdk-sp/libbegetutil.z.so(RunLoop_.llvm.16927440879641410339+656)(a9ddb8b84cc09183cc6bd2e5bb875f30)
232#26 pc 0000000000010dcc /system/bin/appspawn(AppSpawnRun+212)(25ab88f6e04b1d2c8feb5d3eebfb4664)
233#27 pc 000000000000eb90 /system/bin/appspawn(main+728)(25ab88f6e04b1d2c8feb5d3eebfb4664)
234#28 pc 00000000000a9804 /system/lib/ld-musl-aarch64.so.1(libc_start_main_stage2+84)(f1a940981720250b920ee26d2d76af5b)
235```
236
237> **说明:**
238> 在整机高负载情况(如CPU高负载)下,采用低开销方式获取调用栈时,可能损失函数名称和build-id信息;获取用户栈失败时,build-id会为空,导致freeze堆栈只有so级别堆栈。
239
240### 对端信息(与当前故障进程通信的进程信息)
241
242(1)BinderCatcher:显示进程间通信的调用信息及等待时间过长的情况。
243
244```
245PeerBinderCatcher -- pid==13680
246BinderCatcher --
247    13840:14102 to 901:4079 code 16 wait:0.25653125 s frz_state:3,  ns:-1:-1 to -1:-1, debug:13840:14102 to 901:4079, active_code:0, active_thread=0, pending_async_proc=0
248    3712:3712 to 13967:14076 code d2 wait:0.703385417 s frz_state:3,  ns:-1:-1 to -1:-1, debug:3712:3712 to 13967:14076, active_code:0, active_thread=0, pending_async_proc=0
249    1733:2285 to 3712:3712 code b wait:1.365925521 s frz_state:3,  ns:-1:-1 to -1:-1, debug:1733:2285 to 3712:3712, active_code:0, active_thread=0, pending_async_proc=0
250...
251pid context     request started max ready   free_async_space
25214072   binder  0   2   16  3   520192
25314103   binder  0   4   16  6   520192
25413967   binder  0   3   16  3   520192
25513878   binder  0   2   16  3   520192
25613840   binder  0   2   16  3   520192
25713863   binder  0   1   16  3   520192
25813680   binder  0   2   16  3   520192
25913770   binder  0   3   16  5   520192
26013749   binder  0   3   16  5   520192
261...
262
263```
264
265进程间通信调用信息解释如下:
266
267| | |
268| -------- | -------- |
269| xxx:xxx to xxx:xxx | 客户端进程号、线程号 to 服务端进程号、线程号。其中async表示异步,无async表示同步。 |
270| code | 客户端和服务端达成一致约束的业务码。 |
271| wait | 通信等待时长。 |
272| frz_state | 进程冻结状态。<br/>-1 未知<br/>1 默认<br/>2 正在向用户态发送binder状态信息<br/>3 走到了binder接收线程。 |
273| ns | 客户端进程号、线程号 to 服务端进程号、线程号(非卓易通内进程显示-1)。 |
274| debug | IPC通信双方的信息补充。 |
275| active_code | 正在处理的异步消息code。 |
276| active_thread | 处理这个异步消息的线程。 |
277| pending_async_proc | 被这个异步消息阻塞的进程。 |
278| pid | 进程PID。 |
279| context | 通信方式。 |
280| request | 请求申请的IPC线程数量。 |
281| started | 已经申请启动的IPC线程数量。 |
282| max | 可以申请的最大IPC线程数量。 |
283| ready | 空闲IPC线程。 |
284| free_async_space | 空闲异步空间,用于观测异步信息阻塞。 |
285
286(2)PeerBinder Stacktrace:故障进程相关的对端进程有卡死,会抓取对端的进程堆栈,即与当前进程通信的进程堆栈
287
288```
289Tid:48841, Name:xxx
290#00 pc 000000000016adf4 /system/lib/ld-musl-aarch64.so.1
291#01 pc 000000000001c0d4 /system/lib64/chipset-sdk-sp/libeventhandler.z.so
292#02 pc 000000000001a7f4 /system/lib64/chipset-sdk-sp/libeventhandler.z.so
293#03 pc 000000000003f5f4 /system/lib64/chipset-sdk-sp/libeventhandler.z.so
294#04 pc 00000000000a50f0 /system/lib64/platformsdk/libappkit_native.z.so
295#05 pc 0000000000005278 /system/lib64/appspawn/appspawn/libappspawn_ace.z.so
296#06 pc 000000000000baa8 /system/bin/appspawn
297#07 pc 0000000000016478 /system/bin/appspawn
298#08 pc 0000000000013aac /system/bin/appspawn
299#09 pc 0000000000017844 /system/lib64/chipset-sdk-sp/libbegetutil.z.so
300#10 pc 000000000001715c /system/lib64/chipset-sdk-sp/libbegetutil.z.so
301#11 pc 000000000001444c /system/lib64/chipset-sdk-sp/libbegetutil.z.so
302#12 pc 0000000000013edc /system/lib64/chipset-sdk-sp/libbegetutil.z.so
303#13 pc 0000000000010dcc /system/bin/appspawn
304#14 pc 000000000000eb90 /system/bin/appspawn
305#15 pc 00000000000a9804 /system/lib/ld-musl-aarch64.so.1
306#16 pc 000000000000b754 /system/bin/appspawn
307```
308
309### CPU信息
310
311整机CPU信息及解释如下:
312
313```
314Load average: 14.3 / 12.9 / 11.4; the cpu load average in 1 min, 5 min and 15 min
315CPU usage from 2025-06-28 14:08:36 to 2025-06-28 14:08:37
316Total: 22.45%; User Space: 13.64%; Kernel Space: 8.81%; iowait: 0.33%; irq: 0.07%; idle: 77.15%
317Details of Processes:
318    PID   Total Usage      User Space    Kernel Space    Page Fault Minor    Page Fault Major    Name
319    13680      8.86%           8.31%          0.55%            4711                6637            com.samples.freezedebug
320    644        2.55%           1.40%          1.15%          210104                7391            hiview
321    600        0.89%           0.78%          0.10%           60192                 514            hilogd
322    1685       0.53%           0.31%          0.22%          879838               59636            foundation
323```
324
325| | |
326| -------- | -------- |
327| PID | 进程PID。 |
328| Total Usage | CPU使用率,Total Usage = User Space+Kernel Space。 |
329| User Space | 用户态使用率。 |
330| Kernel Space | 内核态使用率。 |
331| Page Fault Minor | 次要缺页错误。 |
332| Page Fault Major | 主要缺页错误。 |
333| Name | 进程名。 |
334
335### 内存信息
336
337```
338Get freeze memory start time: 2025-06-28 14:08:37.112
339some avg10=56.81 avg60=56.81 avg300=56.81 total=56
340full avg10=56.81 avg60=56.81 avg300=56.81 total=56
341...
342ReclaimAvailBuffer:                    4676608 kB
343...
344```
345
346整机内存信息如上所示,其中ReclaimAvailBuffer为整机剩余可用内存,主要用于确认是否是低内存问题。
347
348## 日志差异性信息
349
350生命周期超时事件
351
352```
353DOMAIN:AAFWK
354STRINGID:LIFECYCLE_TIMEOUT
355TIMEOUT TIMESTAMP:2025/02/10-21:40:59:113
356PID:1561
357UID:20010039
358PACKAGE_NAME:com.example.myapplication
359PROCESS_NAME:com.example.myapplication
360MSG:ability:EntryAbility background timeout
361server actions for ability:
3622025-02-10 21:40:56.376; AbilityRecord::ProcessForegroundAbility; the ProcessForegroundAbility lifecycle starts.
3632025-02-10 21:40:56.377; ServiceInner::UpdateAbilityState
364server actions for app:
3652025-02-10 21:40:56.397; AppRunningRecord::OnWindowVisibilityChanged
3662025-02-10 21:40:56.851; AppRunningRecord::OnWindowVisibilityChanged
3672025-02-10 21:40:58.668; AppRunningRecord::OnWindowVisibilityChanged
368client actions for ability:
3692025-02-10 21:40:56.378; AbilityThread::ScheduleAbilityTransaction
3702025-02-10 21:40:56.378; AbilityThread::HandleAbilityTransaction
3712025-02-10 21:40:56.382; JsUIAbility::OnStart begin
3722025-02-10 21:40:56.382; JsUIAbility::OnStart end
3732025-02-10 21:40:56.387; JsUIAbility::OnSceneCreated begin
3742025-02-10 21:40:56.388; JsUIAbility::OnSceneCreated end
3752025-02-10 21:40:56.388; JsUIAbility::WindowScene::GoForeground begin
3762025-02-10 21:40:56.389; UIAbilityImpl::WindowLifeCycleImpl::AfterForeground
3772025-02-10 21:40:56.390; JsUIAbility::OnForeground begin
378client actions for app:
379```
380
381下面用两个完整生命周期切换示例来解释MSG中的信息。
382
383(1)load 阶段事件(应用进程未创建举例)
384
385| | | |
386| -------- | -------- | -------- |
387| server | client | 描述 |
388| AbilityRecord::LoadAbility; the LoadAbility lifecycle starts. |- | 开始。 |
389| AppMgrServiceInner::LoadAbility | -| 创建进程前。 |
390| AppMgrService::AttachApplication | -| 进程创建成功,进程attach。 |
391| ServiceInner::AttachApplication | -| 进程attach。 |
392| ServiceInner::LaunchApplication | -| 调度应用执行加载流程。 |
393| AppRunningRecord::LaunchApplication | -| 调度应用执行加载流程。 |
394| AppScheduler::ScheduleLaunchApplication | -| 调度应用执行加载流程。 |
395| -| ScheduleLaunchApplication | 应用收到加载调度请求。 |
396| -| HandleLaunchApplication begin | 应用加载开始。 |
397| -| HandleLaunchApplication end | 应用加载结束。 |
398| AppRunningRecord::LaunchPendingAbilities | -| 调度应用启动ability。 |
399| -| MainThread::ScheduleLaunchAbility | 应用收到请求加载ability。 |
400| -| MainThread::HandleLaunchAbility | 主线程处理。 |
401| -| JsAbilityStage::Create | 加载abilityStage。 |
402| -| JsAbilityStage::OnCreate begin | abilityStage onCreate生命周期开始。 |
403| -| JsAbilityStage::OnCreate end | abilityStage onCreate生命周期结束。 |
404| -| AbilityThread::Attach | ability attach到ams,load过程结束。 |
405
406(2)foreground 阶段事件,冷启动
407
408| | | |
409| -------- | -------- | -------- |
410| server | client | 描述 |
411| AbilityRecord::ProcessForegroundAbility; the ProcessForegroundAbility lifecycle starts. |  | 开始。 |
412| ServiceInner::UpdateAbilityState | -| 先调度应用前台。 |
413| AppRunningRecord::ScheduleForegroundRunning | -| 调度应用前台。 |
414| AppScheduler::ScheduleForegroundApplication | -| 调度应用前台。 |
415| -| ScheduleForegroundApplication | 应用收到调度。 |
416| -| HandleForegroundApplication | 主线程执行调度。 |
417| AppMgrService::AppForegrounded | -| 应用前台完成。 |
418| ServiceInner::AppForegrounded | -| 应用前台完成。 |
419| -| AbilityThread::ScheduleAbilityTransaction | 应用收到ability前台调度。 |
420| -| AbilityThread::HandleAbilityTransaction | 主线程执行ability前台调度。 |
421| -| JsUIAbility::OnStart begin | onCreate生命周期开始。 |
422| -| JsUIAbility::OnStart end | onCreate生命周期结束。 |
423| -| JsUIAbility::OnSceneCreated begin | 创建窗口scene开始。 |
424| -| JsUIAbility::OnSceneCreated end | 创建窗口scene结束。 |
425| -| JsUIAbility::OnWillForeground begin | -|
426| -| JsUIAbility::OnWillForeground end |- |
427| -| JsUIAbility::WindowScene::GoForeground begin | 调用窗口接口执行 goForeground。 |
428| -| UIAbilityImpl::WindowLifeCycleImpl::AfterForeground | 窗口迁台后回调。 |
429| -| JsUIAbility::OnForeground begin | onForeground生命周期开始。 |
430| -| JsUIAbility::OnForeground end | onForeground生命周期结束。 |
431| -|  | 当窗口回调和onForeground都完成后,前台生命周期结束。 |
432
433参考[日志规格](#日志规格)分析其他日志信息。特别说明:大多数情况下,生命周期切换时主线程会卡死。可以结合两个日志的堆栈和BinderCatcher信息对比查看。
434