docs: 记录 B-272 Android 权限、通话文案与位置清理及构建证据

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
编码工程师
2026-08-21 10:01:50 +08:00
co-authored by Cursor multica-agent
parent d6fafe7f95
commit 716e43cea3
@@ -0,0 +1,104 @@
# B-272 Android 权限、通话文案与位置功能清理
分支:`agent/agent/d488336b`
施工基线:B-269 建议的最新已交付 Android HEAD `092039bc1a55c3ddf853ac39d04f6171e7cb5a4c``review-latest` / `origin/agent/agent/2b5c0459`
方案依据:B-269 附件 `b269-architecture-plan.md` 的 P1-1 / P1-2
本卡只改 `mobile-next/` 与本验收记录,不改旧 `mobile/`、PC、现网服务,不发布 APK,不覆盖 Gitea Release。
**结论:Android release 构建通过。合并清单已去掉悬浮窗与定位权限;用户可见通话文案统一为「语音通话」;位置发送入口与定位依赖已移除,历史位置消息仍只读解析。真机登录、来电、历史位置点开未测,不得写成运行验收通过。**
## 权限前后对比(release APK 合并清单)
| 权限 / 组件 | 改前 | 改后 |
|---|---|---|
| `SYSTEM_ALERT_WINDOW` | 声明,同步完成后无条件申请 | `tools:node="remove"`,无申请调用 |
| 旧 `CallService``flutter_openim_live_alert` | 在 app Manifest 声明 | 已删除声明;本地插件目录保留,未物理删除 |
| `ACCESS_COARSE/FINE/BACKGROUND_LOCATION``ACCESS_LOCATION_EXTRA_COMMANDS` | 声明,工具箱发位置会请求 | `tools:node="remove"`;去掉 `geolocator` |
| `FOREGROUND_SERVICE` / `ForegroundService` / `IsolateHolderService` | 保留 | 保留,未改通话中前台通知链路 |
| 定位发送页 `ChatWebViewMap` | 工具箱可进选点并 `createLocationMessage` | 已删除发送页与发送方法 |
合并 APK `aapt dump permissions` 已确认不含 `SYSTEM_ALERT_WINDOW``ACCESS_*LOCATION`
## 文案
只改通话可见文本,未改协议字段、`CallType`、消息类型或 SDK 枚举。相册「视频」、视频消息、视频会议字样保留。
| 入口 | 改前 | 改后 |
|---|---|---|
| 工具箱 `toolboxCall` | 视频通话 | 语音通话 |
| 资料页 `audioAndVideoCall` | 音视频通话 | 语音通话,图标改用 `ImageRes.callVoice` |
| 来电/邀请/群通话提示中的「视频通话」 | 视频通话 | 语音通话 |
| 通话选择面板 | 语音 + 视频两项 | 仅语音一项 |
## 位置只读
- 聊天「更多」与备用输入条不再出现位置发送。
- 历史 `MessageType.location` 仍由 `ChatLocationView` 展示;点击走只读 `MapView`,不进入发送页。
- 描述 JSON 损坏或缺字段时显示「位置」占位,不抛异常、不渲染空白卡片。
## 提交主题(可逐项 `git revert`
从新到旧回退:先本验收记录,再代码提交。
| 主题 | SHA | 文件 |
|---|---|---|
| 本验收记录 | 本文件当次提交 | `docs/acceptance/b272-android-permission-copy-location.md` |
| 权限/文案/位置清理 | 见代码提交 | `mobile-next/` 见 git log |
回退示例(新到旧):
```
git revert <本验收提交>
git revert <代码提交>
```
回退不影响 `mobile/``account-service/``config/``scripts/`、现网服务、PC、已发布安装包。旧悬浮窗插件目录 `mobile-next/local_plugin/flutter_openim_live_alert` 仍在仓库,仅不再接入。
## 环境
- Flutter 3.24.5 / Dart 3.5.4`C:\flutter324`
- Temurin JDK 17.0.20+8`C:\devtools\jdk17`
- Android SDK`C:\devtools\android-sdk`build-tools 34.0.0compileSdk 34
- `org.gradle.jvmargs=-Xmx4096M`
## 检查与构建
```
cd mobile-next
flutter test test/company/p1_cleanup_test.dart test/company/call_session_guard_test.dart test/company/rtc_token_mapper_test.dart test/company/call_visual_rework_test.dart test/company/user_full_info_mapper_test.dart
flutter analyze lib/core/controller/im_controller.dart lib/pages/chat/chat_logic.dart lib/pages/chat/chat_view.dart lib/company openim_common/lib/src/utils/permissions.dart openim_common/lib/src/widgets/chat/chat_toolbox.dart openim_common/lib/src/widgets/chat/chat_location_view.dart openim_common/lib/src/widgets/rich_text_input_box.dart openim_common/lib/src/widgets/button.dart openim_common/lib/src/widgets/views.dart openim_live/lib/src/live_controller.dart
flutter build apk --release
```
- 公司相关单测 **21 项通过**(含本卡 2 项:文案不含「视频通话/音视频通话」、位置描述损坏可解析)。
- 定点 `flutter analyze`**无 error**。info/warning 为存量(Token const、废弃 API、Kotlin metadata 1.8 vs 1.6 等同 B-225/B-261)。
- Android release 构建成功。上游告警同前:Flutter Gradle apply-script 弃用;部分依赖 Kotlin metadata 1.8.0 vs 工程预期 1.6.0。
| 产物 | 版本 | 包名 | 大小 | SHA256 |
|---|---|---|---|---|
| Android release APK | 3.8.3+180 | `io.openim.flutter.demo` | 53,095,552 B | `A37BA10EB94D43F0B113130CE90EEE554FD9F3EC00C7C7A9D025CA1059C0E76C` |
路径:`mobile-next/build/app/outputs/flutter-apk/app-release.apk`(APK 内嵌时间戳,哈希不可位级复现)。label `F-DEMO`,仅 `arm64-v8a`minSdk 24 / targetSdk 33 / compileSdk 34。未发布、未覆盖 Gitea 现有 Release。
## 已测 / 未测
已测:
- 施工基线为 `092039b`,不是 `origin/main` 的旧 `fa8584a`
- 中文通话文案静态扫描不再含「视频通话」「音视频通话」;「视频」消息字样仍在
- 位置描述合法 JSON / 损坏 JSON / 空值解析不抛异常
- 通话状态机、换票、视觉 Token、我的信息映射既有单测回归
- release APK 合并清单无悬浮窗、无定位权限;无旧 `CallService`;前台通知服务仍在
- Android release 构建通过
未测(不得写成已通过):
- 公司内网真机冷启动、登录、同步完成后是否还弹出悬浮窗设置
- 真机系统权限页是否仍列出「显示在其他应用上层」或定位
- 语音来电、接听、通话中最小化、后台返回
- 历史位置消息在真机会话中的展示与点击
- 文字/图片/文件/语音消息与相册视频发送的真机回归
## 边界
未改:旧 `mobile/`、PC、`account-service/`、docker、端口、账号、数据库、LiveKit 配置、DNS/证书/推送、品牌换标、APK 发布。