Android組件化、模塊化開發

建議直接跳轉閱讀第二篇組件化文章

組件化案例視頻代碼傳送門:https://www.jikexueyuan.com/zhiye/course/84.html?type=18

Android 組件化案例第二篇:http://blog.csdn.net/asddavid/article/details/54599688

前言
在移動開發橫行,應用日漸飽和,開發週期,迭代週期要求越來越快的時代下,經常看見有羣裏小夥伴抱怨問題:

  • Gradle編譯一個項目需要10分鐘、20分鐘…..

  • 這什麼JB玩意兒,什麼都忘一個類裏放,怎麼改呀(扣腦殼)….

    這裏給出兩個方案:

    • 加大電腦內存,提升AndroidStudio的使用內存
    • 合理規劃項目結構,組件化、模塊化開發項目

第一個解決方案,貌似不太靠譜,總不能每次都換電腦吧?都已經硬件頂配還怎麼換啊。。。下面我們談談第二點,使用組件化,模塊化解決。

什麼是組件化

大致來說,組件可以分爲兩大類,一類是application組件,一類是libs組件的module.

application組件是一個可運行的app.
libs可以作爲application的依賴,但是自身不可作爲程序運行的存在。

一般開發的缺點,爲什麼組件化

  • 實施者對基礎模塊,基礎組件,中間層,上層業務的規劃不合理

  • 業務,組件,資源放在一起,任何一個改動都會消耗甚大,運行整個application

  • 因爲所有東西都一堆,項目不易維護,耦合度超高

  • 不利於單獨模塊化測試

組件化好處

組件化描述完畢後,看組件化後有什麼好處呢。

  • 每個Module可以單獨調試開發,節省編譯時間

  • 單獨個模塊開發可共享工具類,網絡庫等

  • 對測試來說可以對單個模塊進行快速測試

  • 公司業務繁重可以不斷複用模塊,節省開發時間

  • 對個人來說,可以積累個人的開發工具

組件化弊端

  • 組件與組件之間存在業務聯繫

  • 組件調用application

  • 資源命名重複

  • 引用的庫版本不對應,使用衝突

第一點:存在業務聯繫的可以歸納爲同一個組件

第二點:在基礎架構層建BaseApplication,統一使用

第三點:命名按照moduel的開頭命名

第四點: 參考此文

下面看兩張圖:
①:沒有組件化、模塊化的的項目

這裏寫圖片描述

不用多說,什麼都在application一個組件內部。

②:具有一定架構並組件化、模塊化
這裏寫圖片描述

這張圖也許有的兄弟看起來很模糊,馬上我們將其拆分從最底部慢慢升上來看。

  • SDK層
    這裏寫圖片描述

SDK層主要爲Android的SDK以及我們需要使用的第三方SDK(地圖、定位、直播等)

  • 基礎架構層
    這裏寫圖片描述

首先我們得選取一個整體架構模式,比如MVC。 其他模塊全部依賴於Base的基礎框架層完成,NetWork,SQLite、圖片加載庫,支付等組件模塊以便給予業務層使用。

  • 業務框架層
    這裏寫圖片描述

此處簡單列舉三個例子,有Login、Shop、Circle三大組件模塊,
此3個業務模塊需要什麼即依賴基礎框架層的Module完成。DEBUG期間可以單獨作爲application使用,當要正式打包時候將作爲libs使用。

  • 應用層
    這裏寫圖片描述
    應用層即爲application,依賴於業務框架(上訴的Login、Shop、Circle)完成的Native部分,如果有部分業務跨平臺了,如HyBird,React-Native等,混合開發將其和Native部分綜合即可完成一個App.

項目組件化圖例

這裏寫圖片描述

我們完成基礎框架模塊的newwork等模塊後將其加入basemvp,看看如何在basemvp依賴:

apply plugin: 'com.android.library'

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName  rootProject.ext.android.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile rootProject.ext.dependencies.appcompatV7
    compile rootProject.ext.dependencies.design
    compile project(':allure_base_module:imageloader')
    compile project(':allure_base_module:network')
    compile project(':allure_base_module:utils')
}

均依賴於basemvp的基礎框架。

業務模塊

apply plugin: 'com.android.library'

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName  rootProject.ext.android.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile rootProject.ext.dependencies.appcompatV7
    compile rootProject.ext.dependencies.design
    compile project(':allure_base_module:basemvp')
}

依賴於基礎框架模塊完成業務邏輯的書寫。

最終APP

apply plugin: 'com.android.application'

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName  rootProject.ext.android.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile rootProject.ext.dependencies.appcompatV7
    compile rootProject.ext.dependencies.design

    compile project(':allure_core_module:login')//登陸
      //其他模塊
}

僅僅需要依賴 業務模塊即可,至於你有多少業務模塊取決於你的業務。

總結

看完整篇內容,相信大家對組件化有了一定的認識,並知道組件化的好處,爲什使用它。
個人認爲,組件化的開發難度並不大,真正的難度在於理解當前公司的業務需求,並在其基礎上能很好的解耦提高靈活度,所以具體是否組件化還是得看公司的業務發展。

若公司業務發展單一,是否組件化意義並不大,反而會加大自身開發成本,當業務已經成熟在回頭來優化組件化也未嘗不可。

示例查看

發佈了44 篇原創文章 · 獲贊 12 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章