可以參考Android徹底組件化,不過我沒有用JIMU框架。
項目發展到一定程度,隨着人員的增多,代碼越來越臃腫,這時候就必須進行模塊化的拆分。在我看來,模塊化是一種指導理念,其核心思想就是分而治之、降低耦合。而在Android工程中如何實施,目前有兩種途徑,也是兩大流派,一個是組件化,一個是插件化。
要實現組件化,不論採用什麼樣的技術路徑,需要考慮的問題主要包括下面幾個:
- 代碼解耦。如何將一個龐大的工程拆分成有機的整體?
- 組件單獨運行。上面也講到了,每個組件都是一個完整的整體,如何讓其單獨運行和調試呢?
- 數據傳遞。因爲每個組件都會給其他組件提供的服務,那麼主項目(Host)與組件、組件與組件之間如何傳遞數據?
- UI跳轉。UI跳轉可以認爲是一種特殊的數據傳遞,在實現思路上有啥不同?
- 組件的生命週期。我們的目標是可以做到對組件可以按需、動態的使用,因此就會涉及到組件加載、卸載和降維的生命週期。
- 集成調試。在開發階段如何做到按需的編譯組件?一次調試中可能只有一兩個組件參與集成,這樣編譯的時間就會大大降低,提高開發效率。
- 代碼隔離。組件之間的交互如果還是直接引用的話,那麼組件之間根本沒有做到解耦,如何從根本上避免組件之間的直接引用呢?也就是如何從根本上杜絕耦合的產生呢?只有做到這一點纔是徹底的組件化
基於以上目的再gradle中做如下操作
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
defaultConfig {
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
sourceSets {
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成開發模式下排除debug文件夾中的所有Java文件
java {
exclude 'debug/**'
}
}
}
}
isModule我放在工程的gradle.properties中切換時library還是要單獨運行
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
下面時阿里的ARouter在模塊化使用中在module需要加了
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
下面時切換AndroidManifest,當是單獨運行時是有應用名圖標等的。如果不分開是有AndroidManifest合併衝突的。
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成開發模式下排除debug文件夾中的所有Java文件
java {
exclude 'debug/**'
}
}
}
還有就是dependencies中添加依賴的問題。在多個module中添加依賴需要注意的地方。
以前用compile現在分implementation和api,這兩個是有區別的。簡單說個特例,就是當你有個公共組件module裏面還有個公共基礎組件。然後你的功能模塊的組件添加了公共組件,如果你要使用依賴的公共組件的依賴的基礎組件你用implementation就不能使用。你就要用api了。這就是區別。
以上你基本就能進行了。下面再說dagger2,arouter在組件化項目中的如何添加依賴。然後是mvp結合dagger2的使用以及模塊化的一些問題,今天先寫到這裏,後面再繼續寫。
後篇: