Android Studio中架包打包和依賴衝突解決

零次冪發表於2017-08-01

一、為什麼使用aar打包,而不是jar

隨著Android Studio的使用越來越廣泛,使用aar打包這種方式也越來越可行實際。
jar打包只打原始碼,像資原始檔不會打包,而aar恰恰是jar打包的補充完善,它會把程式碼和資源統統打包進一個檔案。

二、資源命名問題

既然需要打包為sdk提供出來使用,那就要打包得有水準一點。別把常用的第三方的jar整合到aar裡面,這樣很容易會造成衝突的。

(1)aar中有依賴的架包

①依賴的第三方資源最好是使用jcenter遠端倉庫的依賴,如果遠端倉庫上沒有;例如下載的類庫,直接使用compile進行依賴。

compile 'com.dou361.download:jjdxm-download:1.0.1'複製程式碼

②自己上傳一個到jcenter遠端倉庫上,學習下打包aar到jcenter也是很有必要的;例如經常用到的微信分享登入的架包libammsdk.jar,打包到jcenter上,以後專案中需要用到就新增以下程式碼即可:

compile 'com.dou361.winchat:jjdxm-winchat:1.0.0'複製程式碼

③當然了,如果你實在是嫌麻煩那就直接打包到aar上,如果APP中引用別的aar和你的aar有相同的架包那就悲劇了,不過還是有解決的辦法,後面會有相關的處理辦法。

(2)資源命名

資源命名最好通通加上你的專案名字字首,比如圖片資源、string、color、dimens、layout等等,反正res目錄下所有檔案最好都使用統一的加字首命名,防止跟宿主app下的資源重複,因為aar引用跟原始碼引用起到的效果一樣一樣的,所有很容易出現資源重複引用的問題,因此加上字首非常有必要。可以有效避免架包內部部分內容衝突的尷尬情況。

三、jar第三方庫重複引用問題

同一個專案下多次引用同一個第三方jar庫會出現重複引用的編譯問題,所以只要保證引用一次就ok了,但是如果你的庫引用的第三方庫比較多時,就會碰到很尷尬的問題。

比如你的aar庫引用了一個第三方庫,這個庫是本地庫,宿主app中也引用了這個第三方庫,這時你把你的aar庫所引用的那個第三方庫引用方式設定成provide,provide的意思是不打包進去,這樣沒問題,但是你想過一個問題沒,如果別人使用你的aar,他不知道你的aar庫需要包含那個第三方庫,如果他在自己的宿主app中沒有引用進來那個庫,好吧,這會導致執行時崩潰,崩潰的日誌提示找不到一些類定義,總不能給別人提供aar庫還要額外提供一堆第三庫,然後告訴他把這些庫新增進主工程裡,這種方式可行,但是很不友好。

以下是第三方庫重複引用衝突解決方法:

1.本地libs目錄中的jar和遠端倉庫中compile的jar衝突。

解決辦法優先刪除libs目錄中的jar保留compile的引用,也可以刪除compile引用保留本地libs目錄的。

2.本地libs目錄中兩個jar,遠端倉庫compile兩個jar或者本地libs目錄和遠端倉庫compile之間的同一jar不同版本衝突。

解決辦法優先刪除低版本的保留高版本的,其次是優先刪除本地libs的保留compile的。這個要根據APP的情況而定,保留高版本的jar可能會引起原來其他地方引用低版本方法變遷或者路徑變更出問題,在兩者間擇優,同步升級其他相關jar的版本,或者同步降級其他相關jar的版本。

3.引用jar和jar、aar和jar或者aar和aar的衝突。

解決辦法優先刪除jar的引用,保留aar的,如果兩個都是aar或者兩個都是jar怎麼辦?當然也是可以刪除aar或者jar內部中衝突的

(1)aar中衝突的部分是整合到aar中的,這種情況是比較多,如果是遠端倉庫的需要下載下來,改為本地引用,有人可能不會下載,其實原來你使用遠端倉庫引用同步以後已經是下載好在本地的了,這裡舉一個案例:

compile 'com.dou361.update:jjdxm-update:1.0.3' 複製程式碼

windows系統 C:\Users\你的計算機使用者名稱.gradle\caches\modules-2\files-2.1目錄下找到compile的groupId com.dou361.update檔案,完整的目錄:

C:\Users\Admin\.gradle\caches\modules-2\files-2.1\com.dou361.update\jjdxm-update\1.0.3\fb8f27de2ce0371476023b1dcf4a6096d19e5810\jjdxm-update-1.0.3.aar複製程式碼

複製出來用即可,本地的libs中的aar,其實就是一個壓縮包,用解壓工具開啟把衝突的部分刪除即可;引用如下:

repositories {
    flatDir {
        dirs 'libs'
    }
}

compile (name:'jjdxm-update',ext:'aar')複製程式碼

(2)jar中衝突的部分是jar內部部分內容,和第(1)的處理方法類似,這裡要是沒有說可能會想不到,jar包其實也是一個壓縮包,因此內部的衝突的內容是可以通過解壓工具開啟去刪除的。

(3)如果衝突的jar是採用遠端依賴方式引用,那就可以直接使用程式碼去遮蔽衝突的部分例如:

compile ('com.dou361.update:jjdxm-update:1.0.3'){
    exclude group: 'com.dou361.download',module:'jjdxm-download'
}複製程式碼

(4)比較極端的情況,部分類檔案目錄名稱重複,但是兩邊的方法功能不一樣,通過解壓工具刪除兩邊重複的內容,然後新建一個目錄相同名稱相同的類到自己的主應用程式中,把兩邊的功能都實現在新建的這個類中。

相關文章