組件化SDK

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。
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.學習

android-fat-aar

說一下重點吧,那個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以後

下面這些都是gradle的構建的流程

prepareReleaseDependencies 加載 遠端的依賴 加載 全部的須要從遠端下載的依賴

processReleaseManifest 依賴prepareReleaseDependencies 生成 AndroidManifest文件 在build/incremental/manifest/full/release

processReleaseResources 生成resources-release.ap_在 build/intermediates/resources下

compileReleaseJavaWithJavac 使用Javac編譯Java代碼


還有更多的構建流程能夠查看Gradle 構建流程

遍歷數組中各個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,也能夠掃碼進羣。我在這裏期待大家的加入!!!

相關文章
相關標籤/搜索