01-应用异常退出

本文件汇总该版本中归类为应用异常退出的历史修复,包含 CppCrash、JS Crash、abort、兼容性崩溃以及生命周期与并发场景下最终表现为进程退出的问题。

1. Alert 关闭后重复点击按钮导致回调重复触发崩溃

  • 修改日期:2025-01-02
  • 版本:0.77.18
  • 问题描述:Alert 弹窗在 cancel 或按钮点击关闭后,AlertManagerTurboModule 仍可能再次执行 action 回调,导致重复回调访问已结束的弹窗状态并崩溃。
  • 影响模块:AlertManagerTurboModule
  • 问题类型:Callback Crash
  • 提交 / PR:00ceb4a64 / !360
  • 详细内容:修复围绕 AlertManagerTurboModule 的按钮点击和关闭路径增加一次性保护,确保 cancel 和点击动作只触发一次有效回调;同时补充 AlertCrashExample 覆盖该问题场景,避免关闭后的重复点击再次把已结束的回调链路拉起。

2. measureLines 处理带附件字符的文本时位置计算错误导致崩溃

  • 修改日期:2025-01-14
  • 版本:0.77.18
  • 问题描述:TextLayoutManager::measureLines() 处理包含 attachment 的文本时,先跳过附件 fragment 会让 startIndex / endIndex 与实际 UTF-16 文本错位,最终在按位置截取 line text 时触发崩溃。
  • 影响模块:TextLayoutManager / onTextLayout
  • 问题类型:Out-of-Range Crash
  • 提交 / PR:2259ec65a / !438
  • 详细内容:修复保留 fragment 中的 attachment 占位字符参与索引计算,再在最终的 u16LineText 里移除 0xFFFC;这样 lineMetrics 给出的 UTF-16 位置仍与源文本一致,不会因为先跳过 attachment 导致 substr() 落到错误区间。同时补充 MeasureLinesCrashExample 作为复现场景。

3. 移除 Animated native event 时继续访问已解绑节点导致崩溃

  • 修改日期:2025-02-13
  • 版本:0.77.18
  • 问题描述:移除 Animated native event 订阅时,AnimatedNodesManager 仍可能按旧映射访问已经解绑的事件节点,导致删除路径崩溃。
  • 影响模块:AnimatedNodesManager
  • 问题类型:Animated Crash
  • 提交 / PR:2083f008a / !506
  • 详细内容:修复收敛了 AnimatedNodesManager.cpp 中 native event 移除路径对事件节点和映射表的访问,避免在解绑后继续沿旧关系查找节点;同时补充 AnimatedTest 覆盖 remove native event 场景,验证删除路径不再触发崩溃。

4. TurboModule 回调在 RNInstance reload / 销毁后继续执行导致崩溃

  • 修改日期:2025-02-24
  • 版本:0.77.18
  • 问题描述:RNInstance reload 或销毁后,TurboModule 持有的 callback 仍可能异步回到 JS runtime,导致应用在频繁 reload 时崩溃。
  • 影响模块:ArkTSTurboModule / CallbackWrapper / RNInstance
  • 问题类型:Lifecycle Crash
  • 提交 / PR:3a334a2d3 / !1843
  • 详细内容:修复把 createIntermediaryCallback() 从创建时立即锁定 CallbackWrapper 改成在 invokeAsync 真正执行时再通过弱引用获取 callback;如果 callback 已经随 RNInstance 或 JS runtime 一起销毁则直接返回,只在成功调用后再 allowRelease(),避免 reload 和销毁阶段访问失效 callback。

5. RNInstance 销毁时异步句柄竞态访问

  • 修改日期:2025-04-07
  • 版本:0.77.18
  • 问题描述:RNInstance 清理过程中,EventLoopTaskRunner 的异步句柄在不同线程间无锁访问,导致 waitForSyncTask 路径出现 crash。
  • 影响模块:EventLoopTaskRunner / ThreadTaskRunner
  • 问题类型:Race Condition Crash
  • 提交 / PR:a0b038182 / !723
  • 详细内容:问题出现在 RNInstance 销毁后半段,修复思路是把 m_asyncHandle 的访问变成线程安全操作,避免 cleanup 与异步发送并发碰撞。

6. 已销毁 surface 上继续 updateConstraints 导致崩溃

  • 修改日期:2025-04-23
  • 版本:0.77.18
  • 问题描述:surface handler 已销毁,但布局测量路径仍触发 updateConstraints / onMeasureSize,导致访问失效 surface。
  • 影响模块:Surface / Layout
  • 问题类型:CPPCrash
  • 提交 / PR:4cfb0174f / !849
  • 详细内容:该修复实质上是把布局更新前提改成 surface handler 仍有效,避免 teardown 之后的迟到回调继续透传到 native 层。

7. Reload 时新旧 RNInstance 注册重叠导致 native crash

  • 修改日期:2025-07-03
  • 版本:0.77.18
  • 问题描述:执行 DevSettings.reload() 时,新实例在旧实例尚未从 inspector 注销前就开始注册,导致 HostInspector 状态冲突并产生 native crash。
  • 影响模块:RNInstanceInternal / HostInspector
  • 问题类型:Lifecycle Crash
  • 提交 / PR:e412de22a / !1229
  • 详细内容:修复增加同步注销能力,使旧实例先从 inspector 中撤销,再允许新实例完成创建与注册。

8. native 路径抛出的 runtime_error 无法被 catch

  • 修改日期:2025-07-18
  • 版本:0.77.18
  • 问题描述:应用在 native 路径抛出 std::runtime_error 后,异常没有按预期被 catch,会直接沿调用链逃逸,导致业务场景中持续出现稳定性故障。
  • 影响模块:RNOH / C++ 异常处理 / 构建链接配置
  • 问题类型:Exception Handling Crash
  • 提交 / PR:2f454b050 / !1296
  • 详细内容:从改动看,修复是在 packages/tester/harmony/react_native_openharmony/src/main/cpp/RNOH/CMakeLists.txt 中为 rnoh_core 显式补充链接 c++_shared。结合 PR 描述可知,这一修改用于修复 native 侧 runtime_error 无法被正常捕获的问题,避免异常在跨库 / 运行时边界上失去可捕获性后直接逃逸,进而把业务异常放大为稳定性问题。

9. TextStorage 清理时机不当导致 ApplyIndent 崩溃

  • 修改日期:2025-08-21
  • 版本:0.77.18
  • 问题描述:文本 fragment 为空或 TextStorage 被释放时,平台侧 MultipleParagraphLayoutAlgorithm::ApplyIndent 仍可能在 VSync 线程访问失效的排版对象,导致崩溃。
  • 影响模块:TextInput / ApplyIndent
  • 问题类型:CPPCrash
  • 提交 / PR:fcde886e8 / !1443
  • 详细内容:修复移除了 disposeTextStorage() 中原先的延迟释放任务,改为立即执行 m_textNode.resetTextContentWithStyledString() 并清空 m_textStorage;同时在 fragments.empty() 分支不再单独重置文本内容,统一由 disposeTextStorage() 负责清理,避免 ApplyIndent 访问已经失效的 Typography 或 TextStorage 对象。

10. EventBeat 析构与 request 跨线程竞争导致 EventBeat::induce 崩溃

  • 修改日期:2025-09-03
  • 版本:0.77.22
  • 问题描述:EventBeat::~EventBeat()EventBeat::request() 分别在 MAIN 和 JS 线程执行时,对 UI ticker 解绑句柄缺少同步保护,OS_VSyncThread 上可能在 EventBeat::induce() 路径触发 SIGSEGV。
  • 影响模块:EventBeat / UITicker
  • 问题类型:Race Condition Crash
  • 提交 / PR:b67afac36 / !1500
  • 详细内容:修复给析构函数和 request() 共享访问的 m_unsubscribeUITickerListener 加上同一把互斥锁,避免一个线程在解绑 listener 时,另一个线程同时注册或访问该 listener,导致 EventBeat::induce() 落到失效对象上。

11. HSP 下 bundle 加载崩溃

  • 修改日期:2025-09-29
  • 版本:0.77.22
  • 问题描述:当 bundle 位于 HSP 模块下时,传入的 resourceManager 与 RN 内部使用的不一致,可能导致 bundle 加载失败并 crash。
  • 影响模块:ResourceJSBundleProvider / bundle 加载链路
  • 问题类型:Bundle Loading Crash
  • 提交 / PR:ee1fe3485 / !1630
  • 详细内容:修复在 bundle 加载前校验 resourceManager 来源,不一致时改用业务侧当前模块的 resourceManager,避免在模块化部署场景下读错资源。

12. 多 ability 场景下共享 AppStorage 覆盖 core context 导致崩溃

  • 修改日期:2025-10-25
  • 版本:0.77.33
  • 问题描述:应用内创建多个 RNInstancesCoordinator 时,共享 AppStorage 中保存的 core context 会被后创建实例覆盖,切换到第二个 ability 时触发崩溃。
  • 影响模块:RNInstancesCoordinator / RNAbility / AppStorage
  • 问题类型:Multi-Ability Crash
  • 提交 / PR:7d7149355 / !1731
  • 详细内容:修复把原先全局单例式的 isInitialized 逻辑改为按 abilityName 缓存 coordinator,并提供 getCoreContextAppStorageKey 可重写扩展点;销毁时再按 ability 清理缓存,避免多能力场景共享 core context 相互覆盖。

13. Metro reload 后打开 PerfMonitor 详情页崩溃

  • 修改日期:2025-12-23
  • 版本:0.77.40
  • 问题描述:Metro reload 后重新打开 PerfMonitor 详情页时,性能指标注册与面板清理状态不同步,导致 PerfMonitor 访问未初始化或已停止的指标状态并崩溃。
  • 影响模块:PerfMonitor / RNInstanceRegistry / RNPerfMonitorView
  • 问题类型:Reload Crash
  • 提交 / PR:75ada6640 / !1579
  • 详细内容:修复在创建 RNInstance 时提前调用 initializePerformanceMetrics(instanceId),保证在记录 REACT_INSTANCE_INIT_START 前性能指标已初始化;同时移除 STOP_PERF_MONITOR 事件中的重复 stop 和 polling 清理路径,避免 reload 后详情页继续访问失效状态。

14. Marker listeners 多线程竞态导致 crash

  • 修改日期:2025-12-24
  • 版本:0.77.40
  • 问题描述:RNOHMarker 的 listener 容器在多线程下缺少同步保护,同时析构函数非 virtual,导致删除派生类对象时存在未定义行为。
  • 影响模块:RNOHMarker
  • 问题类型:Race Condition
  • 提交 / PR:0fa949d32 / !1933
  • 详细内容:修复同时覆盖对象模型和并发访问两方面,避免在 shutdown 或高并发 marker 上报场景中触发竞态性 crash。

15. AnimatedTM 销毁后回调仍执行导致崩溃

  • 修改日期:2026-01-07
  • 版本:0.77.44
  • 问题描述:NativeAnimatedTurboModule 销毁后,VSync 回调仍继续触发 runUpdates,导致回调落到已经析构的模块对象上。
  • 影响模块:NativeAnimatedTurboModule / AnimatedNodesManager
  • 问题类型:CPPCrash
  • 提交 / PR:db3d1196c / !1986
  • 详细内容:问题本质是销毁与回调注销不同步。修复通过在销毁阶段阻断后续动画更新回调,确保 AnimatedNodesManager::runUpdates 不会被已失效的宿主继续调用。

16. Surface 停止时访问已销毁 animationDriver 崩溃

  • 修改日期:2026-01-07
  • 版本:0.77.44
  • 问题描述:surface 停止过程中,LayoutAnimationKeyFrameManager::stopSurface 访问了已销毁 animationDriver,导致退出路径 crash。
  • 影响模块:ArkUISurface / LayoutAnimationKeyFrameManager / UIManager
  • 问题类型:CPPCrash
  • 提交 / PR:f26ff90ef / !1982
  • 详细内容:修复核心是把 stopunregisterSurface 的职责明确留在 RNInstanceCAPI 的主线程生命周期中,确保先停止 surface,再做反注册,避免全局 UI 状态与局部 surface 状态错位。

17. Inspector WebSocket 关闭阶段访问已置空 socket

  • 修改日期:2026-01-15
  • 版本:0.77.44
  • 问题描述:Inspector WebSocket 关闭时,销毁流程访问已被置为 undefined 的 socket,触发 Cannot read property close of undefined 并导致进程崩溃。
  • 影响模块:ArkTSWebsocket / Inspector WebSocket
  • 问题类型:Lifecycle Crash
  • 提交 / PR:1705f2472 / !2004
  • 详细内容:修复同时在 ArkTS 的 close() 与析构逻辑中增加空值与异常防护,避免双重关闭和异常向上冒泡。

18. NodeApi 未初始化时创建 ArkUINode 触发 abort

  • 修改日期:2026-01-15
  • 版本:0.77.44
  • 问题描述:ArkUINode 创建时,ArkUINodeContext / nodeApi 尚未完成初始化,createNode() 返回空指针或上下文为空,最终触发断言失败并 abort。
  • 影响模块:ArkUINode / ArkUINodeContext
  • 问题类型:Abort Crash
  • 提交 / PR:342753b15 / !2048
  • 详细内容:修复通过在节点创建前补齐初始化保护,避免在上下文尚未 ready 的状态下进入节点创建路径。

19. API12 环境崩溃修复

  • 修改日期:2026-02-11
  • 版本:0.77.50
  • 问题描述:API12 环境下存在崩溃问题,提交通过调整相关实现修复兼容性差异。
  • 影响模块:RegisterPageNameTurboModule / 构建配置
  • 问题类型:Platform Compatibility Crash
  • 提交 / PR:73c2cc8aa / !2228
  • 详细内容:从改动文件看,该提交涉及 RegisterPageNameTurboModule.cppCMakeLists.txt,属于平台 API 差异导致的模块适配修复。

20. NativeNodeApi 符号被三方库同名覆盖

  • 修改日期:2026-03-03
  • 版本:0.77.59
  • 问题描述:第三方库中存在与 NativeNodeApi::getInstance() 同名的符号,导致运行时符号解析被覆盖,进而引发异常行为或崩溃。
  • 影响模块:NativeNodeApi
  • 问题类型:Symbol Conflict
  • 提交 / PR:6a8d3d8f8 / !2294
  • 详细内容:这类问题在大型集成应用中较隐蔽,根因不是业务逻辑本身,而是符号导出与链接命名空间冲突。修复价值在于提升与三方库共存时的稳定性。

21. ArkTS 中手工声明 px2vp 在混淆后解析成 undefined error

  • 修改日期:2026-03-07
  • 版本:0.77.59
  • 问题描述:SafeAreaInsetsProviderKeyboardObserverTurboModuleStatusBarTurboModule 中手工 declare function px2vp(...),在混淆后该方法名可能无法正确解析,运行时会触发 undefined error 并崩溃。
  • 影响模块:JS Bundle / Release 混淆
  • 问题类型:Undefined Error Crash
  • 提交 / PR:629073ab8 / !2340
  • 详细内容:修复删除这三个 ArkTS 文件中多余的 px2vp 手工声明,避免混淆后继续走到不可识别的方法名解析路径,从而消除 undefined error 崩溃。

22. Enumerator 直接 unwrap thisArg 且缺少异常处理导致崩溃

  • 修改日期:2026-03-09
  • 版本:0.77.59
  • 问题描述:HostObjectProxy::Enumerator 直接对 thisArgUnwrap,当属性需要沿原型链查找或 getPropertyNames() 抛异常时,枚举路径可能直接崩溃。
  • 影响模块:HostObjectProxy
  • 问题类型:CPPCrash
  • 提交 / PR:a300a2aea / !2345
  • 详细内容:修复先沿 prototype chain 查找能够成功 UnwrapHostObjectProxy,找不到时抛出明确错误;同时给 getPropertyNames()、数组创建和元素写入补上 JSErrorstd::exception 和兜底异常处理,避免枚举阶段直接 crash。

23. Dragging 状态结束时直接切换内部状态导致滑动崩溃

  • 修改日期:2026-03-10
  • 版本:0.77.59
  • 问题描述:DraggingScrollViewInternalStateonDragStop()onScrollStop() 中直接发送结束事件并立即切换内部状态,拖拽停止与状态切换交叉时会触发滑动路径崩溃。
  • 影响模块:ScrollView / Gesture 相关路径
  • 问题类型:CPPCrash
  • 提交 / PR:d37c68305 / !2364
  • 详细内容:修复把拖拽停止和滚动停止后的状态切换下沉到 ScrollViewComponentInstance::onDraggingScrollDragStop()onDraggingScrollStop(),由组件实例统一先发送 onScrollEndDrag,再安全创建并切换到 SettlingIdle 状态,避免在内部状态对象中直接切换引发崩溃。

24. performTransaction 中 Create mutations 分桶与并行处理顺序不安全

  • 修改日期:2026-03-10
  • 版本:0.77.59
  • 问题描述:SchedulerDelegate::performTransaction() 在处理 transaction 时需要先对 Create mutations 做分桶再并行处理,顺序不安全会让可移动的创建操作和延后处理的 mutation 发生错序。
  • 影响模块:Fabric / UIManager
  • 问题类型:Data Race / Ordering Risk
  • 提交 / PR:b79148ba1 / !2370
  • 详细内容:修复在 performTransaction() 的两条处理路径中统一使用 bucketizeCreateMutations(transaction->getMutations()) 的分桶结果,分别处理 movableCreatesdeferredTail,保证 Create mutations 按安全顺序进入并行与后续处理流程,避免 transaction 执行时出现错序。

25. Getter 共享栈上下文且异步清理重复执行导致崩溃

  • 修改日期:2026-03-14
  • 版本:0.77.59
  • 问题描述:HostObjectProxy::Getter 使用进程级共享的 getterStack 保存上下文,同时 JSVMPointerValue 异步投递清理任务时没有再次确认链表头是否有效,属性读取与清理交叉时可能崩溃。
  • 影响模块:HostObjectProxy / JSVMRuntime
  • 问题类型:CPPCrash
  • 提交 / PR:91deae59c / !2397
  • 详细内容:修复将 HostObjectProxy::getterStack 改为 thread_local,避免不同线程共享 GetterContext;同时在 jsQueue->runOnQueue() 异步执行 CleanUp() 前增加 head 判空,避免对象已经回收后再次进入清理路径。