Router項目中,router_process模塊定位爲註解處理器處理模塊,自定義註解處理器中,經過javapoet在 註解處理過程當中生成對應的java文件。其中有大量的調用javapoet接口,如常見的:java
....
methodBuilder.addModifiers(PUBLIC);
....
複製代碼
Android Studio實際顯示時,會出現大量的紅色波浪線下表提示。以下效果。markdown
點擊對應方法進入,顯示以下: gradle
點擊右上角「show diff」,對比效果以下: ui
實際編譯構建及運行是沒有影響的。可是總感受比較奇怪,而且一直這樣也很礙眼。spa
從提示上來看,是庫源不匹配致使誤報了錯誤提示。從「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版本。
緣由找到了,解決起來就相對簡單了,統一將javapoet版本改爲1.8.0便可。由於router_process模塊是做爲java-library類型存在的,不能直接將引入
的javapoet配置去除,只能對應更改版本。
implementation 'com.squareup:javapoet:1.8.0'
複製代碼
從新sync,編譯運行,庫源不匹配致使誤報錯誤提示消失,代碼鏈跟蹤徹底正常。
end~