將一些專案中的一些獨立功能打包成aar,不僅能於專案解耦,還能夠提供給其它專案使用相同的功能,可謂是為專案開發帶來了很大的便利。最近第一次做sdk,碰到一些問題,花了不少時間才解決,所以這裡做一下簡單的記錄,方便以後參考,也希望能夠給碰到同樣問題的朋友提供一些便利。
本篇包含如下兩種打包場景:
(1)Module中不含有其它aar
(2)Module中巢狀第三方aar
1、Module中不含有也不依賴其它第三方aar
(1)在Project中新建Module,這裡以預設名為app的Module來舉例,在app中實現需要封裝的功能。
(2)進入到app的build.gradle檔案
在①處,將 apply plugin: 'com.android.application' 修改為 apply plugin: 'com.android.library',該Module會變成了一個library。
在②處,註釋掉applicationId這一行。由於打包後該Module不再是一個獨立的應用,而是一個其它專案的附屬,所以它不配擁有獨立的applicationId!(開個玩笑,希望這個aar不要生氣罷工哈-_-)。
(3)進入到AnroidManifest.xml中
在③處,如果有自定義的Application類,把這行刪掉。因為打包成aar並被其它專案引用後,該AnroidManifest.xml會和所在專案的AnroidManifest.xml合併,所謂“一山不容二虎”,所以這裡必須刪除掉。
在④處,icon這一行也要去掉。道理和上面一樣,否者aar被引入到專案中並安裝後,桌面上會出現兩個圖示,其中一個還不能執行。
(4)進入到Gradle介面
點選⑤處,等上幾秒鐘,就能夠生成aar了,aar路徑如下圖:
2、該Module中包含有其它aar
Module依賴其它aar的場景,可能是該aar在Module的libs目錄中,也可能在某個獨立的Module中,只是主Module依賴了該aar所在的Module。這裡我碰到的是第一中情況,也就是該aar在Module的libs目錄中的情況,這裡我們們要用到fataar方案。
(1)先看看整體Project的部署情況,A處是巢狀的aar
(2)進入到B處的build.gradle檔案
檔案中要加上D處這一行,應用fat-aar。由於是libs中的aar是巢狀的,所以在E處需要用embed。
(3)進入到C處的build.gradle,也就是整個Project的build.gradle檔案
按照上圖中的,新增F、G、H處的程式碼。
結合場景1的操作,再根據上述的3個步驟,這個巢狀了第三方aar的目標aar就生成了。
3、答疑
問:如果我們只採用(1)中的步驟,而不是使用fataar的方式來打包巢狀第三方aar包的aar,那會出現什麼問題呢?
答:如果只採用(1)中的方式,也能生成aar。但是我們的專案在使用時就需要依賴我們生成的aar,還要在專案中依賴這個第三方aar,可見這並不是我們想要看到的。當然,還有其它的打包方式來解決aar巢狀aar問題的方案,fataar方式只是其中一種,至於其它方式筆者沒有研究過,讀者可以自己嘗試一下。
4、推薦閱讀
如下連結中包含了更多使用fataar打包複雜aar的場景,碰到相同場景的朋友可以參考該連結:https://github.com/kezong/fat-aar-android 。