如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。
java
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表python
若是一開始關注個人同窗,應該有看過這一篇技術[Android]多module合成單一module技巧android
爲什麼要使用多module合一呢?git
1.若是你使用的是組件化架構github
2.你想將你的app封成插件aar(也就是別人說的sdk)。數組
*arr和jar的區別是,java你要打包將能夠把代碼打包成jar的包,而Android studio打包能夠代碼和資源都打包成aar文件,供外部調用架構
以前我介紹的文章中,說的是用了一個笨拙的使用python腳本合成一個module而後再進行打包。app
近來我有同事發現,有一個新的開源庫能夠達到相同的效果,看來大神仍是不少的。組件化
Talk is too cheap,show you the code.學習
說一下重點吧,那個github的地址裏面,點進去就會看到解析都是用英文,估計是外國的大神寫的,可是木有提供中文講解,估計會有人沒看懂。
重點是fat-aar.gradle這個文件,這裏提供兩種方式
1.下源碼copy到想要生成出aar的module裏面的目錄,build.gradle同樣的層級就能夠了
而後在build.gradle裏面引用這個
2.或者直接引用
建議仍是下載源碼放到目錄裏面,有啥問題,本身也一目瞭然,不至於一面懵B
下一步就要將相關的功能module做出依賴了,這裏須要使用embedded的關鍵字,爲啥是這個關鍵字等下給你們解析
而後這樣就成功了???
若是你在主module這樣用估計你就能夠看到如下的編譯錯誤了,
到了這裏估計你會查看packageReleaseResources這個屬性是什麼,然而你仍是不清楚。
這裏踩到的坑,這裏是要將編譯生成aar的sdk文件,那麼咱們須要將module從application變動爲lib,這樣才符合要求
假若你設置了applicationId,那麼也請你註釋掉
還有在以前多module合一的文章中有提到過,不能使用swtich case的語句,由於這樣會將變量聲明會final屬性的,aar不支持這樣的語句,所有須要改成if else語句
好吧,作完這些以後,你須要跑gradle的命令,只須要跑你那個module裏面的命令就能夠了。
最終會在outputs文件夾,生成一個aar文件
大家所要的sdk就這樣生成了。
相信有不少人已經猜到關鍵文件是fat-aar.gradle這個文件了,他是使用gradle做爲編譯腳本。
那麼咱們仍是這個文件裏面,究竟寫了什麼吧
對於我這種gradle小白,也是要認真考究一番才能解析到你們明白。
Gradle對依賴進行分組,容許編譯時使用一組依賴,運行時使用另外一組依賴。每一組依賴稱爲一個Configuration,
聲明embedded爲一類依賴
同時會添加到compile裏面
而後定義一些變量,例如jar文件,aar文件夾,還有R文件
而後定義一些生成的文件夾
執行打包前須要運行afterEvaluate,完成一些額外的配置
它先會指定你的aar文件夾的路徑,就是引用的lib的路徑,
若是生成的是aar會加入到embeddedAarDirs的數組列表,若是是jar會加到embeddedJars的數組列表
而後須要指定一些Assets,資源,JNI,Mainifests,混淆,java文件的依賴和生成方法,須要依賴於Gradle構建app流程裏面。
這裏須要科普一下基礎gradle構建基礎
(1) XX.dependsOn YY 意思是 YY運行在XX以前
(2) XX.finalizedBy YY 意思是YY運行在XX以後
prepareReleaseDependencies 加載 遠端的依賴 加載 全部的須要從遠端下載的依賴
processReleaseManifest 依賴prepareReleaseDependencies 生成 AndroidManifest文件 在build/incremental/manifest/full/release
processReleaseResources 生成resources-release.ap_在 build/intermediates/resources下
compileReleaseJavaWithJavac 使用Javac編譯Java代碼
遍歷數組中各個lib的將srcDirs加入每一個的資源Assets目錄
都是相似這樣的合併module裏面的生成。
其實都是經過腳本的思想合併,只是他是經過gradle的構建合併,而我以前是經過python腳原本完成合並,再利用gradle打包。
關於gradle文件Application和Library之間的自由切換,我也寫好了封裝,想參照的話,請下載我寫ModuleBus的gradle文件。
若是踩到坑,能夠在留下你的評論,我及時處理。
*****2017.3.1*****
在個人QQ討論中的同窗,的確有人已經踩到坑了。
這裏說明一下,若是lib依賴的庫也有同樣的資源的命名,lib的命名會將庫內的資源id號給替換掉,其原來R的索引就不會存在。
(1)若是是一開始構建工程的時候,能夠查看我Gradle組件化優化的最後一點處理。
(2)若是是重構工程的,只能使用android stuido將衝突的資源一個一個批量替換了。
我創建了一個關於Android架構學習的羣,裏面能夠進一步進行組件化學習和架構思想的的交流。
羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!