Skip to content

feat: 升级 Flutter 3.47 并完善 Android 安全存储 - #148

Draft
JustLookAtNow wants to merge 5 commits into
masterfrom
codex/flutter-3-47-upgrade
Draft

feat: 升级 Flutter 3.47 并完善 Android 安全存储#148
JustLookAtNow wants to merge 5 commits into
masterfrom
codex/flutter-3-47-upgrade

Conversation

@JustLookAtNow

@JustLookAtNow JustLookAtNow commented Aug 14, 2026

Copy link
Copy Markdown
Owner

变更说明

  • 将 Flutter 升级到 3.47.0、Dart 升级到 3.13.0,并更新全部可解析依赖。
  • Android 升级到 minSdk 24、compileSdk 37、targetSdk 36、AGP 9.1.1、Gradle 9.3.1、Kotlin 2.4.0 和 NDK 28.2.13676358。
  • 移除从未被业务代码调用的 flutter_downloader,启用 AGP 9 Built-in Kotlin;Android 不再引入该插件的 WorkManager 2.9 / Room 2.5。
  • flutter_secure_storage 11 固定使用 RSA-OAEP + AES-GCM,并关闭自动 reset 和算法迁移。
  • 为全新 Android 存储增加独立 OAEP+GCM 能力探测;只有明确不支持算法时才永久回退到独立明文凭据存储。
  • 已有密文、legacy profile、配置不一致、超时或 KeyStore/I/O 错误继续失败关闭,不会用空明文数据掩盖原数据。
  • 增加 legacy 备份验证、白名单重置、原子恢复及无备份二次确认放弃流程。
  • 增加首次明文安全警告、设置页持续红色状态和发布说明中的升级前备份提示。
  • CI 安装 Android API 37.0、使用 Xcode 26 / iOS 26,并保持必需检查名 PR gate 不变。

随附的既有修复

  • 扩大封面加载失败后的重试点击区域。
  • 支持优惠标签的分钟倒计时。
  • 分类名称最多显示两行。

用户影响

Android 旧版安全存储可能无法直接兼容。用户应在升级前导出备份;备份是包含 Cookie、API Key 和密码等凭据的明文 JSON,恢复成功后应删除。

不支持 OAEP+GCM 的全新设备会继续可用,但设置页会持续提示凭据使用应用私有 SharedPreferences 明文保存。该模式在当前应用数据生命周期内不会自动迁回加密存储。

验证

  • flutter analyze:通过,0 问题
  • flutter test:350 通过,1 个设计性跳过
  • go test ./...:通过
  • ./gradlew :app:testDebugUnitTest:通过
  • Android Release 依赖图:不再包含 flutter_downloader、WorkManager 或 Room
  • Android Debug APK:Built-in Kotlin 构建成功,无 KGP 兼容警告
  • Android Release APK:混淆构建成功,无 KGP 兼容警告
  • Android 真机覆盖安装:保留应用数据,冷启动成功且无致命异常
  • Linux Release:构建成功
  • APK 元数据:minSdk 24 / targetSdk 36 / compileSdk 37
  • GitHub Actions YAML:解析通过

iOS、macOS 和 Windows 构建由此 PR 的 GitHub Actions / 发布工作流继续验证。

@JustLookAtNow JustLookAtNow self-assigned this Aug 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant