已合并
fix: 修复andriod构建apk问题 #8
已合并
yangxichen创建于 6月18日
共 5 个文件变更+14-20
@@ -2,25 +2,18 @@ group = "com.example.image_gallery_saver_plus"
2version = "1.0-SNAPSHOT"2version = "1.0-SNAPSHOT"
3 3 
4buildscript {4buildscript {
5- ext.kotlin_version = "1.7.10"5+ ext.kotlin_version = "1.9.22"
cpf-manager
cpf-managercpf-manager6月18日

【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 均需修复。

likedislike
6 repositories {6 repositories {
7 google()7 google()
8 mavenCentral()8 mavenCentral()
9 }9 }
10 10 
11 dependencies {11 dependencies {
12- classpath("com.android.tools.build:gradle:7.3.0")12+ classpath("com.android.tools.build:gradle:8.3.0")
cpf-manager
cpf-managercpf-manager6月18日

【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 中引用这些属性,确保版本一致性。

likedislike
13 classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")13 classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
14 }14 }
15}15}
16 16 
17-allprojects {
18- repositories {
19- google()
20- mavenCentral()
21- }
22-}
23- 
24apply plugin: "com.android.library"17apply plugin: "com.android.library"
cpf-manager
cpf-managercpf-manager6月18日

【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 依赖可以解析。

likedislike
25apply plugin: "kotlin-android"18apply plugin: "kotlin-android"
26 19 
@@ -1,10 +1,3 @@
1-allprojects {
2- repositories {
3- google()
4- mavenCentral()
5- }
6-}
7- 
8rootProject.buildDir = "../build"1rootProject.buildDir = "../build"
9subprojects {2subprojects {
10 project.buildDir = "${rootProject.buildDir}/${project.name}"3 project.buildDir = "${rootProject.buildDir}/${project.name}"
@@ -1,3 +1,3 @@
1-org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError1+org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED
cpf-managercpf-manager
cpf-managercpf-manager6月18日

【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 构建系统会自动合并到宿主项目中。

likedislike
cpf-managercpf-manager6月18日

【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)。

likedislike
2android.useAndroidX=true2android.useAndroidX=true
3android.enableJetifier=true3android.enableJetifier=true
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
2distributionPath=wrapper/dists2distributionPath=wrapper/dists
3zipStoreBase=GRADLE_USER_HOME3zipStoreBase=GRADLE_USER_HOME
4zipStorePath=wrapper/dists4zipStorePath=wrapper/dists
5-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip5+distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
@@ -18,8 +18,16 @@ pluginManagement {
18 18 
19plugins {19plugins {
20 id "dev.flutter.flutter-plugin-loader" version "1.0.0"20 id "dev.flutter.flutter-plugin-loader" version "1.0.0"
21- id "com.android.application" version "7.3.0" apply false21+ id "com.android.application" version "8.3.0" apply false
22- id "org.jetbrains.kotlin.android" version "1.7.10" apply false22+ id "org.jetbrains.kotlin.android" version "1.9.22" apply false
23+}
cpf-manager
cpf-managercpf-manager6月18日

【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.1
  • 1.2.8-ohos-1.0.0-beta.1 → 1.2.8-ohos.1.0.0-beta.1
  • 1.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。
likedislike
24+ 
25+dependencyResolutionManagement {
26+ repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
27+ repositories {
28+ google()
29+ mavenCentral()
30+ }
23}31}
24 32 
25include ":app"33include ":app"