[Android]如何做一個(gè)崩潰率少于千分之三噶應(yīng)用app(17)-組件化SDK

以下是我這個(gè)系列的相關(guān)文章,有興趣可以參考一下,可以給個(gè)喜歡或者關(guān)注我的文章。

[Android]如何做一個(gè)崩潰率少于千分之三噶應(yīng)用app--章節(jié)列表


如果一開始關(guān)注我的同學(xué),應(yīng)該有看過這一篇技術(shù)[Android]多module合成單一module技巧

為何要使用多module合一呢?

1.如果你使用的是組件化架構(gòu)

2.你想將你的app封成插件aar(也就是別人說的sdk)。

*arr和jar的區(qū)別是,java你要打包將可以把代碼打包成jar的包,而Android studio打包可以代碼和資源都打包成aar文件,供外部調(diào)用


之前我介紹的文章中,說的是用了一個(gè)笨拙的使用python腳本合成一個(gè)module然后再進(jìn)行打包。

近來我有同事發(fā)現(xiàn),有一個(gè)新的開源庫(kù)可以達(dá)到相同的效果,看來大神還是很多的。

Talk is too cheap,show you the code.

android-fat-aar

說一下重點(diǎn)吧,那個(gè)github的地址里面,點(diǎn)進(jìn)去就會(huì)看到解析都是用英文,估計(jì)是外國(guó)的大神寫的,但是木有提供中文講解,估計(jì)會(huì)有人沒看懂。

重點(diǎn)是fat-aar.gradle這個(gè)文件,這里提供兩種方式

1.下源碼copy到想要生成出aar的module里面的目錄,build.gradle一樣的層級(jí)就可以了

然后在build.gradle里面引用這個(gè)

2.或者直接引用

建議還是下載源碼放到目錄里面,有啥問題,自己也一目了然,不至于一面懵B

下一步就要將相關(guān)的功能module作出依賴了,這里需要使用embedded的關(guān)鍵字,為啥是這個(gè)關(guān)鍵字等下給大家解析

然后這樣就成功了???

如果你在主module這樣用估計(jì)你就可以看到以下的編譯錯(cuò)誤了,

到了這里估計(jì)你會(huì)查看packageReleaseResources這個(gè)屬性是什么,然而你還是不清楚。

這里踩到的坑,這里是要將編譯生成aar的sdk文件,那么我們需要將module從application變更為lib,這樣才符合要求

倘若你設(shè)置了applicationId,那么也請(qǐng)你注釋掉

還有在之前多module合一的文章中有提到過,不能使用swtich case的語(yǔ)句,因?yàn)檫@樣會(huì)將變量聲明會(huì)final屬性的,aar不支持這樣的語(yǔ)句,全部需要改為if else語(yǔ)句

好吧,做完這些之后,你需要跑gradle的命令,只需要跑你那個(gè)module里面的命令就可以了。暫時(shí)只支持使用Release命令

最終會(huì)在outputs文件夾,生成一個(gè)aar文件

你們所要的sdk就這樣生成了。


相信有很多人已經(jīng)猜到關(guān)鍵文件是fat-aar.gradle這個(gè)文件了,他是使用gradle作為編譯腳本。

那么我們還是這個(gè)文件里面,究竟寫了什么吧

對(duì)于我這種gradle小白,也是要認(rèn)真考究一番才能解析到大家明白。


Gradle對(duì)依賴進(jìn)行分組,允許編譯時(shí)使用一組依賴,運(yùn)行時(shí)使用另一組依賴。每一組依賴稱為一個(gè)Configuration,

聲明embedded為一類依賴

同時(shí)會(huì)添加到compile里面

然后定義一些變量,例如jar文件,aar文件夾,還有R文件

然后定義一些生成的文件夾

執(zhí)行打包前需要運(yùn)行afterEvaluate,完成一些額外的配置

它先會(huì)指定你的aar文件夾的路徑,就是引用的lib的路徑,

如果生成的是aar會(huì)加入到embeddedAarDirs的數(shù)組列表,如果是jar會(huì)加到embeddedJars的數(shù)組列表

然后需要指定一些Assets,資源,JNI,Mainifests,混淆,java文件的依賴和生成方法,需要依賴于Gradle構(gòu)建app流程里面。

這里需要科普一下基礎(chǔ)gradle構(gòu)建基礎(chǔ)

(1) XX.dependsOn ?YY ?意思是 YY運(yùn)行在XX之前

(2) XX.finalizedBy ?YY 意思是YY運(yùn)行在XX之后

下面這些都是gradle的構(gòu)建的流程

prepareReleaseDependencies 加載 遠(yuǎn)端的依賴? 加載 所有的需要從遠(yuǎn)端下載的依賴

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

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

compileReleaseJavaWithJavac? ? ? ? 使用Javac編譯Java代碼

還有更多的構(gòu)建流程可以查看Gradle 構(gòu)建流程

遍歷數(shù)組中各個(gè)lib的將srcDirs加入每個(gè)的資源Assets目錄

都是類似這樣的合并module里面的生成。

其實(shí)都是通過腳本的思想合并,只是他是通過gradle的構(gòu)建合并,而我之前是通過python腳本來完成合并,再利用gradle打包。

關(guān)于gradle文件Application和Library之間的自由切換,我也寫好了封裝,想?yún)⒄盏脑?,?qǐng)下載我寫ModuleBus的gradle文件。

如果踩到坑,可以在留下你的評(píng)論,我及時(shí)處理。


*****2017.3.1*****

在我的QQ討論中的同學(xué),的確有人已經(jīng)踩到坑了。

這里說明一下,如果lib依賴的庫(kù)也有一樣的資源的命名,lib的命名會(huì)將庫(kù)內(nèi)的資源id號(hào)給替換掉,其原來R的索引就不會(huì)存在。

(1)如果是一開始構(gòu)建工程的時(shí)候,可以查看我Gradle組件化優(yōu)化的最后一點(diǎn)處理。

(2)如果是重構(gòu)工程的,只能使用android stuido將沖突的資源一個(gè)一個(gè)批量替換了。


***2017.3.8****

今天群里的同學(xué)踩到坑了,打包成debug包,然后發(fā)現(xiàn)代碼都沒有放到aar包里面。

分析了一下,原來fat-aar.gradle暫時(shí)不支持打包成為debug

在afterEvaluate最后一部分,只支持Release包放入java文件。


***2017.3.14****

群里的同學(xué)嘗試,如果在lib module想要生成aar,但是其里面會(huì)引用到其他aar的文件。發(fā)現(xiàn)會(huì)有引用里面一層的aar文件資源的時(shí)候會(huì)引用不到?

然后到這里需要認(rèn)真去了解一下,究竟aar文件究竟包含了什么?

當(dāng)你將aar解壓成zip文件的時(shí)候,你會(huì)發(fā)現(xiàn)里面有幾個(gè)文件夾。

跟我們平常的工程沒太大差別。

那么我們的代碼都應(yīng)該是在classes.jar文件中,fat-aar中生成代碼的地址。

調(diào)用地址
真實(shí)地址

module中引用aar文件

其代碼文件里面只有R.txt

說明其實(shí)質(zhì)代碼并沒放到這個(gè)文件夾內(nèi),為什么會(huì)出現(xiàn)這樣的情況呢?

因?yàn)槲覀兤鋵?shí)這些aar的文件打包的時(shí)候使用compile

而這里需要使用fat的embedded才能走fat的流程,這樣才會(huì)把代碼放到合成的位置,然后進(jìn)行進(jìn)一步的打包

那么問題來了,網(wǎng)絡(luò)的包,例如v4這樣的包是否也可以將代碼下來合成呢?有興趣這里去嘗試一下。


*****2017.3.29******

當(dāng)你gradle從2.2升級(jí)到2.3以上 你會(huì)發(fā)現(xiàn)使用fat-aar會(huì)出現(xiàn)以下問題。

從官網(wǎng)提供了解決的方法。


我建立了一個(gè)關(guān)于Android架構(gòu)學(xué)習(xí)的群,里面可以進(jìn)一步進(jìn)行組件化學(xué)習(xí)和架構(gòu)思想的的交流。

群號(hào)是316556016,也可以掃碼進(jìn)群。我在這里期待你們的加入?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容