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

1、爲何使用aar打包,而不是jar

隨着Android Studio的使用愈來愈普遍,使用aar打包這種方式也愈來愈可行實際。
jar打包只打源代碼,像資源文件不會打包,而aar偏偏是jar打包的補充完善,它會把代碼和資源通通打包進一個文件。windows

2、資源命名問題

既然須要打包爲sdk提供出來使用,那就要打包得有水準一點。別把經常使用的第三方的jar集成到aar裏面,這樣很容易會形成衝突的。bash

(1)aar中有依賴的架包

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

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

②本身上傳一個到jcenter遠程倉庫上,學習下打包aar到jcenter也是頗有必要的;例如常常用到的微信分享登陸的架包libammsdk.jar,打包到jcenter上,之後項目中須要用到就添加如下代碼便可:app

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

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

(2)資源命名

資源命名最好統統加上你的項目名字前綴,好比圖片資源、string、color、dimens、layout等等,反正res目錄下全部文件最好都使用統一的加前綴命名,防止跟宿主app下的資源重複,由於aar引用跟源碼引用起到的效果同樣同樣的,全部很容易出現資源重複引用的問題,所以加上前綴很是有必要。能夠有效避免架包內部部份內容衝突的尷尬狀況。工具

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

同一個項目下屢次引用同一個第三方jar庫會出現重複引用的編譯問題,因此只要保證引用一次就ok了,可是若是你的庫引用的第三方庫比較多時,就會碰到很尷尬的問題。學習

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

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

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

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

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

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

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)比較極端的狀況,部分類文件目錄名稱重複,可是兩邊的方法功能不同,經過解壓工具刪除兩邊重複的內容,而後新建一個目錄相同名稱相同的類到本身的主應用程序中,把兩邊的功能都實如今新建的這個類中。

相關文章
相關標籤/搜索