背景
项目为flutter项目,之前因对接三方功能接入了三方的AAR
在迭代需求的时候需要用到多选相册图片的功能,于是在pub上找到了一个三方的库 multi_image_picker
pubspec.yaml 加入依赖
multi_image_picker: ^4.7.14 #多图上传
运行的时候报错
Duplicate class com.bumptech.glide.GeneratedAppGlideModule found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.GenericTransitionOptions found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.Glide found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.GlideBuilder found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.GlideContext found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.ListPreloader found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
从报错来看,是因为引入的三方AAR与multi_image_picker库引入的glide冲突了,既然冲突那么直接使用exclude排除一下冲突不就可以了
implementation(project(":MADCore_HKB_866")){
exclude group: 'com.bumptech.glide'
}
以为大功告成,没想到运行了之后还是报一样的错
Duplicate class com.bumptech.glide.GeneratedAppGlideModule found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.GenericTransitionOptions found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.Glide found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.GlideBuilder found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.GlideContext found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
Duplicate class com.bumptech.glide.ListPreloader found in modules classes.jar (:MADCore_HKB_866:) and classes.jar (com.github.bumptech.glide:glide:4.9.0)
说明配置没有生效,有些不解,于是在网上补习了AAR相关知识得出结论
- 使用 Android Studio 打包出来的 AAR ,不会将其依赖的三方库打包进去。(所以aar要使用glide的源码,而不是implementation的方式)
- classes.jar里面的代码使用exclude无效,无法排除冲突
那既然AAR的glide排除不了,那就排除multi_image_picker的呗,因为multi_image_picker是flutter的插件,所以代码有点不一样,其实flutter的插件就是以module的方式引入到Android的项目中的
implementation(project(":multi_image_picker")){
exclude group: 'com.bumptech.glide'
}
运行之后还是报同样的错误,这种方式也不好使(后来发现其实是写错了,见后注)。看来在引入方面的代码做文章是解决不了问题了(本人对此不是很精通,如果哪位大佬有更好的方案,欢迎留言指教),于是考虑从源码入手
第一套方案: 手动删除AAR里面glide的源码
第二套方案: 更改multi_image_picker源码的glide引入方式
正确写法应该是
implementation(project(":multi_image_picker")){
exclude group: 'com.github.bumptech.glide'
}
这样就可以排除multi_image_picker的glide代码了,但是因为aar和multi_image_picker使用的glide编译版本不一致,所以运行起来之后使用相关功能还是报错(glide版本兼容问题)。
开工
首先实验第一套方案
在github上找到一个开源的工具 ExcludeAar,按照demo一番操作之后拿到生成的已经删除了glide代码的AAR包,引入项目
implementation(name: 'MADCore_HKB_867', ext: 'aar')
同时为了避免之后的插件引入的glide版本过高删除某些方法和属性导致AAR报错,又强制指定了glide的版本号(如何通过源码判断glide的版本号?这里我是自己试的,4.9.0会报错找不到RequestOptions的diskCacheStrategy方法,4.7.1不会报错,所以暂时先用的4.7.1)
configurations.all {
resolutionStrategy.force 'com.github.bumptech.glide:glide:4.7.1'
}
再次运行,成功了。
第二套方案
下载multi_image_picker代码到本地
修改build.gradle
把glide的implementation改为compileOnly
dependencies {
implementation 'androidx.exifinterface:exifinterface:1.3.1'
implementation 'com.sangcomz:FishBun:0.11.2'
// implementation 'com.github.bumptech.glide:glide:4.11.0'
compileOnly 'com.github.bumptech.glide:glide:4.11.0'
}
pubspec.yaml引入本地代码
multi_image_picker:
path: /Users/xxx/Downloads/multi_image_picker-master
改完之后记得执行pub get命令
multi_image_picker代码还是放到公共平台维护比较好,这里只是为了测试可行性
运行报错
[ERROR:flutter/shell/platform/android/platform_view_android_jni_impl.cc(43)] java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.ybm100.app.njk.hkb-MiW6a7iw7Mmk8EikHYZmPg==/base.apk"],nativeLibraryDirectories=[/data/app/com.ybm100.app.njk.hkb-MiW6a7iw7Mmk8EikHYZmPg==/lib/arm, /data/app/com.ybm100.app.njk.hkb-MiW6a7iw7Mmk8EikHYZmPg==/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]] couldn't find "libgojni.so"
couldn't find "libgojni.so",这个so是三方AAR里面的,我解压之后也明明在里面,然后我就试了一下release打包是运行是没有问题的,因前期找解决方法时看到有文章说用module的方式引入AAR可以解决冲突问题,Android导入aar包时类冲突问题
,不过我试了并没有作用,但是使用这种方式引入AAR之后,再运行就不会报错找不到so文件,这个我暂时还没有找到原因
最终的build.gradle代码
implementation project(':hkcore')
以module方式引入AAR
运行一下,成功。
参考文章:
https://drprincess.github.io/2018/01/31/Android-%E5%B0%91%E4%B8%8D%E4%BA%86%E7%9A%84AAR%E6%96%87%E4%BB%B6/
https://www.pianshen.com/article/4092336743/
https://www.jianshu.com/p/4324c61a4c70