組件化原理
組件化是在模塊化的基礎(chǔ)上,通過修改build.gradle的參數(shù),使各個模塊可以在library和application之間轉(zhuǎn)換.
每個模塊可以單獨(dú)運(yùn)行,開發(fā)好后組裝在一起形成完整的apk
路由框架
使用組件化和模塊化開發(fā)時,由于各個組件之間不能相互依賴(你依賴我,我又反過來依賴你),各個模塊之間的通信成為了組件化的痛點(diǎn).
為了解決這個問題,引入了路由框架
路由框架的原理是,在需要通信的文件上添加注釋,編譯時通過AbstractProcessor拿到注釋和相關(guān)的文件,創(chuàng)建一個路由表,路由表記錄注釋(路由地址)和相應(yīng)的文件信息.然后通過Apt動態(tài)生成一個類,封裝路由表中的信息,其他的模塊使用路由地址在這個Apt封裝類中拿到路由信息,實(shí)現(xiàn)模塊間的通信.
組件化的項目架構(gòu)
分為app模塊,base模塊,模塊1,模塊2,路由框架模塊
app模塊是一個殼,base模塊封裝通用的基礎(chǔ)功能,比如工具類,網(wǎng)絡(luò)請求等等
模塊一和模塊2是模擬具體的業(yè)務(wù)模塊
路由模塊負(fù)責(zé)模塊間的通信
build.gradle的配置
模塊間通過build.gradle的配置來實(shí)現(xiàn)library和application之間的轉(zhuǎn)化
首先創(chuàng)建一個config.gradle來配置一些全局的通用屬性
ext{}代表全局的屬性
isModule用來控制模塊化和組件化之間的轉(zhuǎn)換
android=[]用來配置每個模塊的sdk版本和version版本
appId用來記錄每個模塊的包名,在轉(zhuǎn)換為組件化之后,需要配置appId,不然無法當(dāng)做一個application運(yùn)行
supportLibrary表示兼容包的版本
dependencies用來表示v7包
然后再項目的build.gradle中通過apply from: "config.gradle"引入config.gradle,這樣相當(dāng)于將config.gradle中配置的屬性黏貼到Project的build.gradle中,在項目的各個模塊中就可以使用config.gradle中的屬性了
然后再來看每個模塊的build.gradle配置
首先看app模塊,app模塊是項目的入口,也是項目的殼,用來組裝各個業(yè)務(wù)模塊
apply plugin:'com.android.application'表示app模塊是一個application模塊
def cfg = rootProject.ext.android表示將config.gradle中配置的android = [] 中的屬性,賦值給cfg
appId同理
然后在android{}中使用config.gradle中android=[] 和 appId=[]中的類容
在dependencies{}中,通過isModule來決定是否添加功能模塊的依賴,如果功能模塊處于application模式下,無法添加為依賴的
再來看base模塊,base模塊是通用功能模塊
apply plugin:'com.android.library'表示base模塊是一個library模塊,可以供其他模塊依賴
同時,library模塊也通過api project(':router-core')依賴了router-core模塊
再來看看功能模塊,以module2為例
首先通過isModule來配置module2為library還是application
buildConfigField("boolean","isModule",String.valueOf(isModule))是將isModule配置進(jìn)module2的BuildConfig文件中
applicationId appId['module2']如果是組件化,添加appId
sourceSets{
main{
if(!isModule){
manifest.srcFile'src/main/module/AndroidManifest.xml'
java.srcDirs 'src/main/module/java',src/main/java"
}else{
manifest.srcFile'src/main/AndroidManifest.xml'
}
}
}
在組件化下,使用src/main/module/AndroidManifest.xml下的清單文件,這個清單文件里面配置了啟動的Activity
同理 java.srcDirs 'src/main/module/java',src/main/java"表示,在組件化下,編譯時會編譯src/mian/module/java下的java文件