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 38 39### APP_INPUT_BLOCK 用户输入响应超时 40 41**概述**:该故障是指点击事件超过5s未得到响应。 42 43**检测原理**:用户点击应用时,输入系统会向应用侧发送点击事件;应用侧的响应反馈回执超时,则上报该故障。 44 45检测原理如下图: 46 47**图2** 48 49 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 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