解決庫源不匹配致使誤報錯誤提示

1、問題

Router項目中,router_process模塊定位爲註解處理器處理模塊,自定義註解處理器中,經過javapoet在 註解處理過程當中生成對應的java文件。其中有大量的調用javapoet接口,如常見的:java

....
methodBuilder.addModifiers(PUBLIC);
....
複製代碼

Android Studio實際顯示時,會出現大量的紅色波浪線下表提示。以下效果。markdown

點擊對應方法進入,顯示以下: gradle

點擊右上角「show diff」,對比效果以下: ui

實際編譯構建及運行是沒有影響的。可是總感受比較奇怪,而且一直這樣也很礙眼。spa


2、查因

從提示上來看,是庫源不匹配致使誤報了錯誤提示。從「show diff」上也能夠很容易的看出,關聯的jar包中的源碼與AS對字節碼反編譯後的預期不匹配。插件

第一反映是項目中可能引入了多個版本的javapoet庫,經過以下Gradle命令輸出項目總體依賴關係:3d

./gradlew -q example:dependencies >   ~/compile.txt
複製代碼

從輸出文件上看,只有router_process模塊直接依賴了javapoet,且版本爲1.9.0。 code

javapoet版本惟一,未出現版本多個版本甚至版本衝突等問題。orm

但問題顯然指向javapoet,整個項目經過」右鍵工程「 >> "Find in Path"關鍵字搜索,也只發現jaapoet只是在router_process模塊中被引入。router

這個問題曾經一度比較困惑,網上搜索結果均不能獲得解決。最終祭出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版本。


3、解決

緣由找到了,解決起來就相對簡單了,統一將javapoet版本改爲1.8.0便可。由於router_process模塊是做爲java-library類型存在的,不能直接將引入

的javapoet配置去除,只能對應更改版本。

implementation 'com.squareup:javapoet:1.8.0'
複製代碼

從新sync,編譯運行,庫源不匹配致使誤報錯誤提示消失,代碼鏈跟蹤徹底正常。

end~

相關文章
相關標籤/搜索