一、要用模塊化、組件化才能完成 Android 項(xiàng)目中類加載功能的原因
Android項(xiàng)目中的類加載功能是通過Java虛擬機(jī)(JVM)實(shí)現(xiàn)的,而JVM是基于Java語言的模塊化和組件化設(shè)計(jì)思想來構(gòu)建的。因此,在Android項(xiàng)目中,如果要完成類加載功能,就需要使用模塊化、組件化的方法來組織代碼結(jié)構(gòu)和管理資源,以便讓JVM能夠更好地識(shí)別和加載所需的類文件。
Android工程的組件一般分為兩種:
application組件: 是指該組件本身就可以運(yùn)行并打包成apk。lib組件: 是指該組件屬于app的一部分,可以供其它組件使用但是本身不能打包成apk。正常一個(gè)App中可以有多個(gè)module(模塊),但是一般只會(huì)有一個(gè)module是設(shè)置為application的,其他均設(shè)置為library; 組件化開發(fā)就是要每個(gè)module都可以運(yùn)行起來,因此在開發(fā)期間每個(gè)module均設(shè)置為application,發(fā)布時(shí)再進(jìn)行合并。Android項(xiàng)目中代碼量達(dá)到一定程度,編譯將是一件非常痛苦的事情; 短則一兩分鐘,長則達(dá)到五六分鐘;隨著app業(yè)務(wù)的壯大,模塊越來越多,代碼量超10萬是很正常的。這個(gè)時(shí)候我們會(huì)遇到以下問題:
稍微改動(dòng)一個(gè)模塊的一點(diǎn)代碼都要編譯整個(gè)工程,耗時(shí)耗力公共資源、業(yè)務(wù)、模塊混在一起耦合度太高不方便測試組件化開發(fā)可以有效降低代碼模塊的耦合度,使代碼架構(gòu)更加清晰,同時(shí)模塊化的編譯可以有效減少編譯時(shí)間,當(dāng)然總的編譯時(shí)間是不會(huì)減少的,只是App模塊化之后開發(fā)某個(gè)模塊時(shí),只需要編譯特定模塊,可以快速編譯調(diào)試。通過模塊化和組件化,可以將整個(gè)應(yīng)用分解為多個(gè)模塊或組件,并將其編譯成不同的二進(jìn)制文件,從而實(shí)現(xiàn)代碼的復(fù)用和靈活性。同時(shí),模塊化和組件化還能簡化開發(fā)流程、提高代碼質(zhì)量,并使代碼更易于維護(hù)和升級(jí)。
二、模塊化、組件化和插件化簡介
在 Android 中,組件化、插件化和模塊化都是很常見的架構(gòu)設(shè)計(jì)手段,用于提高應(yīng)用開發(fā)的靈活性、擴(kuò)展性和復(fù)用性。組件化、插件化和模塊化可以混合使用,根據(jù)項(xiàng)目的需求和規(guī)模選擇合適的方案。
1、模塊化
模塊化最初的目的是將同一類型的代碼整合在一起; 所以模塊的功能相對(duì)復(fù)雜,但都同屬于一個(gè)業(yè)務(wù);不同模塊之間也會(huì)存在依賴關(guān)系; 但大部分都是業(yè)務(wù)性的互相跳轉(zhuǎn),從地位上來說它們都是平級(jí)的。模塊化編程是一種軟件設(shè)計(jì)技術(shù),強(qiáng)調(diào)將程序的功能分離為獨(dú)立的可互換模塊,因此每個(gè)模塊都包含僅執(zhí)行所需功能的一個(gè)方面所需的一切。簡單來說就是:模塊化是將功能拆分,分成相互獨(dú)立的模塊,以便于每個(gè)模塊只包含與其自身功能相關(guān)的內(nèi)容。
特點(diǎn):
分屬同一功能/業(yè)務(wù)的代碼進(jìn)行隔離(分裝)成獨(dú)立的模塊,可以獨(dú)立運(yùn)行; 以頁面、功能或其他不同粒度劃分程度不同的模塊,位于業(yè)務(wù)框架層,模塊間通過接口調(diào)用,目的是降低模塊間的耦合,由之前的主應(yīng)用與模塊耦合,變?yōu)橹鲬?yīng)用與接口耦合,接口與模塊耦合;模塊就像有多個(gè)USB插口的充電寶,可以和多部手機(jī)充電,接口可以隨意插拔,復(fù)用性很強(qiáng),可以獨(dú)立管理; 模塊就像是獨(dú)立的功能和項(xiàng)目(如淘寶:注冊、登錄、購物、直播…),可以調(diào)用組件來組成模塊,多個(gè)模塊可以組合成業(yè)務(wù)框架。模塊化設(shè)計(jì)是將整個(gè)項(xiàng)目按照功能模塊進(jìn)行拆分,在開發(fā)期間更加方便地進(jìn)行分工協(xié)作。和組件化不同,模塊化并不是將業(yè)務(wù)邏輯拆分到不同的組件內(nèi)部,而是將整個(gè)項(xiàng)目按照業(yè)務(wù)模塊進(jìn)行邏輯的劃分。在實(shí)現(xiàn)模塊化的過程當(dāng)中,可以采用以下步驟:
確定項(xiàng)目中每個(gè)模塊的職責(zé)和功能。使用 Gradle 等自動(dòng)化工具來管理每個(gè)模塊的依賴關(guān)系。使用業(yè)務(wù)相關(guān)的命名空間來劃分代碼的功能,從而實(shí)現(xiàn)模塊化。定義接口或抽象類來規(guī)范模塊之間的交互,避免相互依賴。2、組件化
組件化最初的目的是代碼重用,功能相對(duì)單一或者獨(dú)立; 在整個(gè)系統(tǒng)的代碼層次上位于最底層,被其他代碼所依賴,所以說組件化是縱向分層。基于組件的軟件工程 (CBSE) 也稱為基于組件的發(fā)展 (CBD),是軟件工程的一個(gè)分支,它強(qiáng)調(diào)在給定軟件系統(tǒng)中提供的廣泛功能方面的關(guān)注點(diǎn)分離。它是一種基于重用的方法,用于定義、實(shí)現(xiàn)和組合松散耦合的獨(dú)立組件到系統(tǒng)中。這種做法旨在為軟件本身和贊助此類軟件的組織在短期和長期帶來同樣廣泛的利益。簡單來說就是:組件化就是基于可重用為目的的,將一個(gè)大的軟件系統(tǒng)按照分離關(guān)注點(diǎn)的形式,拆分多個(gè)獨(dú)立的組件,減少耦合。
組件化的核心思想是將業(yè)務(wù)拆分成獨(dú)立的模塊,利用模塊間的相互獨(dú)立性,將不同業(yè)務(wù)模塊分割成不同的組件。這樣可以提高代碼的可復(fù)用性、可維護(hù)性和可拓展性。在實(shí)際開發(fā)中,可以采用以下步驟來實(shí)現(xiàn)組件化:
將項(xiàng)目按照不同的業(yè)務(wù)模塊進(jìn)行拆分。使用路由框架來實(shí)現(xiàn)模塊與模塊之間的跳轉(zhuǎn)(通常使用 ARouter)。采用組件化設(shè)計(jì)模式,將組件間的依賴關(guān)系進(jìn)行清晰地規(guī)劃和管理,包括使用接口或抽象類定義組件的標(biāo)準(zhǔn)、使用消息機(jī)制來解耦組件之間的關(guān)系等。在代碼實(shí)現(xiàn)時(shí)要注意各個(gè)模塊之間的耦合度,避免出現(xiàn)相互依賴、難以維護(hù)的情況。特點(diǎn):
把重復(fù)的代碼提取出來合并成為一個(gè)個(gè)組件,組件最重要的就是重用(復(fù)用),位于框架最底層,其他功能都依賴于組件,可供不同功能使用,獨(dú)立性強(qiáng)組件就像一個(gè)個(gè)小的單位,多個(gè)組件可以組合成組件庫,方便調(diào)用和復(fù)用,組件間也可以嵌套,小組件組合成大組件3、插件化
插件化是指將應(yīng)用程序的一部分功能打包成一個(gè)插件,通過動(dòng)態(tài)加載和卸載實(shí)現(xiàn)功能的增減。插件化相比于常規(guī)的 apk 開發(fā),更加靈活,能夠動(dòng)態(tài)的添加功能模塊,且不需要重新編譯打包整個(gè)應(yīng)用程序,縮小了應(yīng)用程序的體積。插件化的主要思想就是將應(yīng)用的某些功能模塊以插件的形式動(dòng)態(tài)加載到主工程中,從而實(shí)現(xiàn)應(yīng)用動(dòng)態(tài)化、組件化、靈活化、輕量化等一系列的好處。
插件化的實(shí)現(xiàn)步驟如下:
開發(fā)插件化應(yīng)用之前,需要先寫一套基于插件化框架的核心代碼,包括插件的加載、安裝、卸載和類加載等邏輯。編寫插件模塊時(shí),需要將代碼寫成插件模式,即將代碼和資源打包成一個(gè) APK,并且確保插件與主工程是相互獨(dú)立、互不干擾的。主工程需要能夠動(dòng)態(tài)地加載某些插件,并進(jìn)行跳轉(zhuǎn)和使用。需要考慮插件與主工程之間的數(shù)據(jù)傳遞、通信和資源共享等問題,從而實(shí)現(xiàn)完整的插件化功能。特點(diǎn):
宿主和插件分開編譯并發(fā)開發(fā)動(dòng)態(tài)更新插件按需下載模塊方法數(shù)或變量數(shù)爆棚插件無需安裝即可運(yùn)行延伸閱讀1:組件化開發(fā)的優(yōu)點(diǎn)
業(yè)務(wù)模塊分開,每個(gè)模塊可以獨(dú)立開發(fā)編譯運(yùn)行,解耦的同時(shí)也降低了項(xiàng)目的復(fù)雜度開發(fā)單個(gè)模塊時(shí)可以共享資源和工具類可以針對(duì)單個(gè)模塊測試, 開發(fā)調(diào)試時(shí)不需要對(duì)整個(gè)項(xiàng)目進(jìn)行編譯多人合作時(shí)可以只關(guān)注自己的業(yè)務(wù)模塊,把某一業(yè)務(wù)當(dāng)成單一項(xiàng)目來開發(fā)可以靈活的對(duì)業(yè)務(wù)模塊進(jìn)行組裝和拆分