RNOH 历史版本问题定位大全
RNOH 版本升级、跨版本迁移与历史缺陷回溯的排查方法论与定位指南
在 RNOH 开发中,"升级到新版本后行为变化""同一代码在不同 RNOH 版本表现不一""历史崩溃在低版本偶现"是最容易误判的问题类型之一。本文档给出从现象到根因、从分类到处置的系统化定位方法。
一、问题概述
1.1 什么是"历史版本问题"
RNOH 的版本号形如 0.{RN 主版本}.{鸿蒙化迭代序号}(如 0.77.70),第三位是鸿蒙化独立迭代计数,不等于 RN 社区的补丁版本(见 docs/zh-cn/RNOH与RN版本关系.md)。RNOH 采用"固定版本采用"策略:仅选取 RN 社区特定大版本(0.72.5/0.77.1/0.82.1/0.84.1)做鸿蒙化适配,社区补丁不合入,鸿蒙平台特有 Bug 在自研迭代序号上修复(见 docs/zh-cn/RNOH与RN版本关系.md §二)。
由此产生三类与"版本"强相关的问题:
- 同一 JS 代码在不同 RNOH 版本线(0.72 / 0.77 / 0.82 / 0.84)行为不一致;
- 升级版本后出现编译失败、运行崩溃、白屏或交互变化;
- 某个历史崩溃/冻屏,在低版本偶现,需判断是否已被某次迭代修复。
1.2 为什么必须先分类再处理
并非所有"升级后变了"都是 Bug。RNOH 的演进同时包含三类性质完全不同的变更,处置方向相反:
- 把一个上游不兼容变更当成 Bug 去回退框架版本,会错过安全更新并长期偏离上游;
- 把一个已被修复的历史缺陷当成"平台特性"放任,会导致开发者带着已知问题反复排错;
- 把一个构建配置错配当成代码 Bug 去改业务代码,会越改越乱。
因此定位流程的第一步是分类,而不是第一步就改代码或回退版本。
1.3 三类版本问题的性质
| 类别 | 定义 | 是否需修复 |
|---|---|---|
| 历史缺陷(已在迭代修复) | RNOH 在某次鸿蒙化迭代中已修复的崩溃/冻屏/内存问题(如 FontRegistry 死锁、EventEmitter UAF);低版本未含修复故偶现 | ✅ 升级到含修复的迭代版本 |
| 上游不兼容变更 | RN 社区在版本演进中引入的 API/行为/类型变更(refs 废弃、onLayout 优先级降低、codegen 入参检查趋严) | ✅ 按上游要求适配业务/三方代码 |
| 配置与构建错配 | 升级后工程配置未同步:源码↔release 构建、RNOH_C_API_ARCH、bundle 缓存、codegen 产物路径、folly 编译选项 | ✅ 修正工程配置 |
二、排查思路与整体分析
2.1 核心判定流程
定位版本问题的关键是回答一个问题:该行为差异是"已被 RNOH 修复的缺陷",还是"上游契约变更",还是"工程配置未同步"?
flowchart TB
A["升级或换版后行为变化或历史崩溃"] --> B{"是否能在版本线稳定版<br/>release-notes 或稳定性修复汇总中<br/>找到对应修复条目?"}
B -->|"是: 命中历史缺陷"| C["分类: 历史缺陷<br/>→ 升级到含修复的迭代"]
B -->|"否"| D{"上游 RN 是否在该版本<br/>引入了不兼容变更?"}
D -->|"是: 命中上游变更表"| E["分类: 上游不兼容变更<br/>→ 按变更说明适配代码"]
D -->|"否"| F{"是否随升级改变<br/>构建模式、依赖或产物路径?"}
F -->|"是: 源码与 release 构建或缓存"| G["分类: 配置与构建错配<br/>→ 修正工程配置"]
F -->|"否"| H["转入通用缺陷定位<br/>黑屏、崩溃或三端差异"]
C -.->|已修复| I["核对引入版本号"]
E -.->|需适配| J["按上游 PR 适配代码"]
G -.->|配置同步| K["清理产物并对齐配置"]
2.2 排查总思路:先定版本边界,再沿三层定位
版本问题定位的本质是先确定"现象在哪两个版本之间分叉",再沿 RNOH 三层链路找到分叉点:
版本边界(哪个版本引入/修复) → 分层定位(JS层 / 桥接层 / 原生层) → 变更性质(缺陷/上游变更/配置)
排查应按以下顺序逐层推进,每一层都读真实源码与 release 记录:
- 锁定版本边界 — 用稳定版号、release-notes、稳定性历史修复汇总确认现象在哪两个版本之间变化;
- 区分变更来源 — 是 RNOH 自研迭代修复(鸿蒙平台特有),还是 RN 上游引入(跨 iOS/Android/鸿蒙一致);
- 核对工程配置 — 是否随升级切换了构建模式、依赖路径、产物路径或混淆配置;
- 判定问题性质 — 用 2.1 流程归入三类之一;
- 核验代码引用 — 每条引用必须指向真实读过的文件或在线 release 记录。
关键原则:版本对比只回答"在哪个版本分叉、分叉属于哪类"。找到分叉版本后,具体的崩溃根因(如锁顺序、UAF)按《黑屏白屏与渲染异常定位指南》《三端不一致定位指南》继续向下分析,不在本流程内重复。
2.3 RNOH 版本问题常见模式速查
| 模式 | 分类 | 说明 |
|---|---|---|
| 低版本偶现崩溃,高版本不复现 | 历史缺陷 | 命中稳定性历史修复汇总某条目(如 0.72.86 getSDKApiVersion 多线程 SIGABRT) |
| 升级大版本后编译/打包失败 | 上游不兼容变更 | 命中上游不兼容变更表(refs 废弃、enableOptimisedVirtualizedCells 移除等) |
| 升级后交互时序变化 | 上游不兼容变更 | 上游调整了事件优先级/默认值(如 onLayout 优先级降低、列表锚点策略变更) |
| 切 release 构建后链接报错 | 配置与构建错配 | F14LinkCheck/kEmptyTagVector、hermes/hermes.h not found、OH_GetSdkApiVersion 未定义 |
| 装新 HAP 后行为仍是旧的 | 配置与构建错配 | FileJSBundleProvider 设备缓存未清除,加载了旧 bundle |
release 混淆后 undefined 崩溃 | 配置与构建错配 | 混淆把 ArkTS 内联方法名改写,运行时找不到(如 px2vp) |
| 同一行为三端都变 | 上游不兼容变更 | 非 RNOH 独有,参见 docs/zh-cn/RNOH与RN社区共性问题清单.md |
三、分步排查过程(工具使用)
源码与文档查阅:文中引用可在本地仓库或社区仓库在线打开——RNOH 源码:
ohos_react_native/{文件路径};RNOH 文档:https://gitcode.com/CPF-RN/ohos_react_native/blob/main/docs/zh-cn/{文件路径}。
3.1 排查准备:确认版本基线与复现边界
定位版本问题的第一步不是读源码,而是把版本号与复现边界钉死:
- 三处版本号必须对齐:
- RN 工程
package.json的react-native(必须落在 RNOH 指定的固定补丁版,如0.77.1,不要用0.77.2/0.77.3,见docs/zh-cn/RNOH与RN版本关系.md§二); - RN 工程的
@react-native-oh/react-native-harmony(前端 JS 侧,走 npm0.XX-stabledist-tag); - 鸿蒙工程
oh-package.json5的@rnoh/react-native-openharmony(原生侧,用与前端同号的具体版本号,ohpm 无 dist-tag)。实时查询某版本线当前 stable 指向:
npm view @react-native-oh/react-native-harmony dist-tags(见docs/zh-cn/05-运维/版本说明.md)。
- RN 工程
- 记录当前 RNOH 源码版本:本仓库
packages/react-native-harmony/package.json中"version"字段(当前为0.84.3,对齐上游0.84.1,见 [源码]packages/react-native-harmony/package.json)。 - 双版本复现:用同一段最小化 JS 代码,分别在"问题版本"与"目标版本/最新 stable"上运行,确认差异确实由版本引起(排除业务代码与缓存干扰)。
- 收集两端日志:鸿蒙端用
hilog/ DevEco Studio LogView + FaultLog;崩溃抓CppCrash/AppFreeze。对比两版本在同一操作下的事件序列与堆栈。
3.2 步骤 1:锁定版本边界
目标:确定现象"在哪个版本引入"或"在哪个版本修复",得到一个 [旧版本] → [新版本] 的分叉区间。
在哪查:
| 资料位置 | 用途 |
|---|---|
docs/zh-cn/05-运维/release-notes/react-native-harmony-v0.84.*.md [在线源码] | 0.84 系列每次迭代的 Added/Fixed 条目(带 commit 链接) |
docs/zh-cn/05-运维/稳定性历史修复/{0.72,0.77,0.82}稳定性修复汇总/README.md [在线源码] | 按版本线汇总的历史崩溃/冻屏/内存/资源修复,按修改日期排序,便于按故障现象回溯 |
本仓库 CHANGELOG.md [源码] | 顶层变更日志(如 0.84.3 的 Fabric 并行渲染、TextInput 修复,带 commit) |
本仓库 git log --oneline / git log --branches --oneline [源码] | 跨分支(0.72-main/0.77-main/0.82-main/main)查找具体提交 |
要回答的关键问题:现象是否能在"稳定性历史修复汇总"中找到同模块、同现象的条目?找到即说明是历史缺陷,对应条目的"版本"列即修复落地版本。
示例点拨:字体相关死锁在
0.82.3、0.77.44均有修复条目(FontRegistry 锁顺序不一致导致死锁),修复方式是std::scoped_lock原子加锁(见 [在线源码]0.82稳定性修复汇总/02-应用冻屏.md)。若你的现象是"字体加载时卡死",且当前版本低于上述迭代号,即可判定为历史缺陷。
3.3 步骤 2:区分变更来源(RNOH 自研 vs 上游 RN)
目标:判断分叉是"鸿蒙平台特有修复"还是"RN 上游引入的跨平台变更",二者适配责任不同。
判定依据:
- RNOH 自研修复:条目出现在"稳定性历史修复汇总"或 release-notes 的 Fixed 中,描述涉及鸿蒙原生模块(
FontRegistry、RNInstance、TurboModuleProvider、ArkTSBridge、SchedulerDelegate),且社区 iOS/Android 不受影响 → 升级版本即可解决,无需改业务代码。 - RN 上游变更:现象在 iOS/Android/鸿蒙三端一致变化,或命中
docs/zh-cn/05-运维/上游社区不兼容变更.md[在线源码] 的条目 → 必须按上游要求适配业务/三方代码,回退 RNOH 版本无效。
上游变更表关键条目速查(摘自 上游社区不兼容变更.md,含变更来源版本与影响场景):
| 变更 | 来源版本 | 影响 |
|---|---|---|
| 字符串 refs 废弃 | 0.77.0-rc.0 | 编译失败,需改用 React.ElementRef |
onLayout 事件优先级降低为固定异步批量 | 0.74.0 | 运行态:onLayout 及时性变差,影响依赖它的动画/布局时序 |
enableOptimisedVirtualizedCells 标志位移除(默认 true) | 0.77.0-rc.0 | 编译失败 |
concurrentRoot 启动项移除 | 0.77.0-rc.0 | 编译失败 |
| codegen 方法对 null 入参检查趋严 | 0.75.0 | 运行态:在不接受 null 的 TurboModule 方法传 null 会报错 |
SyncCallback 禁止拷贝 | 0.75.0 | 编译失败,需改 move 或创建多个 |
butter 组件移除 | 0.73.0 | C++ 编译失败,需替换命名空间 |
View Manager 定义不再支持 .tsx | 0.73.0 | 打 bundle 报错 |
示例点拨:升级到 0.77 后,依赖
onLayout触发的动画出现"慢一拍"。这命中的是上游变更onLayout 优先级降低(0.74.0 引入,RNOH 0.77 跟随上游),不是 RNOH Bug,应调整业务侧对 onLayout 时序的依赖,而非回退版本。
3.4 步骤 3:核对工程配置与构建模式
目标:排除"升级顺带改变了构建模式/依赖路径/产物路径"导致的假象。这是最易与代码 Bug 混淆的一类。
必查项:
- 构建模式切换:从源码(debug)构建切到 release 预编译构建后,
CMakeLists.txt需补齐 autolinking、hermes 头文件路径、folly 编译选项、系统 NDK 库,否则三方库链接报错(详见docs/zh-cn/三方库Release配置FAQ.md):ReanimatePackage.h等找不到 → 缺 autolinking 配置(include(autolinking.cmake)+autolink_libraries);hermes/hermes.h file not found→include_directories缺${RNOH_CPP_DIR}/third-party/hermes/API;F14LinkCheck::check()/kEmptyTagVector未定义 → 三方包缺-DFOLLY_MOBILE=1(推荐add_compile_options(${folly_compile_options})统一);OH_GetSdkApiVersion未定义 →rnoh链接列表缺libdeviceinfo_ndk.z.so。
- **
RNOH_C_API_ARCH**:CAPI 版本启动闪退,日志提示未设置RNOH_C_API_ARCH→ 设环境变量RNOH_C_API_ARCH=1,重启 IDE,Build > Clean Project后重编;不生效则删.cxx目录(见 [在线源码]docs/zh-cn/03-调测/运行类FAQ.md)。 - bundle 缓存:
FileJSBundleProvider从设备路径(如/data/storage/el2/base/files/bundle.harmony.js)加载,优先级高于 HAP 内 rawfile bundle,且HAP 更新后不会自动清除。每次装新 HAP 前必须hdc shell "rm -f /data/storage/el2/base/files/bundle.harmony.js",否则加载旧 bundle 制造"升级没生效"假象(见 [源码]JSBundleProvider.tsFileJSBundleProvider.getBundle,及docs/开发者指南/03-开发调试/OpenHarmony运行RN应用.md§2.6)。 - codegen 产物路径:release 字节码包报
cannot find record '&@rnoh/react-native-openharmony/generated/ts&<版本>'→ codegen 把 ets 生成到oh_modules下导致运行时找不到 record;自 CLI0.77.23起用--ets-output-path生成到源码目录并调整 import 路径(见 [在线源码]运行类FAQ.md)。 - 混淆配置:release 混淆把 ArkTS 内联声明的方法名改写,运行时解析成
undefined崩溃(如px2vp)→ 历史修复见0.72.128/0.77.59/0.82.17,升级到含修复版本或调整混淆保留规则。 - 更新环境后旧产物:
ohpm install或同步依赖后,旧.cxx/oh_modules/build 缓存未清 →Build > Clean Project+ 手动删.cxx、oh_modules+Sync and Refresh Project(见 [在线源码]docs/zh-cn/03-调测/定位定界指导类FAQ.md)。
3.5 步骤 4:判定问题性质
目标:套用 2.1 判定流程,把差异归入三类之一,并给出判定依据(引用 release 条目或上游变更表)。
回答三个问题:
- 现象是否能在稳定性历史修复汇总/release-notes 中找到同模块同现象的已修复条目?(是 → 历史缺陷)
- 现象是否命中上游不兼容变更表或三端一致变化?(是 → 上游不兼容变更)
- 升级是否顺带改变了构建模式/依赖路径/产物路径/混淆?(是 → 配置与构建错配)
输出:分类(历史缺陷 / 上游不兼容变更 / 配置与构建错配)+ 判定依据(引用具体 release 条目或上游 PR)。
3.6 步骤 5:核验代码与版本引用
目标:输出结论前,确保每条引用都指向真实读过的代码或 release 记录,杜绝"想当然"。
- 历史缺陷引用必须给出修复落地版本号与修复汇总条目链接(commit/MR);
- 上游变更引用必须给出变更来源版本与上游 PR/commit(见
上游社区不兼容变更.md); - 配置问题引用必须给出具体修改文件(如
entry/src/main/cpp/CMakeLists.txt、build-profile.json5); - 在线查阅得到的标注
[在线源码],本地源码标注[源码],未读引用标注[待确认],绝不编造。
3.7 工具速查
| 工具 | 用途 | 示例 |
|---|---|---|
npm view ... dist-tags | 查某版本线 stable 当前指向 | 确认 0.77-stable 当前具体版本号 |
| 稳定性历史修复汇总 | 按版本线回溯历史崩溃/冻屏 | 在 0.72稳定性修复汇总 搜"ScrollView"找修复版本 |
| release-notes | 0.84 系列逐迭代 Added/Fixed | 确认某修复是否在 0.84.3 已合入 |
git log --branches --oneline | 跨分支查提交 | 在 0.82-main 与 main 间定位某 commit |
| DevEco FaultLog / hilog | 崩溃与运行日志对比 | 对比两版本 CppCrash 堆栈 |
hdc shell rm ... | 清 bundle/缓存 | 装新 HAP 前清 FileJSBundleProvider 缓存 |
| AI 辅助定位 | 堆栈 + 版本号 → 根因 | rnoh-version-issue-analyzer(触发词:版本差异、升级回归) |
四、根因定位
4.1 定位方法:找到版本分叉点
根因定位的本质是先用 release 记录锁定分叉版本,再回到源码确认修复机制,最后对分叉分类。方法:
- 从步骤 1 锁定的版本区间出发,查稳定性历史修复汇总/release-notes,找同模块同现象条目;
- 命中条目则读其"详细修复内容",回到本仓库源码核对修复机制是否与现象吻合;
- 用 4.2 的模式表识别分叉类型,用 4.3 的五问模板固化结论。
示例点拨:
FontRegistry死锁的分叉点落在0.82.3/0.77.44。回到源码核对:FontRegistry.cpp中addFontData用std::scoped_lock lock(m_fontFileContentByFontFamilyMtx, m_fontCollectionMtx)原子获取两把锁(见 [源码]src/main/cpp/RNOH/FontRegistry.cpp),正是为消除"JS 线程与 UI 线程加锁顺序相反"的死锁。若你的堆栈停在FontRegistry::addFontData的mutex::lock,且版本低于修复版本,即可判定为该历史缺陷。
4.2 分叉模式识别指南
对照 2.3 速查表,每种给出"如何识别"与"在哪找":
| 模式 | 如何识别 | 在哪找 |
|---|---|---|
| 低版本偶现崩溃,高版本不复现 | 堆栈模块名与稳定性修复汇总某条目"影响模块"一致 | 05-运维/稳定性历史修复/{ver}稳定性修复汇总/01-应用异常退出.md |
| 升级大版本后编译/打包失败 | 报错信息命中上游变更表(refs/标志位/命名空间) | 05-运维/上游社区不兼容变更.md |
| 升级后交互时序变化 | 现象三端一致,命中 onLayout 优先级/列表锚点变更 | 上游变更表 + 上游 PR |
| 切 release 后链接报错 | 链接错误含 F14LinkCheck/hermes.h/OH_GetSdkApiVersion | 三方库Release配置FAQ.md |
| 装新 HAP 行为仍是旧的 | 日志显示加载的 bundle 路径为设备文件而非 rawfile | JSBundleProvider.ts + OpenHarmony运行RN应用.md |
| release 混淆后 undefined 崩溃 | JS Crash 堆栈指向被混淆的方法名 | release-notes 搜"混淆/px2vp/undefined" |
4.3 结论五问模板
每次定位完,用下表固化结论(作为待填模板,而非预填答案):
| 问题 | 含义 |
|---|---|
| What | 现象是什么(崩溃/编译失败/行为变化,JS 侧可观察) |
| When | 在哪个版本引入 / 在哪个版本修复(版本号 + 修复汇总条目) |
| Where | 代码/配置何处(指明文件,源码或在线源码) |
| 分类 | 历史缺陷 / 上游不兼容变更 / 配置与构建错配 |
| 分类依据 | 为什么归入此类(引用 release 条目或上游 PR) |
五、解决方案
5.1 何时提出修复
仅在以下情况提出修复:
- 命中历史缺陷且当前版本低于修复落地版本 → 升级到含修复的迭代版本(首选);
- 命中上游不兼容变更 → 按上游变更说明适配业务/三方代码,不要回退 RNOH 版本;
- 命中配置与构建错配 → 修正工程配置,不要改业务代码。
以下情况不要提出修复:现象是上游合理的跨平台行为变更且 RN 文档已说明;现象已在最新 stable 修复但你未升级;现象实际由 bundle 缓存或旧产物导致而非代码。
5.2 修复策略
适用时按以下策略之一落地。任何方案都必须指明文件/版本、改动思路与风险评估,并配套测试。
| 策略 | 适用场景 | 方法 |
|---|---|---|
| 升级到含修复的迭代版本 | 历史缺陷 | 升级 @rnoh/react-native-openharmony(ohpm 具体版本号)与 @react-native-oh/react-native-harmony(npm 0.XX-stable)到含修复版本;前端 RN 锁定在 RNOH 指定固定补丁版 |
| 按上游变更适配代码 | 上游不兼容变更 | 字符串 refs → React.ElementRef;onLayout 时序依赖 → 改用 useLayoutEffect/显式测量;codegen null 入参 → 补 null 校验;SyncCallback 拷贝 → 改 move |
| 补全 release 构建配置 | 源码↔release 切换 | autolinking + hermes 头文件 + FOLLY_MOBILE=1 + libdeviceinfo_ndk.z.so(见 三方库Release配置FAQ.md 参考配置片段) |
| 清理缓存与产物 | bundle 缓存/旧产物 | rm .cxx oh_modules + hdc shell rm 设备 bundle 缓存 + Sync and Refresh Project |
| 调整 codegen/混淆配置 | 产物路径/混淆 | codegen 用 --ets-output-path 生成到源码目录;混淆保留规则保留被内联引用的方法名 |
风险评估要点:跨大版本升级(0.72→0.77→0.82→0.84)需同步升级
react/react-native/@react-native-community/cli/@react-native/babel-preset等依赖到对应版本,并改babel.config.jspresets(见docs/zh-cn/05-运维/版本升级指导.md[在线源码]);升级后必须回归现有 iOS/Android 行为与三端差异。
5.3 仅文档输出(现象为上游合理变更时)
当分类为"上游不兼容变更"且属于 RN 既定演进方向时,输出应:清晰记录变更及上游来源版本;解释新行为机制;说明开发者侧影响;给出业务侧适配模式(如"用 React.ElementRef 代替字符串 ref""减少对 onLayout 时序的强依赖")。
六、经验总结
6.1 六条核心教训
- 先确认三处版本号对齐 —
react-native必须落在 RNOH 指定固定补丁版,社区补丁不合入;前端0.XX-stable与原生具体版本号同号发布。版本号不对齐是一切误判的源头。 - 先查"是否已被修复"再读源码 — 稳定性历史修复汇总按版本线、按现象分类编排,命中条目即可省去源码级分析,直接升级。
- 区分 RNOH 自研修复与上游变更 — 自研修复升级即解,上游变更必须改代码;三端一致变化几乎都是上游,不是 RNOH Bug。
- 不要把构建配置错配当代码 Bug — 切 release、bundle 缓存、codegen 路径、混淆是"升级没生效/行为异常"的高频假象,先清缓存对齐配置。
- 不要用回退版本代替适配上游 — 上游不兼容变更是演进方向,回退 RNOH 版本无效且会错过安全更新。
- 不要跳过版本核验 — 每条引用指向真实读过的 release 条目或源码,未读标
[待确认],绝不编造版本号或 commit。
6.2 排查清单(Checklist)
- 三处版本号已对齐(
react-native固定补丁版 + 前端 stable + 原生同号) - 已在稳定性历史修复汇总/release-notes 中搜索同模块同现象条目
- 已判定分叉属于 RNOH 自研修复还是上游变更(三端是否一致)
- 已核对构建模式/依赖路径/产物路径/混淆是否随升级变化
- 已清理 bundle 缓存与旧构建产物后复现
- 若为历史缺陷:已指明修复落地版本号
- 若为上游变更:已指明变更来源版本与上游 PR
- 若为配置错配:已指明具体修改文件与配置项
6.3 常见误区对照
| 误区 | 正解 |
|---|---|
| "升级后崩了,RNOH 新版本有 Bug,回退" | 先查稳定性修复汇总;可能是上游变更或配置错配,回退反而错过修复 |
| "0.77.70 的第三位等于 RN 0.77 的第 70 个补丁" | 第三位是鸿蒙化独立迭代序号,与 RN 补丁版本无关 |
| "RN 社区出了 0.77.3,我也升上去" | RNOH 仅采用固定补丁版(0.77.1),社区补丁不合入,擅自升 RN 补丁会破坏稳定性 |
| "装了新 HAP 还是一样的行为,代码没改对" | FileJSBundleProvider 设备缓存优先级高于 rawfile,先 hdc shell rm 清缓存 |
| "切 release 后链接报错,是三方库 Bug" | 是工程 CMakeLists.txt 缺 autolinking/folly 选项/系统库,按 三方库Release配置FAQ.md 补齐 |
| "引用大概在哪个版本修了就行" | 必须指明具体修复落地版本号,读过的才算数 |
附录
附录 A:版本线与历史缺陷分叉高发区
下图标注了 RNOH 版本问题的分叉高发层:
flowchart TB
subgraph VER["版本边界(先定分叉版本)"]
V1["稳定性历史修复汇总<br/>release-notes<br/>⚠️ 命中=历史缺陷"]:::ver
end
subgraph SRC["变更来源判定"]
S1["RNOH 自研修复<br/>鸿蒙原生模块<br/>✅ 升级即解"]:::own
S2["RN 上游变更<br/>三端一致<br/>⚠️ 需适配代码"]:::up
end
subgraph CFG["配置与构建层(高发假象区)"]
C1["源码↔release 构建<br/>folly/hermes/autolinking"]:::warn
C2["bundle 缓存<br/>FileJSBundleProvider"]:::warn
C3["codegen 产物路径<br/>--ets-output-path"]:::warn
C4["release 混淆<br/>方法名改写"]:::warn
end
V1 --> S1
V1 --> S2
V1 -.配置未同步.-> C1
V1 -.配置未同步.-> C2
V1 -.配置未同步.-> C3
V1 -.配置未同步.-> C4
classDef ver fill:#dbeafe,stroke:#3b82f6
classDef own fill:#dcfce7,stroke:#16a34a
classDef up fill:#fef3c7,stroke:#d97706
classDef warn fill:#fee2e2,stroke:#dc2626
分叉高发区说明:
| 层 | 高发模式 | 排查动作 |
|---|---|---|
| 版本边界 | 低版本偶现、高版本不复现 | 查稳定性修复汇总,锁定修复落地版本 |
| 变更来源 | 上游引入的 API/类型/时序变更 | 查上游不兼容变更表,确认三端是否一致 |
| 构建模式 | 切 release 后链接/头文件/系统库报错 | 按 三方库Release配置FAQ.md 补齐 CMakeLists |
| 产物缓存 | 装新 HAP 行为不变 | 清 FileJSBundleProvider 设备缓存 + .cxx/oh_modules |
| 混淆 | release 后 undefined 崩溃 | 升级含修复版本或调混淆保留规则 |
附录 B:判定流程图(完整版)
flowchart TB
A["升级/换版后行为变化或历史崩溃"] --> B{"稳定性修复汇总/<br/>release-notes 命中?"}
B -->|"是"| C["历史缺陷<br/>→ 升级到含修复版本"]
B -->|"否"| D{"命中上游不兼容变更/<br/>三端一致?"}
D -->|"是"| E["上游不兼容变更<br/>→ 按上游 PR 适配代码"]
D -->|"否"| F{"构建模式/依赖路径/<br/>产物/混淆 变化?"}
F -->|"是"| G["配置与构建错配<br/>→ 修正工程配置"]
F -->|"否"| H["转入通用缺陷定位"]
C --> C1["指明修复落地版本 + 升级三处版本号"]
E --> E1["指明变更来源版本 + 上游 PR + 改动文件"]
G --> G1["指明修改文件 + 清缓存 + 对齐配置"]
附录 C:版本号与代码引用格式约定
- 版本线:
0.72.x/0.77.x/0.82.x/0.84.x(x为鸿蒙化迭代序号) - 稳定版:
0.XX-stable(npm dist-tag,随迭代前移,不锁版本号) - 历史缺陷引用:
修复落地版本号 + 稳定性修复汇总条目 + commit/MR 链接 - 上游变更引用:
变更来源版本 + 上游 PR/commit - 本仓库源码标注
[源码],在线文档标注[在线源码],未读标注[待确认],绝不编造
附录 D:相关资料
- 版本关系:RNOH 与 RN 版本关系 — 版本号命名规则、固定版本采用策略、开发者协同建议
- 版本升级指导:[在线源码]
docs/zh-cn/05-运维/版本升级指导.md— 小版本升级、大版本升级(0.72→0.77→0.82→0.84)依赖与配置改动 - 版本说明:[在线源码]
docs/zh-cn/05-运维/版本说明.md— dist-tag 命名、稳定版安装、实时查询 - 上游不兼容变更:[在线源码]
docs/zh-cn/05-运维/上游社区不兼容变更.md— 22 条上游变更的影响与适配 - 稳定性历史修复:[在线源码]
docs/zh-cn/05-运维/稳定性历史修复/{0.72,0.77,0.82}稳定性修复汇总/— 按版本线分类的历史崩溃/冻屏/内存/资源修复 - release-notes:[在线源码]
docs/zh-cn/05-运维/release-notes/— 0.84 系列逐迭代 Added/Fixed - 三方库 Release 配置 FAQ:三方库 Release 配置 FAQ — 源码↔release 切换的 C++ 编译链接错误根因与解决
- 运行类 FAQ:[在线源码]
docs/zh-cn/03-调测/运行类FAQ.md— 启动闪退、libRNOHApp is undefined、codegen record 找不到 - 稳定性问题定位:[在线源码]
docs/zh-cn/03-调测/RNOH应用稳定性问题定位指南.md— 内存泄漏/卡死/崩溃的日志与符号化方法 - AI 辅助问题定位:[在线源码]
docs/zh-cn/05-运维/AI辅助问题定位指导.md— 借助 AI 结合堆栈与版本号快速获得根因 - OpenHarmony 运行 RN 应用:OpenHarmony 运行 RN 应用 — 开发板版本差异与版本专属 patch
- 配套指南:黑屏白屏与渲染异常定位指南 · 三端不一致定位指南
更多推荐

所有评论(0)