46 lines
2.6 KiB
Markdown
46 lines
2.6 KiB
Markdown
# 网络响应 XML 异步解析
|
||
|
||
## 修复提交
|
||
|
||
| 仓库 | 分支 | Commit ID | 说明 |
|
||
| --- | --- | --- | --- |
|
||
| `harmony-ths-futures` | `work-20260818-clz-FUHM-1979-apm-appfreeze` | `e16813f86b8dbabcf6e6e4a18df72c80c69cc9db` | 认证 XML 解析迁移至 TaskPool(`ConcurrentXmlParser`) |
|
||
|
||
## 背景与目标
|
||
|
||
Top 20 冻屏日志中,主线程采样命中 Upass 响应的 GBK 解码和 `XmlPullParser.parse()`。进一步扫描发现验证码响应、账户手机号查询也在通信回调中同步解码并解析 XML。本次统一将三条活动链路迁移到 TaskPool,避免响应体异常放大时阻塞主线程。
|
||
|
||
## 修改范围
|
||
|
||
- `biz_common/src/main/ets/utils/xml/ConcurrentXmlParser.ets`
|
||
- `biz_hxservice/src/main/ets/cookie/UpassSessionNetClient.ets`
|
||
- `biz_auth/src/main/ets/auth/verifycode/CheckCodeLoginClient.ets`
|
||
- `biz_auth/src/main/ets/auth/UserQueryClient.ets`
|
||
- `claude_tool/subthread-import-guard/subthread-import-policy.json`
|
||
|
||
`biz_auth/src/main/ets/auth/UpassSessionNetClient.ets` 未发现导出或调用关系,属于当前不可达的遗留实现,本次不修改。
|
||
|
||
## 通用方案
|
||
|
||
新增 `parseXmlAttributes()` 并发方法,参数为原始字节、字符编码、目标属性列表和可选结束标签。TaskPool 内完成文本解码与 XML 扫描,统一关闭 DOCTYPE;没有指定结束标签时,获取全部目标属性后立即停止。主线程只处理返回值,不向子线程传递业务对象。
|
||
|
||
三处调用配置:
|
||
|
||
- Upass:`gbk`,提取 `sessionid`。
|
||
- 验证码:`gbk`,提取 `code`、`msg`,遇到 `wlh_thsreg_modify` 结束标签停止。
|
||
- 用户查询:`utf-8`,提取 `ckmobile`。
|
||
|
||
并发入口只包含 `@ohos.util` 和 `@ohos.xml` 两条运行时依赖边,已精确登记到子线程导入策略。
|
||
|
||
## 功能影响
|
||
|
||
- Upass SessionId 获取、持久化及 Cookie 建立。
|
||
- 手机号登录或注册时的验证码结果回调。
|
||
- 登录完成或推送更新时的账户手机号回填与偏好存储。
|
||
|
||
请求协议、公开回调接口和存储键不变。解析失败会进入原有失败处理;用户查询异步期间若发生用户切换,会丢弃旧响应。验证码日志不再输出完整 XML,只记录状态码和消息。
|
||
|
||
## 验证
|
||
|
||
`node claude_tool/subthread-import-guard/check-subthread-imports.mjs` 已通过:通用入口包含 1 个本地闭包文件和 2 条运行时依赖边。按当前要求未执行完整编译。运行期仍需覆盖 Upass 登录态、验证码成功/失败、手机号回填、用户切换和损坏 XML 场景,并确认主线程采样栈不再出现 XML 解析热点。
|