目录

 

一,业务拆分

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主页;未登录,跳转到登陆页进行登录操作。

android 跨模块资源 android模块化框架搭建_封装

电站,告警,工单,设置: 需要相关module提供fragment服务(组件间通讯)

登录页: 需要登录module提供跳转服务(组件间通讯)

首页:将对外开放访问服务(登录成功跳转回MainActivity的场景)(组件间通讯)

1.2.登录

业务内容:登录(账号密码登录,手机短信登录);忘记密码(找回密码)

数据流程:登录成功 —— app主页面

android 跨模块资源 android模块化框架搭建_android_02

登录页:将对外开放访问服务(组件间通讯)

首页跳转:需要main module提供跳转服务(组件间通讯)

1.3.电站  ......

1.4.告警  ......

1.5.工单  ......

1.6.消息中心

业务内容:消息列表(告警消息列表,工单消息列表);点击跳转到告警,工单详情页。

操作流程:电站,告警,工单,设置四个Fragment均有进入消息中心的入口图标,点击进入消息中心。

android 跨模块资源 android模块化框架搭建_android 跨模块资源_03

消息中心入口: 对外开放访问服务(组件间通讯)

告警详情页,工单详情页: 需要告警,工单module提供跳转服务(组件间通讯)

1.7.设置

android 跨模块资源 android模块化框架搭建_android 跨模块资源_04

设置fragemnt: 对外提供获取Fragment服务。(组件间通讯)

消息中心入口: 需要消息中心module提供跳转服务。(组件间通讯)

二,组件化框架设计搭建

组件化app从上至下,包含app主框架(app);业务层组件(module);业务功能组件(module_library);基础组件(library)。

组件化app从上至下,包含app主框架(app);业务层组件(module);业务功能组件(module_library);基础组件(library)。

架构图:

android 跨模块资源 android模块化框架搭建_android 跨模块资源_05

工程图:

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组件群

android 跨模块资源 android模块化框架搭建_业务层_06

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)。

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')
}