diff --git a/docs/任务清单.md b/docs/任务清单.md index d194daa..dda7499 100644 --- a/docs/任务清单.md +++ b/docs/任务清单.md @@ -1,10 +1,10 @@ # 任务清单 -更新时间:2026-08-30。任务状态以当前仓库和项目约束为准;没有证据的事项不写成“已完成”。 +更新时间:2026-08-31。任务状态以当前仓库和项目约束为准;没有证据的事项不写成“已完成”。 ## 正在做 -无。华为配置注入与 Gradle 识别已提交,等待审核。 +无。语音组件已升级并完成整包安卓出包,等待审核。 ## 已做完 @@ -19,10 +19,11 @@ - 公网反向代理 / HTTPS / WSS / 防火墙与回滚说明(配置进仓库;香港测试环境已由总工部署)。 - 公网 overlay 用 `!override` 覆盖内部端口绑定;部署脚本校验 `SERVER_IP` 非空。 - 构建机本地放入华为 `agconnect-services.json`(不入库);AGConnect 插件映射/版本已按 AGP 9 补齐,Gradle 能识别包名 `cn.solsum.jinxunda`。 +- 升级 `livekit_client` 至 `2.10.0`,在 Flutter 3.47 / Dart 3.13 下打出整包安卓 release APK。 ## 还没安排 -- 在可编译 LiveKit 的环境打出安卓包,并用真机验证华为厂商通道到达。 +- 用真机验证华为厂商通道到达,以及一对一语音通话。 - 组织真实手机和 Windows 电脑的回归:重点确认文件传输、一对一语音通话和杀进程后的离线通知。 - 明确手机正式签名的负责人和安全保管方式;不能把签名密钥提交进仓库。 - 获得负责人同意后,再导入真实员工名单并验证账号管理流程。 diff --git a/docs/最新进度.md b/docs/最新进度.md index b6e325d..31d0d23 100644 --- a/docs/最新进度.md +++ b/docs/最新进度.md @@ -1,6 +1,6 @@ # 最新进度 -更新时间:2026-08-30。以下内容依据当前仓库代码整理。 +更新时间:2026-08-31。以下内容依据当前仓库代码整理。 ## 现在做到哪里 @@ -21,15 +21,16 @@ - 旧记录使用的是更早的提交、安装包版本和端口状态;因此已保留为档案并在开头标明过时,不能当作当前验收结论。 - 放入与 `cn.solsum.jinxunda` 匹配的真实华为配置后,Gradle `:app:processDebugAGCPlugin` 与 `:app:processReleaseAGCPlugin` 通过;debug/release/profile 均识别该配置文件。未因配置缺失或包名不一致失败。 - `flutter pub get` 已写入 `jpush_flutter 3.5.6` / `jpush_flutter_android 1.0.2` 到 `mobile/pubspec.lock`。 -- `flutter analyze` 仅有 2 条既有 OpenIM `group` 弃用 info;`flutter test` 中 `config_test` 通过。 -- 整包 `flutter build apk` 未出包:锁定的 `livekit_client 2.5.0+hotfix.3` 与 Flutter 3.47 / Dart 3.13 的空安全检查不兼容。此项不在华为配置本卡范围,未改 LiveKit 版本。 +- `flutter analyze` 仅有 2 条既有 OpenIM `group` 弃用 info;`flutter test`(`config_test` 与登录页 widget_test)通过。 +- 语音组件已升级到 `livekit_client 2.10.0`(配套直接依赖 `uuid 4.5.3`),Flutter 3.47 / Dart 3.13 下可编译。 +- 整包 `flutter build apk` 已打出 release 安装包 `app-release.apk`,包名 `cn.solsum.jinxunda`,版本 `1.0.7+8`。 ## 当前停在哪 -华为配置已在构建机本地注入并被 Gradle 识别。整包 APK 与真机华为通道到达,仍待后续在可编译 LiveKit 的环境或真机上完成。本轮未改测试机、未回退公网端口与部署安全修复。 +华为配置可被 Gradle 识别,整包安卓安装包已能在当前工具链打出。真机华为通道到达率、真机一对一语音通话仍待真机验证。本轮未改测试机、未回退公网端口与部署安全修复。 ## 已知风险和待验证事实 - 真机上的文件传输、一对一语音通话、杀进程后的离线推送(尤其华为通道)仍需实际设备验证。 -- 整包 APK 受 `livekit_client 2.5.0+hotfix.3` 与当前 Flutter 空安全检查限制,需另卡决定是否升级 LiveKit。 +- 当前 release 包仍用调试签名;正式签名需后续单独准备,密钥不得入库。 - 电脑端使用较旧的 Electron;公网接入后仍需评估 HTTPS、登录限流和跨域策略。 diff --git a/mobile/android/app/build.gradle.kts b/mobile/android/app/build.gradle.kts index aec10a9..1ed2db4 100644 --- a/mobile/android/app/build.gradle.kts +++ b/mobile/android/app/build.gradle.kts @@ -81,16 +81,3 @@ kotlin { flutter { source = "../.." } - -// livekit_client 插件硬编码 compileSdk = 34,但它依赖的 flutter_webrtc 要求消费者 ≥36, -// AAR 元数据校验会因此失败。:app 先于各插件求值(根脚本有 evaluationDependsOn(":app")), -// 所以在插件求值完成后把它的 compileSdk 抬到 36。 -rootProject.subprojects { - if (name == "livekit_client") { - afterEvaluate { - extensions.configure { - compileSdk = 36 - } - } - } -} diff --git a/mobile/android/gradle.properties b/mobile/android/gradle.properties index d656945..65b2847 100644 --- a/mobile/android/gradle.properties +++ b/mobile/android/gradle.properties @@ -7,3 +7,7 @@ android.builtInKotlin=false # 三方插件 Java/Kotlin 编译目标不一致时降级为警告(见 build.gradle.kts 注释) kotlin.jvm.target.validation.mode=warning + +# jpush_flutter_android 1.0.2 的 consumer ProGuard 含 -dontoptimize,AGP 9 默认拒绝合并。 +# 本应用 release 已关闭混淆;该开关只让整包构建通过,不改变极光/华为通道行为。 +android.r8.globalOptionsInConsumerRules.disallowed=false diff --git a/mobile/lib/services/call_service.dart b/mobile/lib/services/call_service.dart index 4c80017..50ccc94 100644 --- a/mobile/lib/services/call_service.dart +++ b/mobile/lib/services/call_service.dart @@ -190,7 +190,7 @@ class CallService extends ChangeNotifier { speakerOn = !speakerOn; notifyListeners(); try { - await Hardware.instance.setSpeakerphoneOn(speakerOn); + await AudioManager.instance.setSpeakerOutputPreferred(speakerOn); } catch (_) { speakerOn = !speakerOn; notifyListeners(); @@ -369,7 +369,7 @@ class CallService extends ChangeNotifier { } // 复位免提 if (speakerOn) { - Hardware.instance.setSpeakerphoneOn(false).catchError((_) {}); + AudioManager.instance.setSpeakerOutputPreferred(false).catchError((_) {}); speakerOn = false; } micOn = true; diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index eea9f17..5a1c842 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -9,6 +9,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + url: "https://pub.dev" + source: hosted + version: "1.6.5" async: dependency: transitive description: @@ -69,10 +77,10 @@ packages: dependency: transitive description: name: connectivity_plus - sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec + sha256: "762c99f890ca8bf87f7337236f99edd42793843bc6c3631da294a76653a54bd0" url: "https://pub.dev" source: hosted - version: "6.1.5" + version: "7.3.1" connectivity_plus_platform_interface: dependency: transitive description: @@ -81,6 +89,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" cross_file: dependency: transitive description: @@ -105,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_jsonwebtoken: + dependency: transitive + description: + name: dart_jsonwebtoken + sha256: ad84e60181696513d04d5f2078e0bbc20365b911f46f647797317414bdc88fbe + url: "https://pub.dev" + source: hosted + version: "3.4.1" dart_webrtc: dependency: transitive description: @@ -125,10 +149,10 @@ packages: dependency: transitive description: name: device_info_plus - sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd url: "https://pub.dev" source: hosted - version: "11.5.0" + version: "12.4.0" device_info_plus_platform_interface: dependency: transitive description: @@ -421,6 +445,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.2" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" just_audio: dependency: "direct main" description: @@ -481,10 +513,10 @@ packages: dependency: "direct main" description: name: livekit_client - sha256: "011affc0fca22b2f9b0e8827219dad9948f84f2bf057980693de13039de904c7" + sha256: "9160950ff87d1946959e4911c16236ea7a3e74ac1987990b258132fd4ed0fca9" url: "https://pub.dev" source: hosted - version: "2.5.0+hotfix.3" + version: "2.10.0" logger: dependency: transitive description: @@ -701,14 +733,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5" + url: "https://pub.dev" + source: hosted + version: "4.0.0" protobuf: dependency: transitive description: name: protobuf - sha256: de9c9eb2c33f8e933a42932fe1dc504800ca45ebc3d673e6ed7f39754ee4053e + sha256: "75ec242d22e950bdcc79ee38dd520ce4ee0bc491d7fadc4ea47694604d22bf06" url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "6.0.0" pub_semver: dependency: transitive description: @@ -934,10 +974,10 @@ packages: dependency: "direct main" description: name: uuid - sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "4.5.3" vector_math: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index ef04a36..24f5b90 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -29,14 +29,15 @@ dependencies: file_picker: 10.3.3 # 发图片消息时选相册图片 image_picker: 1.1.2 - # 一对一语音通话(LiveKit SFU,版本取自官方样板工程 openim_live/pubspec.yaml) - livekit_client: 2.5.0+hotfix.3 + # 一对一语音通话(LiveKit SFU)。2.10.0 起修复 Dart 3.13 空安全编译错误, + # 是当前 Flutter 3.47 / Dart 3.13 下改动最小的稳定版本。 + livekit_client: 2.10.0 # 麦克风权限申请 permission_handler: 11.4.0 # 打开收到的文件 open_filex: 4.7.0 - # 通话房间号 - uuid: 4.5.2 + # 通话房间号(livekit_client 2.10.0 要求 >=4.5.3) + uuid: 4.5.3 # 极光推送官方 Flutter 插件(MIT);厂商通道另见 jpush_flutter_android jpush_flutter: 3.5.6 jpush_flutter_android: 1.0.2