一、為什么使用aar打包,而不是jar
隨著Android Studio的使用越來越廣泛,使用aar打包這種方式也越來越可行實(shí)際。jar打包只打源代碼,像資源文件不會(huì)打包,而aar恰恰是jar打包的補(bǔ)充完善,它會(huì)把代碼和資源統(tǒng)統(tǒng)打包進(jìn)一個(gè)文件。
二、資源命名問題
既然需要打包為sdk提供出來使用,那就要打包得有水準(zhǔn)一點(diǎn)。別把常用的第三方的jar集成到aar里面,這樣很容易會(huì)造成沖突的。
(1)aar中有依賴的架包
①依賴的第三方資源最好是使用jcenter遠(yuǎn)程倉庫的依賴,如果遠(yuǎn)程倉庫上沒有;例如下載的類庫,直接使用compile進(jìn)行依賴。
compile 'com.dou361.download:jjdxm-download:1.0.1'復(fù)制代碼
②自己上傳一個(gè)到j(luò)center遠(yuǎn)程倉庫上,學(xué)習(xí)下打包aar到j(luò)center也是很有必要的;例如經(jīng)常用到的微信分享登錄的架包libammsdk.jar,打包到j(luò)center上,以后項(xiàng)目中需要用到就添加以下代碼即可:
compile 'com.dou361.winchat:jjdxm-winchat:1.0.0'復(fù)制代碼
③當(dāng)然了,如果你實(shí)在是嫌麻煩那就直接打包到aar上,如果APP中引用別的aar和你的aar有相同的架包那就悲劇了,不過還是有解決的辦法,后面會(huì)有相關(guān)的處理辦法。
(2)資源命名
資源命名最好通通加上你的項(xiàng)目名字前綴,比如圖片資源、string、color、dimens、layout等等,反正res目錄下所有文件最好都使用統(tǒng)一的加前綴命名,防止跟宿主app下的資源重復(fù),因?yàn)閍ar引用跟源碼引用起到的效果一樣一樣的,所有很容易出現(xiàn)資源重復(fù)引用的問題,因此加上前綴非常有必要。可以有效避免架包內(nèi)部部分內(nèi)容沖突的尷尬情況。
三、jar第三方庫重復(fù)引用問題
同一個(gè)項(xiàng)目下多次引用同一個(gè)第三方j(luò)ar庫會(huì)出現(xiàn)重復(fù)引用的編譯問題,所以只要保證引用一次就ok了,但是如果你的庫引用的第三方庫比較多時(shí),就會(huì)碰到很尷尬的問題。
比如你的aar庫引用了一個(gè)第三方庫,這個(gè)庫是本地庫,宿主app中也引用了這個(gè)第三方庫,這時(shí)你把你的aar庫所引用的那個(gè)第三方庫引用方式設(shè)置成provide,provide的意思是不打包進(jìn)去,這樣沒問題,但是你想過一個(gè)問題沒,如果別人使用你的aar,他不知道你的aar庫需要包含那個(gè)第三方庫,如果他在自己的宿主app中沒有引用進(jìn)來那個(gè)庫,好吧,這會(huì)導(dǎo)致運(yùn)行時(shí)崩潰,崩潰的日志提示找不到一些類定義,總不能給別人提供aar庫還要額外提供一堆第三庫,然后告訴他把這些庫添加進(jìn)主工程里,這種方式可行,但是很不友好。
以下是第三方庫重復(fù)引用沖突解決方法:
1.本地libs目錄中的jar和遠(yuǎn)程倉庫中compile的jar沖突。
解決辦法優(yōu)先刪除libs目錄中的jar保留compile的引用,也可以刪除compile引用保留本地libs目錄的。
2.本地libs目錄中兩個(gè)jar,遠(yuǎn)程倉庫compile兩個(gè)jar或者本地libs目錄和遠(yuǎn)程倉庫compile之間的同一jar不同版本沖突。
解決辦法優(yōu)先刪除低版本的保留高版本的,其次是優(yōu)先刪除本地libs的保留compile的。這個(gè)要根據(jù)APP的情況而定,保留高版本的jar可能會(huì)引起原來其他地方引用低版本方法變遷或者路徑變更出問題,在兩者間擇優(yōu),同步升級(jí)其他相關(guān)jar的版本,或者同步降級(jí)其他相關(guān)jar的版本。
3.引用jar和jar、aar和jar或者aar和aar的沖突。
解決辦法優(yōu)先刪除jar的引用,保留aar的,如果兩個(gè)都是aar或者兩個(gè)都是jar怎么辦?當(dāng)然也是可以刪除aar或者jar內(nèi)部中沖突的
(1)aar中沖突的部分是集成到aar中的,這種情況是比較多,如果是遠(yuǎn)程倉庫的需要下載下來,改為本地引用,有人可能不會(huì)下載,其實(shí)原來你使用遠(yuǎn)程倉庫引用同步以后已經(jīng)是下載好在本地的了,這里舉一個(gè)案例:
compile 'com.dou361.update:jjdxm-update:1.0.3' 復(fù)制代碼windows系統(tǒng) C:\Users\你的計(jì)算機(jī)用戶名.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復(fù)制代碼 復(fù)制出來用即可,本地的libs中的aar,其實(shí)就是一個(gè)壓縮包,用解壓工具打開把沖突的部分刪除即可;引用如下:
repositories {
flatDir {
dirs 'libs'
}
}
compile (name:'jjdxm-update',ext:'aar')復(fù)制代碼
(2)jar中沖突的部分是jar內(nèi)部部分內(nèi)容,和第(1)的處理方法類似,這里要是沒有說可能會(huì)想不到,jar包其實(shí)也是一個(gè)壓縮包,因此內(nèi)部的沖突的內(nèi)容是可以通過解壓工具打開去刪除的。
(3)如果沖突的jar是采用遠(yuǎn)程依賴方式引用,那就可以直接使用代碼去屏蔽沖突的部分
例如:
compile ('com.dou361.update:jjdxm-update:1.0.3'){
exclude group: 'com.dou361.download',module:'jjdxm-download'
}
復(fù)制代碼
(4)比較極端的情況,部分類文件目錄名稱重復(fù),但是兩邊的方法功能不一樣,通過解壓工具刪除兩邊重復(fù)的內(nèi)容,然后新建一個(gè)目錄相同名稱相同的類到自己的主應(yīng)用程序中,把兩邊的功能都實(shí)現(xiàn)在新建的這個(gè)類中。