項目組件化歷程(MVP+dagger2+ARouter)

可以參考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的使用以及模塊化的一些問題,今天先寫到這裏,後面再繼續寫。

 

後篇:

項目組件化集成ARouter,Dagger2

項目組件化MVP,Dagger2,ARouter使用


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章