Pull Request已成功合入, 合并人@openharmony_ci
(感谢 yangxichen 的贡献)已评审,无其他问题


start build


该仓未配置门禁,无法触发构建。


【AI-Review】【一般】【基础代码问题】【资源使用问题】Aliyun Maven 镜像硬编码到插件源码中
● 问题:在 android/build.gradle(buildscript 和 allprojects)、example/android/build.gradle、example/android/settings.gradle 中均硬编码了阿里云 Maven 镜像(maven.aliyun.com/repository/google、maven.aliyun.com/repository/public、maven.aliyun.com/repository/gradle-plugin)。这些镜像仅适用于中国大陆网络环境,对于海外开发者或 CI/CD 环境可能造成依赖解析延迟甚至失败。此外,阿里云镜像的同步存在滞后,可能无法及时获取最新发布的依赖版本。
● 影响:海外开发者构建时可能遇到依赖解析失败;如果该插件发布到 pub.dev,所有使用者都会被强制使用阿里云镜像,影响构建的稳定性和国际化兼容性。
● 建议:将阿里云镜像配置移至开发者本地的 ~/.gradle/init.gradle 中,而非硬编码到插件源码。如果确实需要在项目中保留,建议使用条件判断或 Gradle 属性控制,例如:
if (project.hasProperty('useAliyunMirror') && project.useAliyunMirror.toBoolean()) {
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/public' }
}
google()
mavenCentral()
这样开发者可以通过 -PuseAliyunMirror=true 按需启用,不影响其他用户。


【AI-Review】【一般】【软件设计】【冗余重复代码】AGP 和 Kotlin 版本在两处重复声明,存在不一致风险
● 问题:AGP 版本(8.3.0)和 Kotlin 版本(1.9.22)同时在 android/build.gradle 的 buildscript 块和 example/android/settings.gradle 的 plugins 块中声明。当后续升级版本时,若只修改了一处而遗漏另一处,会导致版本冲突或构建失败。例如 android/build.gradle:14 中 classpath("com.android.tools.build:gradle:8.3.0") 与 example/android/settings.gradle:24 中 id "com.android.application" version "8.3.0" 是同一版本的不同声明方式。
● 影响:版本不一致时会导致难以排查的构建错误,且维护成本增加。
● 建议:使用 Gradle Version Catalog(gradle/libs.versions.toml)统一管理版本号,或在 android/build.gradle 中通过 ext 属性统一版本定义并在 settings.gradle 中引用。例如在插件根目录的 gradle.properties 中定义:
agpVersion=8.3.0
kotlinVersion=1.9.22
然后在 build.gradle 和 settings.gradle 中引用这些属性,确保版本一致性。


【AI-Review】【建议】【基础代码问题】【稳定性问题】--add-opens 配置仅在 example 中添加,缺少对插件使用者的文档说明
● 问题:--add-opens JVM 参数仅在 example/android/gradle.properties 中添加,这是 AGP 8.x + Java 17+ 环境的必要配置。当其他开发者将此插件作为依赖集成到自己的 Flutter 项目中时,其宿主 App 也需要配置这些 --add-opens 参数,否则在使用 AGP 8.x 构建时会出现 InaccessibleObjectException 导致构建失败。当前 PR 没有在 README 或 CHANGELOG 中说明此升级对宿主项目的影响。
● 影响:使用此插件的开发者升级后可能在构建时遇到 Java 模块访问异常,且缺少文档指引排查方向。
● 建议:1) 在插件的 README 或 CHANGELOG 中说明升级到 AGP 8.3.0 后,宿主项目需要在 android/gradle.properties 中添加 --add-opens 参数;2) 可考虑在插件根目录下新增 android/gradle.properties 文件包含这些参数,Flutter 构建系统会自动合并到宿主项目中。


【AI-Review】【致命】【基础代码问题】【代码逻辑错误】TAG名称格式与仓库实际TAG不一致
● 问题:README中所有TAG名称使用短横线格式 ohos-1.0.0(如 1.1.4-ohos-1.0.0-beta.1),但仓库中实际存在的TAG使用点号格式 ohos.1.0.0(如 1.1.4-ohos.1.0.0-beta.1)。仓库当前实际TAG列表为:1.4.0-ohos.1.0.0-beta.1、1.2.8-ohos.1.0.0-beta.1、1.1.4-ohos.1.0.0-beta.1。用户按照README中的TAG名称配置 ref: 将导致 flutter pub get 失败,因为指定的git引用不存在。同样,注释行 # ref: 1.1.4-ohos-1.0.0-beta.1 中的TAG名称也是错误的。
● 影响:致命。所有按照文档操作的用户都无法成功安装依赖,插件完全不可用。这是文档的核心功能——指导用户正确安装依赖——的根本性错误。
● 建议:将README中所有TAG名称从 ohos-1.0.0 修正为 ohos.1.0.0,与仓库实际TAG保持一致。具体修改:
1.1.4-ohos-1.0.0-beta.1→1.1.4-ohos.1.0.0-beta.11.2.8-ohos-1.0.0-beta.1→1.2.8-ohos.1.0.0-beta.11.4.0-ohos-1.0.0-beta.1→1.4.0-ohos.1.0.0-beta.1
同时修正注释行# ref: 1.1.4-ohos-1.0.0-beta.1为# ref: 1.1.4-ohos.1.0.0-beta.1。


【AI-Review】【建议】【基础代码问题】【性能和效率问题】--add-opens JVM 参数范围过大且仅在 example 中配置
● 问题: example/android/gradle.properties 第1行添加了多个 --add-opens 参数(java.io、java.lang、java.lang.invoke、java.util),这些参数仅配置在 example 应用的 gradle.properties 中,而非插件自身的 android/gradle.properties 中。虽然 --add-opens 主要影响编译和运行时,且对使用此插件的宿主 App 生效需要宿主项目自行配置,但此 PR 未在 README 或 CHANGELOG 中说明此变更及使用此插件的开发者需要做的适配。
● 影响: 建议。1)--add-opens 打开 java.lang 和 java.util 等核心模块的访问范围过大,存在不必要的模块开放,可能引入安全风险;2)使用此插件的第三方开发者升级后可能因缺少这些 JVM 参数而遇到 InaccessibleObjectException,但无文档说明。
● 建议: 1)缩小 --add-opens 的范围,仅开放 AGP 8.x 实际需要的模块。通常 AGP 8.x + Java 17 仅需 java.base/java.io 和 java.base/java.lang,可以移除 java.lang.invoke 和 java.util 的开放(除非实际构建中确实需要);2)在 README.md 中添加关于 AGP 8.3.0 升级的说明,告知使用此插件的开发者如果使用 Java 17+ 和 AGP 8.x,需要在自身项目的 gradle.properties 中添加相应的 --add-opens 参数;3)考虑在 CHANGELOG.md 中记录此版本升级(AGP 7.3.0→8.3.0、Kotlin 1.7.10→1.9.22、Gradle 7.6.3→8.4)。


【AI-Review】【一般】【基础代码问题】【稳定性问题】移除 allprojects 仓库块后缺少对插件使用者的兼容性说明
● 问题: 本次 PR 从 android/build.gradle 中移除了 allprojects { repositories { ... } } 块(第17-23行),并在 example/android/settings.gradle 中添加了 dependencyResolutionManagement 来替代。这是 AGP 8.x 的正确迁移方式。但此变更会影响到使用此插件的其他 Flutter 项目:如果宿主项目的 settings.gradle 未配置 dependencyResolutionManagement 或使用了 FAIL_ON_PROJECT_REPOS 模式,插件自身的 buildscript 依赖(如 kotlin-gradle-plugin:1.9.22)可能无法正确解析仓库。
● 影响: 一般。使用此插件且尚未迁移到 AGP 8.x 的旧项目,在升级插件后可能遇到构建失败,因为插件不再通过 allprojects 提供仓库配置,需要宿主项目自行保证仓库可用。
● 建议: 1)在 README.md 中添加 Android 构建要求说明,明确此插件需要 AGP 8.x+ 环境,以及宿主项目需确保仓库配置(google() 和 mavenCentral())在 settings.gradle 的 dependencyResolutionManagement 或 pluginManagement 中正确声明;2)考虑在插件的 android/build.gradle 的 buildscript 仓库中保留 google() 和 mavenCentral()(已有),确保插件自身的 classpath 依赖可以解析。


【AI-Review】【严重】【基础代码问题】【代码逻辑错误】Kotlin源码中 catch 块未返回错误结果,异常信息丢失
● 问题: 在插件 Kotlin 源码 ImageGallerySaverPlusPlugin.kt 中,saveImageToGallery 方法(约第140行)和 saveFileToGallery 方法(约第169行)的 catch (e: IOException) 块中创建了 SaveResultModel(false, null, e.toString()).toHashMap() 但缺少 return 语句。导致即使捕获到 IOException,代码仍继续执行到方法末尾的 return,此时 success 为 false,但 errorMessage 是通用的 "saveImageToGallery fail" 或 "saveFileToGallery fail",而非实际异常信息。
● 影响: 严重。当保存图片或文件发生 I/O 异常(如磁盘空间不足、权限被拒、存储不可用等),调用方仅收到通用错误信息,丢失了实际异常原因,严重影响问题排查和用户体验。
● 建议: 在两个方法的 catch 块中添加 return 语句:
} catch (e: IOException) {
return SaveResultModel(false, null, e.toString()).toHashMap()
}
saveImageToGallery 和 saveFileToGallery 均需修复。


force_verify


添加 测试通过 成功!


submit


force_verify


添加 测试通过 成功!


submit


start build


该仓未配置门禁,无法触发构建。


force_verify


添加 测试通过 成功!


fix: https://gitcode.com/CPF-Flutter/fluttertpc_image_gallery_saver_plus/issues/9