项目开发,引进了一个新的三方库,导致之前能运行的代码出现问题,错误堆栈:
1 | FATAL EXCEPTION: main |
即是在 v4 包中找不到类:AnimatorCompatHelper。Google 了一下,发现这个类在 v4 包版本 26 以上就被剔除了,而 RecyclerView 引用了这个类。所以先查看下依赖,来看看自己依赖的 v4 版本。执行命令:
1 | ./gradlew app:dependencies --configuration cateringDevCompile |
因为我的 buildVariant 很多,这里利用 configuration 参数指定一个 variant,缩减编译的时间。
给出的 Log 如下:
1 | cateringDevCompile - Classpath for compiling the cateringDev sources. |
分析
可以看到自己依赖的 support 库都是 23 24版本的,所以不会导致问题,但是加上依赖me.alzz:kosp
之后,依赖的 support v7 版本是 26.1.0,而 v7 库又依赖了 v4 库,所以 v4 库被升到了 26.1.0,但是用到的 Recycleview 在 design 包中,版本号是 23.3.0,依赖的一个库com.yanzhenjie:recyclerview-swipe
将其升到了 23.4.0,所以 Recycleview 的版本和 support-v4 的版本是对应不上的,才导致的这个问题。所以将依赖的 design 包升级到 26 即可解决问题。
1 | compile 'com.android.support:design:26.1.0' |
出现这个问题的原因就是 support 各种库的版本不一致。一般不容易出现这个问题,但是我的项目 进行模块化,将代码分为了很多模块,对应到不同的工程,不同的 Module,导致 gradle 文件是分散的,经常改了这处忘了那处。这里写下这篇文章也是加深下印象,也给自己提个醒,以后一定要注意 support 库的版本号,不然有可能导致崩溃。
题外话
gradle 插件升级 3.0.0 之后执行查找依赖变化了,执行命令后返回的 Log 如下:
1 | cateringDevCompile - Compile dependencies for 'cateringDev' sources (deprecated: use 'cateringDevImplementation' instead). (n) |
换成:
1 | ./gradlew app:dependencies --configuration cateringDevImplementation |
返回的 Log 如下:
1 | cateringDevImplementation - Implementation only dependencies for 'cateringDev' sources. (n) |
无法直观的看到依赖树,这个时候直接去掉 configuration,然后执行,可以看到所有编译的依赖树,然后选取你要的 buildVariant 即可,比如:
1 | ./gradlew app:dependencies --configuration cateringDevDebugCompileClasspath |