# B-197 / B-198 跨端构建修复与验收记录

分支：`agent/agent/7b089146`（本卡工作树 `agent/agent/2cae90a2`）
构建基线 HEAD：`2c81a11e03411fa1b033f0f74cd49139e258d1d3`
越界对比基线：`e26abad`
本卡只做构建修复与验收记录，不部署、不发布、不换标。

B-197 已真实打通 PC 与 Android debug/release，但修复仅在部署工程师本机工作树。本文件记录 B-198 复核后的入库提交与**重新真实构建**结果。

**结论：安装包构建与 PC 启动冒烟通过。登录、收发、语音、同步等运行时回归未测，不得视为跨端运行验收通过。**

## 提交主题（可逐项 `git revert`）

从新到旧回退：先本验收记录，再锁文件，再 Gradle 堆，再 Dart 编译修复。

| 主题 | SHA | 文件 |
|---|---|---|
| 本验收记录 | 本文件当次提交 | `docs/acceptance/b197-cross-platform-regression.md` |
| 同步 package-lock 根版本号 1.0.2 | `c150033b39d047852eb1baed1d55b1726a24e65a` | `pc-client/package-lock.json` |
| Android Gradle 堆 4096M | `5160c8ec87f794f75a2ab2e06632a88c35f2d2e1` | `mobile-next/android/gradle.properties` |
| FeatureFlags 导入 + 去掉预览 const | `1767cf2547ca58102ba3734c06ae73ce85e646a2` | `personal_info_view.dart`、`chat_picture_preview.dart` |

回退示例（新到旧）：

```
git revert <本验收提交>
git revert c150033b39d047852eb1baed1d55b1726a24e65a
git revert 5160c8ec87f794f75a2ab2e06632a88c35f2d2e1
git revert 1767cf2547ca58102ba3734c06ae73ce85e646a2
```

回退不影响 `mobile/`、`account-service/`、`config/`、`scripts/`、现网服务与已发布安装包。

## 复核的 4 处改动

1. `mobile-next/lib/pages/contacts/user_profile_panel/personal_info/personal_info_view.dart:6`：`../../../company` → `../../../../company`。该文件在 `personal_info/` 下，相对 `lib/` 需要四层。目标模块是 `lib/company/feature_flags.dart` 的 `FeatureFlags`，未引入其它模块。
2. `mobile-next/openim_common/lib/src/widgets/chat/chat_picture_preview.dart:97`：去掉 `Center` 外层 `const`。`Styles.c_0089FF` 定义为 `static Color`（非 const）。未改 SizedBox / CircularProgressIndicator，未做额外格式化。
3. `mobile-next/android/gradle.properties`：`org.gradle.jvmargs=-Xmx1536M` → `-Xmx4096M`。B-197 在 1536M 上 release 报 `Java heap space`；本卡用 4096M 重新打通 debug 与 release。未再试 2048M/3072M（缺少真实 release 证明），故采用已证明稳定的 4096M。
4. `pc-client/package-lock.json`：仅根节点 `"version": "1.0.1"` → `"1.0.2"`，与 `package.json` 的 1.0.2 对齐。`lockfileVersion` 仍为 3，无依赖树或包升级。其它 npm 回写视为环境噪音，未入库。

## Gradle 机器内存要求

- 配置：`mobile-next/android/gradle.properties` 中 `org.gradle.jvmargs=-Xmx4096M`（与 `docs/upstream/build-and-rollback.md` 的 `GRADLE_OPTS=-Xmx4096M` 一致）。
- 机器：JVM 堆预留 4GB。建议物理内存 ≥ 8GB（堆 + Gradle daemon + 系统）；本机构建机约 64GB，构建时未再出现 heap space。
- 1536M 不能作为 release 稳定值。

## 环境

- Flutter 3.24.5 / Dart 3.5.4（`C:\flutter324`）
- Temurin JDK 17.0.20
- Android SDK：既有 B-95 工具链（build-tools 36.0.0，platforms 含 compileSdk 34）
- Node v24.18.0 / npm 11.16.0（`C:\Program Files\nodejs`）
- `npm install` 的 `husky install || true` 在 Windows cmd 下仍以 exit 1 结束（已知非阻塞）；`node_modules` 可用，后续 vite / electron-builder 成功。

## 检查与构建

### Dart

- 对上述两文件做过 `dart format`，但**未提交格式化换行**，只保留两处语义改动。
- 定点 `flutter analyze`：`personal_info_view.dart` 0 issues；`chat_picture_preview.dart` 无 `invalid_constant`，仅存量 `must_be_immutable` / `use_super_parameters`。
- 全量 `flutter analyze`（mobile-next）：**553 issues**（约 18 error / 87 warning / 448 info）。error 全为存量：`local_plugin/flutter_download_manager/example`、`openim_common` 的 `push_controller.dart` / `custom_mk_controls.dart`。本卡两文件无新增 error。

### Android（必须重新真实构建）

命令（`mobile-next/`）：

```
flutter pub get
flutter build apk --debug
flutter build apk --release
```

| 构建 | 结果 | 大小 | SHA256 | 产物 |
|---|---|---|---|---|
| debug | 成功 | 109,391,065 B | `CE01F30CAFBA24CAFD686F0CFB32ACBDB53359395341B0B1EA2FB795F14C0748` | `mobile-next/build/app/outputs/flutter-apk/app-debug.apk` |
| release | 成功 | 53,273,539 B | `52F02CBC855989C62A89112EB791510CC4313921D9E1998456E94A737F8B148B` | `mobile-next/build/app/outputs/flutter-apk/app-release.apk` |

元数据（aapt / apksigner，release）：包名 `io.openim.flutter.demo`，versionName `3.8.3` / versionCode `180`，minSdk 24 / targetSdk 33 / compileSdk 34，仅 `arm64-v8a`，label `F-DEMO`。签名 CN=openim，证书 SHA-256 `1f38a82fb3c33be7951fb5d964ef5bd9c6c9bfc084ae1e2a8a40a0d1f44ae1fe`。

构建期告警：Flutter Gradle apply-script 弃用；部分依赖 Kotlin metadata 1.8.0 vs 工程预期 1.6.0。均属上游，debug/release 均通过。

### PC（锁文件影响后的 build + 安装包）

```
npm install
npm run build
npx tsc --noEmit
npx electron-builder --win --x64
```

| 步骤 | 结果 |
|---|---|
| npm install | 依赖装上；husky prepare 在 Windows 报 exit 1（非阻塞） |
| vite build | 通过（`✓ built in 25.77s`），antd `"use client"` 指令被忽略（存量告警） |
| tsc --noEmit | exit 2，**24 个存量错误**，与 B-188 清单一致，本卡未新增 |
| electron-builder | 通过；`extraResources` 目录缺失，构建跳过该项 |

产物：`pc-client/release/Base/1.0.2/畅联_1.0.2.exe`，105,891,730 B（约 101MB），SHA256 `A5F15035D669E2184BA1ED2E68FFFB1432FB997703F1FC8103CE4B38D7BB362E`。

启动冒烟：启动 `win-unpacked/畅联.exe`，进程拉起且主窗口标题为「畅联」，随后结束进程。未登录。

`tsc` 存量错误（未修）：`useGroupMembers.ts` TS18047 ×3、`About.tsx` TS2345 ×2、`useHistoryMessageList.tsx` TS18047 ×1、`ChooseBox/index.tsx` TS18047 ×2、`RtcCallModal` / `RtcControl` / `RtcLayout` TS2786 ×4、`UserCardModal` TS2345 ×1、`imCommon.ts` TS2322 ×11。

## 与 B-197 报告 SHA256 的差异

B-197 评论记录：

- PC `eab9bef6285c940351cdd995d850a0d4c67aebc122b83a0ba0680ea0f76e3df2`
- Android release `b5029f0ece55cd11828a1fe4cb9364e660baad04495a74fe94f33639be8165c8`
- Android debug `035d5b6eba7b20351269d88339ad5e0cd2d1179ac7d8fdae8e18a0069fc6b6b7`

本卡重跑后哈希均不同。APK / Electron 安装包内嵌构建时间戳，**不是位级可复现**；可复现的是工具链、命令、包名、签名证书与约 50.8MB / 101MB 量级。以本表 SHA256 为准。

## 越界比对

相对 `2c81a11e`：仅上述 4 个提交涉及的文件。

相对 `e26abad`：

- `mobile/`、`account-service/`、`config/`、`scripts/`：**零改动**
- `pc-client/src/store/`、`pc-client/src/layout/MainContentWrap.tsx`、`pc-client/src/pages/chat/queryChat/ChatFooter/useSendMessage.ts`、`pc-client/src/pages/chat/queryChat/useHistoryMessageList.tsx`：**零改动**
- `pc-client/electron/`：仅既有 `windowManage.ts` 的 `minWidth=1080`、`minHeight=680`（B-171 特批），本卡未再改

## 未测（缺外部条件，禁止写成通过）

- 测试账号：无有效工号+密码，未登录
- Android ARM64 真机：产物仅 arm64-v8a，未安装、未点验
- 工号登录 / 会话同步 / 好友群组 / 文字图片文件语音 / 断线重连 / 录音取消 / 50–60 秒时限 / 未听红点 / 安卓语音通话
- PC 人工交互：置顶、删除、断网恢复、1080×680 稳定性、双向收发

最小所需：管理员给测试工号；真机装 `app-release.apk`；PC 装 `畅联_1.0.2.exe`；两工号同时登录做一轮双向收发。

## 安装与回退（本机产物，未入库）

安装：

- Android：把 `app-release.apk` 拷到 ARM64 真机安装（包名 `io.openim.flutter.demo`，会覆盖同包名旧包）。
- PC：运行 `畅联_1.0.2.exe`。

回退代码：按上文 `git revert` 顺序。回退安装包：卸载本包 / 装回旧版安装包。现网服务与旧 `mobile/` 不受影响。

## 风险清单

- OpenIM 许可书面结论未落；未换标，label 仍 `F-DEMO`
- APK 仍用上游 openim keystore；正式试用前需换正式签名
- PC `extraResources` 目录缺失（构建跳过）
- Electron 22 偏旧；内网地址写死 `192.168.200.11`
- 全量 analyze / tsc 存量错误仍在，不作为本卡回归通过依据

功能质检与视觉审核须另排。本卡不宣布跨端运行验收通过。
