Android Application 組件化

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。
git

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表github


這個系列的有關架構的概念,適合有大概三年以上Android經驗的同窗理解。若是你大概一年半以上經驗,入門進階了,我近段時間會開展分析MVP的相關架構章節。到時有興趣的同窗,能夠查看一番。數組

在我建立的QQ羣中,收到不少熱心好學的同窗詢問一些問題,而後咱們討論進一步思考這些問題,也多謝他們給的建議,讓我也受益不淺。架構

這節要討論的Application組件化的相關問題。app

問題來了,每一個module中均可以有Application嗎,一個工程中能所有裝載這些Application嗎?組件化

爲了驗證這個問題,我就嘗試在個人主工程建立一個Application,兩個次級的功能module裏各自聲明一個Application,而後編譯,而後你會意外發現出錯了。學習


功能編譯錯誤

會提示工程裏面存在着多個Application,須要使用「tools:replace="andriod:name」聲明去複寫AndroidMainifest.xml的文件優化

好吧,改就改吧,修改完功能的Application,而後繼續編譯。。。ui

發現,繼續宿主的Application會出現問題了,仍是以前同樣的問題,那隻好繼續修改了。xml


主module編譯error

而後是能夠編譯成功了,問題來了,那Application最後會成爲囧樣的呢?

從編譯的build的mainfest的文件夾裏面AndroidMainfest.xml,看到最終仍是以ModuleApplication做爲最終的module的。


那麼那麼咱們能夠猜測到,編譯應該是功能module的完成,再繼續編譯主module生產Application,可是惋惜Android studio的編譯並不容許這些Application做爲合併,只會將最後的Application放到工程裏面編譯。

既然編譯只能做爲替換Application,有些引用的庫是須要Application的onCreate裏面初始化,或者這個時間觸發的。這將會讓咱們的工程資源是否能必須引用更多的庫,會影響整個工程的體積。

那麼咱們能夠怎麼解決各個module初始化的問題呢???

相信有看過我之間這個系列文章的同窗應該有必定的體會。

這裏我提出了接口的思想去解決問題。

(1)我先建立一個ModuleImpl的接口,裏面有一個onLoad(Application app)的方法


(2)咱們讓須要作某些初始化的Module繼承這個ModuleImpl的接口

而後添加覆寫方法

(3)咱們在主module的PageConfig裏面能夠創建一個引用的列表


(4)而後咱們創建一個ModuleApplicaiton到主module,而後使用反射方法的思想來運行。


這樣就能夠完成直接反射調用了,能夠運行每一個的module的onLoad初始化。

Application的onCreate並木有參數,因此個人onLoad裏面只傳入Application自己進去。

那麼這樣就已是最好的處理了?

(1)其實這裏反射能夠再簡化運用接口調用


這裏對比了一下反射速度,其實並沒相差多少。可是直接運行接口方法,確定是要反射調用快的。關於反射方法優化,請自行百度。

(2)這裏簡單的試了一下,就只是打印一些東西啓動的時候反射調用了兩個文件打印10個log時間8。

反射的是分兩方面的

1.Class.forName建立類

Class.forName是經過類名,找到類再建立,咱們這裏每一個module初始化的時候都須要調用一個類建立。

2.invoke調用

這裏invoke調用是經過搜索類中方法的列表來調用的,那麼對比類中方法也是須要時間的,剛剛初始化的對象是module裏方法多了反射將會很是變慢。

這裏咱們初始化的時候,由於減小查詢的方法表的速度,只封裝一個類,加載一個方法來調用,再次編譯PageConfig的數組和ModuleApplication裏面遍歷,再試試調用方法,你會發現調用的時間會變爲3。只是小小的優化。


具體的能夠查看ModuleBus開源源碼github.com/cangwang/Mo…

(想要壁紙,那就下源碼吧)


還有更優化的Application初始化方法嗎?

1.我的以爲只能相似EventBus3.0的編譯時註解才能真正提高編譯了。

2.也可使用AOP相關思想來作。

不知道是否有同窗想到如何優化,能夠留言給更多的建議,謝謝!!!


我創建了一個關於Android架構學習的羣,裏面能夠進一步進行組件化學習和架構思想的的交流。

羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!

相關文章
相關標籤/搜索