【盜墓筆記】Android開發中匯入第三方庫所遇問題記錄——Program type already present

宋者為王發表於2020-09-25

       最近做專案部署時由於一些特別的需求,導致在匯入jar包問題上出現不少問題。由於這些問題花了不少時間才找到解決方案,這裡特地記錄一下,希望能幫到碰到相同困擾的你!

1、重複迴圈依賴的問題

(1)需求

       如下圖所示:

 在Android 專案中,採用模組化開發,一個是主跑application——Mudule A,另外一個是library——Library B

          1)Module A,其中libs中有個x.jar,該Module中需要用到此jar包。Module A由其他團隊維護,由於某些原因,不可改動其結構。

          2)Library B,也需要使用x.jar,且Module A依賴該Library B。該Library由我維護。

(2)錯誤的方案

       

 

        如上圖,是我嘗試的一種方案,在Library B中的libs目錄下也新增了x.jar並依賴。當然這種方案後來報錯了,報錯資訊為(這裡使用的x.jar包其實就是google的protobuf庫):

Program type already present: com.google.protobuf.BlockingRpcChannel

網上查的資料顯示,這是由於重複依賴導致的。Module A中依賴了x.jar,又依賴了 Library B,而Library B又依賴了x.jar,不難發現這裡存在重複依賴的問題。

(3)困難點

       這裡因為特定的需求,不能改變Module  A的結構,不然我們可以把 x.jar單獨放入一個Module中,然後Module A和 Library B都依賴該新Module。又由於Module A是依賴於Library B的,所以不能再讓Library B來依賴Module A來達到使用x.jar的目的,否則會出現迴圈依賴的問題。

(4)最終解決方案

       整體的專案結構沒有改變,還是

只是在Library B的build.gradle檔案中新增了如下依賴

implementation files('../Module A/libs/x.jar')

這樣問題就解決了。

(5)總結

       其實該問題的思路很簡單,就是讓Library B直接引用 Module A/libs/x.jar。之所以最開始沒想到這一點,主要還是因為在這個依賴需要手寫,而不能在Android Studio中配置後自動生成,一般配置路徑為File > Project Structure > Dependencies > Library B > Jar Dependency,如下圖:

 而此時在這裡Android Studio無法自動給出路徑提示,不能直接找到 Module A/libs/x.jar。
       這也就是折騰很長時間後才找到這個方法的原因,所以這裡特別記錄一下,也許能幫到碰到相同困擾的同仁。

 

2、framework.jar造成的 Caused by: java.lang.ArrayIndexOutOfBoundsException: 65535問題

 

相關文章