02-应用冻屏
本文件汇总该版本中归类为应用冻屏的历史修复,重点包括死锁、锁重入、跨线程阻塞和可能导致应用无响应的等待链路问题。
1. TimingTurboModule 与 NativeAnimatedTurboModule 死锁
- 修改日期:2023-09-15
- 版本:0.72.27
- 问题描述:TimingTurboModule 与 NativeAnimatedTurboModule 在同步调用链路中相互等待,ArkTSTurboModule 和 ThreadTaskRunner 的执行顺序形成循环依赖,最终触发死锁
- 影响模块:TurboModule 交互
- 提交 / PR:e536d663d
- 详细修复内容:修复 TimingTurboModule 与 NativeAnimatedTurboModule 交互时的死锁,避免模块间同步调用互相等待。
2. Surface 死锁
- 修改日期:2023-10-30
- 版本:0.72.27
- 问题描述:多 Surface 启停或切换过程中,RNInstance、NapiBridge 与 SurfaceHandle 之间的同步顺序不一致,导致 Surface 生命周期操作相互等待形成死锁
- 影响模块:Surface / 线程
- 提交 / PR:b3b5c9b2f
- 详细修复内容:修复 Surface 相关线程之间的死锁问题,避免 surface 生命周期操作彼此阻塞。
3. 死锁
- 修改日期:2023-11-10
- 版本:0.72.27
- 问题描述:RNInstance 相关同步调用路径在特定测试场景下出现互相等待,线程间锁顺序不一致导致死锁并阻塞后续流程
- 影响模块:线程同步
- 提交 / PR:5bc2c3664
- 详细修复内容:修复线程同步过程中的死锁问题,降低多线程互锁导致的系统卡死和衍生崩溃风险。
4. 主线程析构导致崩溃
- 修改日期:2025-07-26
- 版本:0.72.86
- 问题描述:RNInstance 最后一个强引用落在其他业务线程时,销毁阶段跨线程持有关系失衡,先触发死锁再进一步演化为崩溃
- 影响模块:主线程 / 生命周期
- 提交 / PR:1298e4371 / !1326
- 详细修复内容:当 RNInstance 的最后强引用由其他业务线程持有时,进入销毁流程会出现死锁并进一步引发崩溃。修复通过引入 SafeWeak 机制判断实例是否处于销毁状态,避免其他线程继续持有或访问失效引用,从而收敛销毁阶段的线程竞争。
5. SafeAreaInsetsProvider 在 Worker 上下文同步取窗口属性导致卡死或崩溃
- 修改日期:2025-12-23
- 版本:0.72.112
- 问题描述:SafeAreaInsetsProvider 被错误注册进 AnyThreadTurboModuleContext 和 WorkerTurboModuleContext 后,worker 线程执行 retrieveSafeAreaInsets 会调用 win.getWindowProperties(),该接口内部同步切到 UI 线程获取窗口属性,最终在跨线程同步等待链路中引发卡死,或在 OnGetWindowPropertiesSync 调用栈上触发崩溃
- 影响模块:SafeAreaInsetsProvider / Worker TurboModule / Window
- 提交 / PR:280abaf70 / !1918
- 详细修复内容:该修复将 SafeAreaInsetsProvider 从 AnyThreadTurboModuleContext 和 WorkerTurboModuleContext 中移除,避免 worker 线程再去同步调用窗口属性查询接口。由于 SafeAreaTurboModule 本身始终运行在 UI 线程,这样可以消除 worker 到 UI 的同步等待链路,规避 issue #1541 中的死锁,同时避免 retrieveSafeAreaInsets 经由 JsWindow::OnGetWindowPropertiesSync 进入崩溃路径。
日志
#00 pc 00000000000736fc /system/lib64/platformsdk/libwindow_native_kit.z.so(OHOS::Rosen::JsWindow::OnGetWindowPropertiesSync(napi_env__*, napi_callback_info__*)+212)
#01 pc 0000000000066fd0 /system/lib64/platformsdk/libace_napi.z.so(panda::JSValueRef ArkNativeFunctionCallBack<true>(panda::JsiRuntimeCallinfo*)+288)
#02 pc 0000000000e0d9ec /system/lib64/module/arkcompiler/stub.an(RTStub_PushCallArgsAndDispatchNative+40)
#03 pc 0000000000464908 /system/lib64/module/arkcompiler/stub.an(BCStub_HandleCallthisOImm8V8StwCopy+392)
#04 at retrieveSafeAreaInsets (entry@ohos/react-native-openharmony|0.72.101-5/src/main/ets/RNOH/SafeAreaInsetsProvider.ts:50:76)
#05 pc 0000000000365a54 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::EcmaInterpreter::GeneratorReEnterInterpreter(...)+364)
#06 pc 00000000003652e0 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::GeneratorHelper::Next(...)+192)
#07 pc 0000000000364de4 /system/lib64/platformsdk/libark_jsruntime.so
#08 pc 0000000000364c14 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::builtins::BuiltinsPromiseHandler::AsyncAwaitFulfilled(...)+124)
#09 pc 0000000000e0d578 /system/lib64/module/arkcompiler/stub.an(RTStub_AsmInterpreterEntry+480)
#10 pc 0000000000e0d3d4 /system/lib64/module/arkcompiler/stub.an(RTStub_AsmInterpreterEntry+60)
#11 pc 000000000024ae28 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::JSFunction::Call(...)+792)
#12 pc 00000000005dfdf4 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::builtins::BuiltinsPromiseJob::PromiseReactionJob(...)+492)
#13 pc 0000000000e0d578 /system/lib64/module/arkcompiler/stub.an(RTStub_AsmInterpreterEntry+480)