Files
future-harmony-freeze-oom-fix/需求开发文档.md
T

87 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 期货 HarmonyOS 客户端稳定性治理需求开发文档
## 1. 文档目的
本文将现有冻结(App Freeze)与内存溢出(OOM)整改记录整理为可研发落地、可测试验收的需求。目标是在不改变行情、交易、画线业务协议及用户可见规则的前提下,降低主线程阻塞、请求重复与对象滞留风险。
本文记录的是已验证改造的需求基线,不代表所有项均已随正式版本发布;版本接入与线上复采必须以各上游仓库和发布包为准。
## 2. 范围与代码归属
| 域 | 主要归属 | 本次目标 |
| ------ | ------------------------------------------------------------------- | --------------------- |
| 应用业务 | `harmony-ths-futures` | 交易、行情与 WebView 生命周期治理 |
| 通信 | `ohos_mobile_lib_communication` | 解码、曲线解析、请求队列与缓冲释放 |
| 交易 SDK | `harmony_futures_trade_sdk` `futures_trade_sdk`(原生 `lib-weituosdk`) | Native 锁规避、成交推送、市价缓存 |
| 画线 SDK | `hmdrawlinebasicsdk` | 绘制候选集去重 |
## 3. 功能需求
### FR-01 通信与解析异步化
1. XML 响应的字节解码和属性解析必须在 TaskPool 中完成;主线程仅消费解析结果。解析入口只允许携带可序列化数据,禁用 DOCTYPE,并保持登录会话、验证码、手机号查询的原有回调与失败语义。
2. `HXZip` 解压及曲线的 `points × fields` 解析必须在通信 HAR 的持久 Worker 中执行。响应须按请求顺序串行回调;Worker 异常须拒绝当前等待任务,但不得阻断后续消息。
3. `QueueManagement` 必须维护 `instanceId → client/companion` 索引,避免响应分发遍历全部客户端;跨 `frameId` 切换时,必须释放旧请求缓冲、主/伴随 client 映射。
### FR-02 行情与绘制主线程削峰
1. 表格实时通知在同一事件循环内仅保留最新一份 `TableData`,已有定时器时不得继续创建闭包;切页或释放时必须取消定时器并清空待通知数据。
2. 画线候选集去重必须保持“同对象、本地 ID 相同或远端 ID 相同即重复”的既有语义与插入顺序,复杂度由 O(n²) 降为 O(n)。
### FR-03 交易链路防重复与锁规避
1. 前台交易页的在线判断必须读取 `currentAccount.isOnline` 缓存,不得同步调用 Native 在线查询;断网、重登、切账号后的条件单补查行为保持不变。
2. 同一账号重登必须复用进行中的 Promise;无实际拦截效果的交易发送前 SDK 状态检查必须移除。
3. 挂单查询进行中再次触发时,只保留一次尾随刷新;列表构建中的套利灰度判断按账号缓存,并在设置更新、账号或灰度配置变化时失效。
4. 成交推送必须按唯一标识去重。首次加载可全量排序,后续记录必须以稳定二分插入,且不改变成交量、盈亏、账号过滤与展示顺序。
5. 市价缓存须按“合约 + 价格类型”更新同一节点;消费后必须用可修改数组操作删除节点,禁止重复累积。
### FR-04 页面与请求资源释放
1. `TableRequestClient` 切页、取消订阅或释放时,必须幂等地移除旧队列映射、实时订阅、请求缓冲与待通知数据。
2. WebView 总览页销毁时,必须停止三个行情请求并清空 client 与 JS bridge 的双向引用。
## 4. 影响面
本章仅描述应用层、ArkTS SDK 和画线 SDK 的业务影响,不包含 `ohos_mobile_lib_communication` 的 Worker、解压、曲线解析、队列索引及跨 Frame 缓冲等内部修改,也不包含 `futures_trade_sdk` 原生 `lib-weituosdk` 的 C++ 锁优化。
同一功能涉及上游 SDK 实现和应用 HAR 接入时,分别列入对应代码库。
### 4.1 `harmony-ths-futures`
| 类型 | 业务入口 | 应用层改动 | 保持不变 | 重点回归 |
| --- | --- | --- | --- | --- |
| Freeze | 登录、验证码、手机号查询 | XML 解码与属性解析改为异步执行,主线程只处理结果 | 请求协议、回调接口、Cookie 与手机号存储规则 | Upass 登录、验证码成功/失败、手机号回填、用户切换、损坏 XML |
| Freeze | K 线详情与画线 | 接入画线去重优化 HAR,并通过 overrides 统一依赖版本 | 画线数据、样式、顺序、命中及编辑规则 | HAR 依赖唯一性、多画线滑动、周期切换、跨周期画线 |
| Freeze | 交易页前后台、断网重登、挂单刷新 | 在线状态改读应用缓存;同账号重登复用进行中任务;挂单请求合并并保留一次尾随刷新;套利开关按账号缓存 | 下单/撤单流程、查询结果、重登回调及条件单补查时机 | 前后台切换、断网恢复、账号切换、挂单/委托刷新、灰度配置更新 |
| Freeze | 成交查询与成交推送 | 接入成交推送去重与排序优化 HAR | 成交查询入口、账号过滤、成交量及盈亏展示 | HAR 接入、重复推送、账号切换及成交汇总 |
| OOM | 行情列表分组切换与实时刷新 | `TableRequestClient` 在切换或释放时清理订阅、请求缓冲和待通知数据;同一事件循环只保留最新通知 | 行情请求参数、解析结果与最终展示数据 | 高频推送、连续切换分组、离开行情页、Local Heap 稳态 |
| OOM | WebView 行情总览页退出 | 页面销毁时停止三个行情请求,并断开 request client 与 JS bridge 引用 | 请求参数、回调数据及前后台恢复行为 | 反复进入/退出、真实页面销毁、销毁后回调、堆快照与 OOM 日志 |
### 4.2 `harmony_futures_trade_sdk`
| 类型 | 业务入口 | ArkTS SDK 改动 | 保持不变 | 重点回归 |
| --- | --- | --- | --- | --- |
| Freeze | 成交查询与成交推送 | 按成交标识去重;首次加载完成排序,后续成交使用稳定二分插入 | 成交量、盈亏汇总、账号过滤与既有排序规则 | 重复推送、乱序推送、夜盘边界、账号切换及成交汇总 |
| OOM | 交易市价缓存 | 对相同“合约 + 价格类型”更新既有节点,消费后正确删除 | 报价来源、缓存键与取价结果 | 重复更新、读取最新价格、删除后为空、长时间交易页运行 |
### 4.3 `hmdrawlinebasicsdk`
| 类型 | 业务入口 | 画线 SDK 改动 | 保持不变 | 重点回归 |
| --- | --- | --- | --- | --- |
| Freeze | K 线详情与画线 | 画线候选集使用线性去重,避免画线较多时主线程反复遍历 | 画线样式、顺序、命中、编辑、删除及云端合并规则 | 多画线滑动、周期切换、跨周期画线及重复描边 |
## 7. 附Change-notes 追溯
| 需求域 | 改动仓库 | 原始功能改动记录(括号内为改动仓库) |
| ------ | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 通信与解析 | `harmony-ths-futures`<br>`ohos_mobile_lib_communication` | <ul><li>[02-xml-taskpool-refactor.md](harmony-ths-futures-freeze/doc/change-notes/02-xml-taskpool-refactor.md)`harmony-ths-futures`</li><li>[03-communication-taskpool-decompression.md](harmony-ths-futures-freeze/doc/change-notes/03-communication-taskpool-decompression.md)`ohos_mobile_lib_communication``harmony-ths-futures`</li><li>[04-curve-parsing-taskpool.md](harmony-ths-futures-freeze/doc/change-notes/04-curve-parsing-taskpool.md)`ohos_mobile_lib_communication``harmony-ths-futures`</li><li>[14-communication-request-buffer-frame-cleanup.md](harmony-ths-futures-apm-oom/doc/change-notes/14-communication-request-buffer-frame-cleanup.md)`ohos_mobile_lib_communication``harmony-ths-futures`</li></ul> |
| 行情与画线 | `harmony-ths-futures`<br>`hmdrawlinebasicsdk` | <ul><li>[09-drawline-dedup-optimization.md](harmony-ths-futures-freeze/doc/change-notes/09-drawline-dedup-optimization.md)`hmdrawlinebasicsdk``harmony-ths-futures`</li><li>[10-table-request-client-subscription-cleanup.md](harmony-ths-futures-apm-oom/doc/change-notes/10-table-request-client-subscription-cleanup.md)`harmony-ths-futures`</li><li>[11-table-request-client-notification-coalescing.md](harmony-ths-futures-apm-oom/doc/change-notes/11-table-request-client-notification-coalescing.md)`harmony-ths-futures`</li></ul> |
| 交易 | `harmony-ths-futures`<br>`futures_trade_sdk`(原生 `lib-weituosdk`<br>`harmony_futures_trade_sdk` | <ul><li>[05-trade-sdk-native-lock-app-mitigation.md](harmony-ths-futures-freeze/doc/change-notes/05-trade-sdk-native-lock-app-mitigation.md)`harmony-ths-futures``futures_trade_sdk` 的原生 `lib-weituosdk`</li><li>[07-trade-sdk-match-push-optimization.md](harmony-ths-futures-freeze/doc/change-notes/07-trade-sdk-match-push-optimization.md)`harmony-ths-futures``harmony_futures_trade_sdk`</li><li>[08-trade-page-online-status-cache.md](harmony-ths-futures-freeze/doc/change-notes/08-trade-page-online-status-cache.md)`harmony-ths-futures`</li><li>[12-trade-sdk-market-price-cache-cleanup.md](harmony-ths-futures-apm-oom/doc/change-notes/12-trade-sdk-market-price-cache-cleanup.md)`harmony_futures_trade_sdk`</li></ul> |
| 页面生命周期 | `harmony-ths-futures` | <ul><li>[13-webview-overview-request-cleanup.md](harmony-ths-futures-apm-oom/doc/change-notes/13-webview-overview-request-cleanup.md)`harmony-ths-futures`</li></ul> |
1. app_freeze ohos_mobile_lib_communication wuwei 沟通
2. harmony_futures_trade_sdk cpp代码 锁 处理 看下三端是否都存在
3. 改动前后内存的线上真实收益。app_freeze改动前后