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