当前位置: 首页>数据库>正文

记一次Android aar的填坑之路

背景
项目为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相关知识得出结论

  1. 使用 Android Studio 打包出来的 AAR ,不会将其依赖的三方库打包进去。(所以aar要使用glide的源码,而不是implementation的方式)
  2. 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引入方式

记一次Android aar的填坑之路,\color{red}{注:},第1张
正确写法应该是

 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


记一次Android aar的填坑之路,第2张

运行一下,成功。

参考文章:
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


https://www.xamrdz.com/database/6uu1996062.html

相关文章: