Android工程架構設計:組件化二(項目實戰)

目錄

 

一,業務拆分

1.1.man

1.2.登錄

1.3.電站  ......

1.4.告警  ......

1.5.工單  ......

1.6.消息中心

1.7.設置

二,組件化框架設計搭建

架構圖:

工程圖:

2.1,app主框架(app)

2.2,業務層組件(module)

2.3,業務功能組件(module_library)

2.4,基礎組件(library)

2.4.1,library_base

2.4.2,library_common

2.4.3,library_net

2.4.4,library_router

2.4.5,library_multiple_pictures_selector


一,業務拆分

把業務需求按照功能模塊進行拆分,拆分原則:獨立,解耦

以下爲正在實施的實際項目中,業務組件化拆分方案,僅供參考:

1.1.man

業務內容:主框架包含引導頁(歡迎頁,啓動頁),app主頁框架。

數據流程:app啓動引導頁(歡迎頁,啓動頁)—— 已登錄,則直接進入app主頁;未登錄,跳轉到登陸頁進行登錄操作。

電站,告警,工單,設置: 需要相關module提供fragment服務(組件間通訊)

登錄頁: 需要登錄module提供跳轉服務(組件間通訊)

首頁:將對外開放訪問服務(登錄成功跳轉回MainActivity的場景)(組件間通訊)

1.2.登錄

業務內容:登錄(賬號密碼登錄,手機短信登錄);忘記密碼(找回密碼)

數據流程:登錄成功 —— app主頁面

登錄頁:將對外開放訪問服務(組件間通訊)

首頁跳轉:需要main module提供跳轉服務(組件間通訊)

1.3.電站  ......

1.4.告警  ......

1.5.工單  ......

1.6.消息中心

業務內容:消息列表(告警消息列表,工單消息列表);點擊跳轉到告警,工單詳情頁。

操作流程:電站,告警,工單,設置四個Fragment均有進入消息中心的入口圖標,點擊進入消息中心。

消息中心入口: 對外開放訪問服務(組件間通訊)

告警詳情頁,工單詳情頁: 需要告警,工單module提供跳轉服務(組件間通訊)

1.7.設置

設置fragemnt: 對外提供獲取Fragment服務。(組件間通訊)

消息中心入口: 需要消息中心module提供跳轉服務。(組件間通訊)

二,組件化框架設計搭建

組件化app從上至下,包含app主框架(app);業務層組件(module);業務功能組件(module_library);基礎組件(library)。

組件化app從上至下,包含app主框架(app);業務層組件(module);業務功能組件(module_library);基礎組件(library)。

架構圖:

工程圖:

2.1,app主框架(app)

app

2.2,業務層組件(module)


module部分可以細分爲兩部分,一部分是純業務層module;另一部分是在業務需求基礎上抽出來的獨立的功能性組件,以及公共代碼部分(組件間通訊服務接口,含特殊字段的HttpResponse,攔截器,定製化樣式的視圖組件封裝,全局性配置文件,以及多個業務組件公用的且尚未確定是否下沉到library層面的代碼部分)。

module_login(登錄),module_main(主頁),

module_station(電站),module_warning(告警),module_order(工單),module_set(設置),

module_message(消息中心)

2.3,業務功能組件(module_library)

module_library_common(業務公共組件),module_library_speech(語音組件)

2.4,基礎組件(library)

底層library組件羣

library作爲底層基礎組件,重點在於獨立,複用!

架構體系中,library部分是將基礎組件羣作爲一個整體來進行規劃的,其中library_common負責統一管理組件羣用到的所有第三方依賴,並提供必要的工具類支持(LogUtils,FileUtils等等)。其餘library在library_common的基礎上進行組件建設,並最終依賴於library_base。library_base作爲基礎組件羣對外的統一依賴入口。業務層組件只需要簡單依賴library_base組件,就可以獲得整個組件羣的能力支撐,避免在每個業務層組件build.gradle中做過多的依賴代碼。

優勢在於方便統一管理第三方依賴庫,可避免在多個獨立的library同時引用同一個且不同版本的第三方依賴庫所造成的api版本衝突,以及重複依賴等問題(AS中監測到有多個module同時依賴同一個module,打包時將自動保留一個module實例(aar)),同時簡化代碼。

劣勢在於基礎組件羣中的單個library獨立複用性較差,例如存在一個app,只需要單獨依賴library_net一個組件,此時需要將library_net進行簡單加工處理,例如把原來在library_common管理的與net相關的第三方依賴遷移到library_net,並把library_net用到的封裝在library_common中的相關類(Log日誌,Gson解析,NetWork等工具類),一併遷移到library_net。

2.4.1,library_base

基層MVP框架(基於EventBus)。詳見:Android工程架構設計:Base Library(基層MVP框架)基於EventBus

2.4.2,library_common

library_common負責統一管理第三方依賴庫,可避免在多個獨立的library同時引用同一個且不同版本的第三方依賴庫所造成的api版本衝突,以及重複依賴等問題。同時封裝了工具類以及公共widget部分。

1,第三方依賴管理

注意:這裏管理的依賴僅限於底層library集羣所使用,對於業務層組件用到的依賴庫,在module_common做統一管理。

(1)settings.gradle統一定義依賴版本

gradle.ext.supportLibraryVersion = '28.0.0'
gradle.ext.buildToolsVersion = '28.0.3'
gradle.ext.versionCode = 1
gradle.ext.versionName = "1.0"
gradle.ext.compileSdkVersion = 28
gradle.ext.minSdkVersion = 19
gradle.ext.targetSdkVersion = 28

gradle.ext.supportLibraryVersion = '28.0.0'
gradle.ext.constraintlayout = '1.1.3'

gradle.ext.gson = '2.8.2'
gradle.ext.fastjson = '1.2.47'
gradle.ext.okhttp = '3.9.1'
gradle.ext.retrofit = '2.4.0'

gradle.ext.rxbinding = '0.4.0'
gradle.ext.rxjava = '2.1.12'
gradle.ext.rxandroid = '2.1.0'
gradle.ext.rxlifecycle2 = '2.1.0'

gradle.ext.glide = '3.7.0'
gradle.ext.picasso = '2.71828'

gradle.ext.eventbus = '3.1.1'
gradle.ext.butterknife = '9.0.0-rc1'

gradle.ext.logger = '2.2.0'
gradle.ext.arouter = '1.4.1'

gradle.ext.aroutercompiler = '1.2.2'

gradle.ext.jiguang_jcode = '1.1.9'
gradle.ext.jiguang_jpush = '3.1.1'

(2)build.gradle添加依賴

apply plugin: 'com.android.library'

android {
    compileSdkVersion gradle.ext.compileSdkVersion
    defaultConfig {
        minSdkVersion gradle.ext.minSdkVersion
        targetSdkVersion gradle.ext.targetSdkVersion
        versionCode gradle.ext.versionCode
        versionName gradle.ext.versionName
    }

//    dataBinding {
//        enabled = true
//    }
//    compileOptions {
//        sourceCompatibility JavaVersion.VERSION_1_8
//        targetCompatibility JavaVersion.VERSION_1_8
//    }

    libraryVariants.all {
        it.generateBuildConfig.enabled = false
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    api "com.orhanobut:logger:${gradle.ext.logger}"

    // Android Support
    api "com.android.support:appcompat-v7:${gradle.ext.supportLibraryVersion}"
    api "com.android.support:recyclerview-v7:${gradle.ext.supportLibraryVersion}"
    api "com.android.support:design:${gradle.ext.supportLibraryVersion}"
    api "com.android.support.constraint:constraint-layout:${gradle.ext.constraintlayout}"

    // RxJava
    api "io.reactivex.rxjava2:rxjava:${gradle.ext.rxjava}"
    api "io.reactivex.rxjava2:rxandroid:${gradle.ext.rxandroid}"
//
//    // OkHttp
//    api "com.squareup.okhttp3:okhttp:${gradle.ext.okhttp}"
//    api "com.squareup.okhttp3:okhttp-urlconnection:${gradle.ext.okhttp}"

    // Retrofit
    api "com.squareup.retrofit2:retrofit:${gradle.ext.retrofit}"
    api "com.squareup.retrofit2:converter-gson:${gradle.ext.retrofit}"
    api "com.squareup.retrofit2:adapter-rxjava2:${gradle.ext.retrofit}"
    api "com.squareup.retrofit2:converter-scalars:${gradle.ext.retrofit}"

    // others
    api group: 'com.alibaba', name: 'fastjson', version: gradle.ext.fastjson
    api "com.jakewharton.rxbinding:rxbinding:${gradle.ext.rxbinding}"
    api "com.trello.rxlifecycle2:rxlifecycle-components:${gradle.ext.rxlifecycle2}"
    api "com.google.code.gson:gson:${gradle.ext.gson}"
    api "com.github.bumptech.glide:glide:${gradle.ext.glide}"
    api "org.greenrobot:eventbus:${gradle.ext.eventbus}"
    api "com.jakewharton:butterknife:${gradle.ext.butterknife}"
    api "com.alibaba:arouter-api:${gradle.ext.arouter}"
}

(3)上層module依賴library_common

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    api project(':library_common')
}

2,通用工具類庫(略……)

源碼:https://gitee.com/sky_dreaming/App_M/tree/library/library_common

2.4.3,library_net

以RxJava2 + Retrofit2 + OkHttp3爲基礎封裝的app網絡框架。

源碼:https://gitee.com/sky_dreaming/App_M/tree/library/library_net

2.4.4,library_router

以ARouter爲基礎封裝的路由組件,包含組件路由和通訊路由

源碼:https://gitee.com/sky_dreaming/App_M/tree/library/library_router

2.4.5,library_multiple_pictures_selector

基於知乎源碼的多圖片選擇器組件

源碼:https://gitee.com/sky_dreaming/App_M/tree/library/library_multiple_pictures_selector

 

 

 

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