模塊化
模塊化是指以重用化為目的,將一個(gè)系統(tǒng)拆分為一個(gè)個(gè)單獨(dú)的小功能工具:避免重復(fù)造輪子,節(jié)省開發(fā)維護(hù)成本;降低項(xiàng)目復(fù)雜性,提升開發(fā)效率;同一個(gè)模塊,在一定層度上確保了技術(shù)方案的統(tǒng)一性。
組件化
由app空殼,只包含mainActivity的東西,和baseModule和各個(gè)module組成完整項(xiàng)目.
APP空殼module:聲明應(yīng)用包名,名稱、圖標(biāo)以及其他組件中最終在集成開發(fā)模式下都被合并到這份 AndroidManifest.xml 中。另外Android還有應(yīng)用的打包簽名代碼混淆。
basemodule:在基礎(chǔ)組件的Application實(shí)現(xiàn)各組件Application初始化操作(反射方法獲取所有依賴的module的application),統(tǒng)籌管理所有依賴關(guān)系,moudle向base module注冊(cè)service接口,其他module可以調(diào)用實(shí)現(xiàn)跨moudle通信。還有就是共用工具庫的實(shí)現(xiàn)。
普通module:業(yè)務(wù)相關(guān)的各個(gè)模塊。通過修改他們的buildtype可以設(shè)置是單獨(dú)運(yùn)行還是集成運(yùn)行,每個(gè)moudle擁有自己的application和兩份清單文件,集成編譯時(shí)設(shè)置引用app的application和清單文件。還要注意資源名重復(fù),通過加前綴。
組件化優(yōu)勢(shì)
1.組件化解耦:使各業(yè)務(wù)組件化間解耦,因此各個(gè)都是獨(dú)立的module,它們之間是沒有依賴關(guān)系。
2.單獨(dú)編譯:每個(gè)module實(shí)際上也是一個(gè)完整的項(xiàng)目,可以進(jìn)行單獨(dú)編譯,調(diào)試。
3.并行開發(fā):互不影響可以并行開發(fā)。
組件通信
1.組件之間的頁面跳轉(zhuǎn) (Activity 到 Activity, Fragment 到 Fragment, Activity 到 Fragment, Fragment 到 Activity) 以及跳轉(zhuǎn)時(shí)的數(shù)據(jù)傳遞 (基礎(chǔ)數(shù)據(jù)類型和可序列化的自定義類類型)。使用arouer跳轉(zhuǎn)
2.組件之間的自定義類和自定義方法的調(diào)用(組件向外提供服務(wù))。需要 ARouter 配合架構(gòu)中的 公共服務(wù)(CommonService) 實(shí)現(xiàn):在公共服務(wù)(CommonService) 中聲明 Service 接口 (含有需要被調(diào)用的自定義方法), 然后在自己的模塊中實(shí)現(xiàn)這個(gè) Service 接口, 再通過 ARouter API 暴露實(shí)現(xiàn)類。此外還可通過eventBus等異步通信庫。
arouter路由原理
我們?cè)诖a里加入的@Route注解,會(huì)在編譯時(shí)期通過apt生成一些存儲(chǔ)path和activity.class映射關(guān)系的類文件,然后app進(jìn)程啟動(dòng)的時(shí)候會(huì)加載這些類文件,把保存這些映射關(guān)系的數(shù)據(jù)讀到內(nèi)存里(保存在map里),然后在進(jìn)行路由跳轉(zhuǎn)的時(shí)候,ARouter會(huì)通過它自己存儲(chǔ)的路由表找到路由地址對(duì)應(yīng)的Activity.class,它的內(nèi)部會(huì)調(diào)用startActivity(intent)進(jìn)行跳轉(zhuǎn),這樣便可以實(shí)現(xiàn)兩個(gè)相互沒有依賴的module順利的啟動(dòng)對(duì)方的Activity了。
插件化
插件化是將一個(gè)apk根據(jù)業(yè)務(wù)功能拆分成不同的子apk(也就是不同的插件),每個(gè)子apk可以獨(dú)立編譯打包,最終發(fā)布上線的是集成后的apk。在apk使用時(shí),每個(gè)插件是動(dòng)態(tài)加載的,插件也可以進(jìn)行熱修復(fù)和熱更新。
主要解決三個(gè)問題:如何加載類、如何加載資源、如何管理組件生命周期。
插件化原理
插件化就是通過類加載、資源加載、組件生命周期管理去動(dòng)態(tài)加載一個(gè)apk。
:類加載:
Android中類的加載也是通過ClassLoader來完成包含DexClassLoader和PathClassLoader。DexClassLoader用來加載未安裝apk的dex。PathClassLoader主要用來加載系統(tǒng)類和應(yīng)用程序的類。
資源加載
Android系統(tǒng)通過Resource對(duì)象加載資源,因此只需要將apk需要的資源文件所在路徑到AssetManager中,即可實(shí)現(xiàn)對(duì)插件資源的訪問。
生命周期管理
主流的是hook方式,通過自定義Instrumentation替換activityThread中的Instrumentation代理類欺騙了系統(tǒng),hook了Activity的啟動(dòng)和創(chuàng)建,省去了手動(dòng)管理插件Activity生命周期的繁瑣,讓插件Activity像正常的Activity一樣被系統(tǒng)管理,并且插件Activity在開發(fā)時(shí)和常規(guī)一樣,即能獨(dú)立運(yùn)行又能作為插件被主工程調(diào)用。
Atlas
熱修復(fù)
插件化是想把需要實(shí)現(xiàn)的模塊當(dāng)做一個(gè)獨(dú)立的提取出來,減少宿主的規(guī)模,使用時(shí)動(dòng)態(tài)加載。
熱修復(fù)強(qiáng)調(diào)的是在不需要二次安裝應(yīng)用的前提下修復(fù)已知的bug。
在原先的app打包的時(shí)候,阻止相關(guān)類去打上核查標(biāo)志,然后將補(bǔ)丁 dex 文件放到 dex數(shù)組靠前位置,這樣在加載 class 時(shí)被搶先加載代替掉Bug類從而達(dá)到修復(fù)的目的。
Tinker
插件化和組件化區(qū)別
1.組件化的單位是module靜態(tài)加載,插件化的單位是apk,動(dòng)態(tài)加載
2.關(guān)注點(diǎn)不同,插件化更關(guān)注動(dòng)態(tài)加載、熱更新、熱修復(fù)等‘插拔’技術(shù)。