文件: lib/services/github_release_service.dart:147-178
问题: downloadApk() 用 Permission.storage.request() / Permission.manageExternalStorage.request() 申请存储权限后才把 APK 写到 getApplicationDocumentsDirectory()/updates/ 目录(161 行),再由 app_update_service.dart:247-249 的 installUpdate() 通过平台通道 installApk 安装这个文件。
质量问题分两层:
-
权限申请完全多余:getApplicationDocumentsDirectory() 是 app 私有沙箱目录(Android 上对应 filesDir),读写无需任何运行时权限。请求 Permission.storage(READ/WRITE_EXTERNAL_STORAGE)和 Permission.manageExternalStorage(MANAGE_EXTERNAL_STORAGE,属于敏感权限,Play 商店审查需特殊申报)会造成:
- 用户看到无关的存储权限弹窗,体验差;
- 权限被拒时直接 return false 中止下载(138-140 行),实际不影响下载,纯属误伤;
MANAGE_EXTERNAL_STORAGE 是"所有文件访问"级权限,为下载一个私有目录文件申请它属于明显的权限过申(Android 政策风险)。
-
下载文件无完整性校验:GitHub Release 旁边已发布 SHA256SUMS.txt(release workflow .github/workflows/flutter-release.yml:238-244 明确生成并上传),但客户端下载 APK 后不做 SHA256 校验直接交给 PackageInstaller 安装。下载过程中断/磁盘损坏/MiTM(在 usesCleartextTraffic=true 的 app 里,若 URL 是 http)会产生损坏或被替换的 APK 文件。官方页脚也教育用户"下载后用 SHA256SUMS.txt 验证完整性"(release_template.md),客户端自身却不做。
修复建议:
- 删除 downloadApk 里的权限申请逻辑(私有目录不需要);
- 下载完成后用 release asset 里的 SHA256SUMS.txt 或
asset.digest(GitHub API 提供 sha256)校验文件,校验失败删除文件并提示重试。
忽略指南:在 lib/services/github_release_service.dart:130 添加注释 // cr-ignore <CR_IGNORE_IID_HASH>: <你的理由>,下次审查会自动关闭。
文件: lib/services/github_release_service.dart:147-178
问题:
downloadApk()用Permission.storage.request()/Permission.manageExternalStorage.request()申请存储权限后才把 APK 写到getApplicationDocumentsDirectory()/updates/目录(161 行),再由app_update_service.dart:247-249的installUpdate()通过平台通道installApk安装这个文件。质量问题分两层:
权限申请完全多余:
getApplicationDocumentsDirectory()是 app 私有沙箱目录(Android 上对应filesDir),读写无需任何运行时权限。请求Permission.storage(READ/WRITE_EXTERNAL_STORAGE)和Permission.manageExternalStorage(MANAGE_EXTERNAL_STORAGE,属于敏感权限,Play 商店审查需特殊申报)会造成:MANAGE_EXTERNAL_STORAGE是"所有文件访问"级权限,为下载一个私有目录文件申请它属于明显的权限过申(Android 政策风险)。下载文件无完整性校验:GitHub Release 旁边已发布 SHA256SUMS.txt(release workflow .github/workflows/flutter-release.yml:238-244 明确生成并上传),但客户端下载 APK 后不做 SHA256 校验直接交给 PackageInstaller 安装。下载过程中断/磁盘损坏/MiTM(在 usesCleartextTraffic=true 的 app 里,若 URL 是 http)会产生损坏或被替换的 APK 文件。官方页脚也教育用户"下载后用 SHA256SUMS.txt 验证完整性"(release_template.md),客户端自身却不做。
修复建议:
asset.digest(GitHub API 提供 sha256)校验文件,校验失败删除文件并提示重试。忽略指南:在
lib/services/github_release_service.dart:130添加注释// cr-ignore <CR_IGNORE_IID_HASH>: <你的理由>,下次审查会自动关闭。