解决库源不匹配导致误报错误提示

1,006 阅读2分钟

一、问题

Router项目中,router_process模块定位为注解处理器处理模块,自定义注解处理器中,通过javapoet在 注解处理过程中生成对应的java文件。其中有大量的调用javapoet接口,如常见的:

....
methodBuilder.addModifiers(PUBLIC);
....

Android Studio实际显示时,会出现大量的红色波浪线下表提示。如下效果。

点击对应方法进入,显示如下:

点击右上角“show diff”,对比效果如下:

实际编译构建及运行是没有影响的。但是总感觉比较奇怪,并且一直这样也很碍眼。


二、查因

从提示上来看,是库源不匹配导致误报了错误提示。从“show diff”上也可以很容易的看出,关联的jar包中的源码与AS对字节码反编译后的预期不匹配。

第一反映是项目中可能引入了多个版本的javapoet库,通过如下Gradle命令输出项目整体依赖关系:

./gradlew -q example:dependencies >   ~/compile.txt

从输出文件上看,只有router_process模块直接依赖了javapoet,且版本为1.9.0。

javapoet版本唯一,未出现版本多个版本甚至版本冲突等问题。

但问题显然指向javapoet,整个项目通过”右键工程“ >> "Find in Path"关键字搜索,也只发现jaapoet只是在router_process模块中被引入。

这个问题曾经一度比较困惑,网上搜索结果均不能得到解决。最终祭出grep大法,看看有哪些隐藏的地方事实上用到了javapoet。

grep -rnl  "javapoet" .

对应搜索结果:

果然,结果显示router_plugin模块也有用到javapoet。去对应位置下看下:

果然,javapoet赫然在列。并且对应版本是1.8.0.iml作为模块的Module基础信息配置文件,表明router_plugin模块事实上依赖了javapoet-1.8.0版本。

原来,router_plugin作为Gradle插件,在项目构建过程中会被用到。但Gradle Plugin与项目的直接依赖最大不同之处在于,Gradle Plugin只是编译时依赖,在项目构建过程中起作用,Gradle Plugin及其依赖的库,是不会直接打包到APK安装包中的。也就是说,我们上述通过Gradle命令删除项目依赖的信息是不完整的,是不包含router_plugin自身的。

针对router_plugin模块,我们看一下其依赖项:

./gradlew -q router_plugin:dependencies >   ~/compile.txt

在结果中找到了对应的依赖关系:

果然,AGP版本3.3.1内部,自动依赖了javapoet-1.8.0版本。
同时,在AS中,左边整个项目的Extranal Libraries列表中,也确实发现了多个对应的javapoet版本。


三、解决

原因找到了,解决起来就相对简单了,统一将javapoet版本改成1.8.0即可。因为router_process模块是作为java-library类型存在的,不能直接将引入

的javapoet配置去除,只能对应更改版本。

implementation 'com.squareup:javapoet:1.8.0'

重新sync,编译运行,库源不匹配导致误报错误提示消失,代码链跟踪完全正常。

end~