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
- 详细内容:修复核心是把
stop与unregisterSurface的职责明确留在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.cpp和CMakeLists.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
- 问题描述:
SafeAreaInsetsProvider、KeyboardObserverTurboModule和StatusBarTurboModule中手工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直接对thisArg做Unwrap,当属性需要沿原型链查找或getPropertyNames()抛异常时,枚举路径可能直接崩溃。 - 影响模块:HostObjectProxy
- 问题类型:CPPCrash
- 提交 / PR:a300a2aea / !2345
- 详细内容:修复先沿 prototype chain 查找能够成功
Unwrap的HostObjectProxy,找不到时抛出明确错误;同时给getPropertyNames()、数组创建和元素写入补上JSError、std::exception和兜底异常处理,避免枚举阶段直接 crash。
23. Dragging 状态结束时直接切换内部状态导致滑动崩溃
- 修改日期:2026-03-10
- 版本:0.77.59
- 问题描述:
DraggingScrollViewInternalState在onDragStop()和onScrollStop()中直接发送结束事件并立即切换内部状态,拖拽停止与状态切换交叉时会触发滑动路径崩溃。 - 影响模块:ScrollView / Gesture 相关路径
- 问题类型:CPPCrash
- 提交 / PR:d37c68305 / !2364
- 详细内容:修复把拖拽停止和滚动停止后的状态切换下沉到
ScrollViewComponentInstance::onDraggingScrollDragStop()和onDraggingScrollStop(),由组件实例统一先发送onScrollEndDrag,再安全创建并切换到Settling或Idle状态,避免在内部状态对象中直接切换引发崩溃。
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())的分桶结果,分别处理movableCreates和deferredTail,保证 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判空,避免对象已经回收后再次进入清理路径。