android組件化現在來說算是比較老生常談的一種方式了,寫此文主要是回顧+鍛鍊自己表達能力,主要描述下思想,具體的代碼實現不做過多贅述,主要是仿照實現了ARouter的功能
常用的開發大體上來說分爲了模塊化,組件化,插件化,像模塊化主要是將一些公共功能以及一些業務模塊進行抽離,其實來說是適用大多數項目的,組件化以及插件化個人感覺比較適用於大一些的項目,團隊與團隊之間配合這樣的,這裏主要說下組件化的實現思想,插件化在後面再說
各個組件之間是沒有直接聯繫的,但是可以共用一些圖片資源,公共的業務以及一些工具類之類的存在,而組件化的好處是最終打包時可以快速選擇要匹配進去的包,也可以快速替換,平時開發時則可以各個組件自己打包,能挺高打包效率
那麼現在我們就需要解決兩個問題了
1.怎麼配置相互關係以及各自打包
2.模塊間如何進行通信
現在我們先來解決第一個問題,我們知道android打包其實進行的task任務,是通過gradle來進行配置的,所以這裏我們可以通過gradle來解決這個問題,因爲像compileSdkVersion,minSdkVersion這些是通用的,所以我們可以統一抽離一下創建config.gradle
ext { //extend
// false: 組件模式 代表各個模塊可以自己運行
// true :集成模式 只有一個主工程
isModule = true
android = [
compileSdkVersion: 28,
minSdkVersion : 19,
targetSdkVersion : 28,
versionCode : 1,
versionName : "1.0"
]
appId = ["app" : "com.tgp.routerapp",
"module1": "com.tgp.module1",
"module2" : "com.tgp.module2" ]
supportLibrary = "28.0.0"
dependencies = [
"appcompat-v7" : "com.android.support:appcompat-v7:${supportLibrary}",
]
}
用isModule來區分是單獨運行還是打包進主工程中,我們平時創建一個類庫或者工程項目的時候,可以看到apply plugin是不同的
if (isModule) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
同時,類庫和工程的清單文件也是不一樣的,所以我們需要根據參數判斷引入哪個清單文件以及代碼,這個在gradle的sourceSets中進行設置就可以了
//資源配置
sourceSets {
main {
//在組件模式下 使用不同的manifest文件
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'
java {
//排除java/debug文件夾下的所有文件
exclude '*module'
}
}
}
}
所以我們用這個來區分就可以實現更改配置來解決第一個問題點了
接下來就是第二點的問題了,組件化中最主要的問題也是不同組件之間如何進行通信
這裏就需要我們使用到java中的註解處理器來處理了,我們在ARouter可以看到我們使用的時候只是在添加了一些註解就可以實現相應的跳轉操作,其實是我們標註了註解之後,註解處理器在編譯器就把我們生成相應的代碼去實現一些跳轉功能,這裏仿照實現的時候是存儲了一個map集合中,那主要的key,value是什麼呢?我們接着往下看
每個組件裏面可能會有多個添加了註解的類,如果組件非常多的話,會越來越複雜,而查找的時候先直接通過module來是可以很快找到的,在一個組件裏面的類中,會進行分組,可以按照不同的功能方向等來進行區分,也是方便更快的查找,所以我們可以看到
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
annotationProcessor project(':router_compiler')
implementation project(':base')
}
這樣的配置存在,當然除了跳轉,還有調用方法,接收字段這些都需要註解處理器來進行處理,在編譯時就生成相關代碼
這些就是搭建組件化的基本思路,有更好的方式的歡迎提供學習