1.什么是组件化?
1.1 为什么要用组件化
在项目的开发过程中,随着开发人员的增多及功能的增加,如果提前没有使用合理的开发架构,那么代码会越来臃肿,功能间代码耦合也会越来越严重,这时候为了保证项目代码的质量,我们就必须进行重构
1.2 组件化的介绍
组件化是指解耦复杂系统时将多个功能模块拆分,重组的过程。在Android工程上表现上就是把app按照其业务的不同,划分为不同的Module
组件化和单一模块项目结构对比
|
|
1.3 组件化的优点
- 编译速度 :我们可以按需测试单一模块极大的提升了我们的开发速度
- 超级解耦 :极度的降低了模块之间的耦合,便于后期维护与更新
- 功能重用 : 某一块的功能在另外的组件化项目中使用只需要单独依赖这一模块即可
- 便于团队开发 : 组件化架构是团队开发必然会选择的一种开发方式,它能有效的使团队更好的协作
1.4 组件化的框架
先看一下整体的结构
举个例子:以某个直播平台为例(没有画完整),
- 基础层:包含的是一些基础库以及对基础库的封装,比如常用的图片加载,网络请求,数据存储操作等等,其他模块或者组件都可以引用同一套基础库,这样不但只需要开发一套代码,还解耦了基础功能和业务功能的耦合,在基础库变更时更加容易操作。
- 功能组件层:包含一些简单的功能组件,比如视频,支付等等
- 业务组件层:这是通过模块化划分出来的,即根据业务的不同划分为不同的模块,一个具体的业务模块会按需引用不同的组件,最终实现业务功能,如上有三个业务组件
- app层:多个业务模块,各自按需引用组件,最后将各个模块统筹输出 APP。
2.组件化框架的搭建
这里以一个业务组件层为例(首页home)进行组件化的搭建
新建一个android项目
2.1 Gradle中版本号的统一管理
在主模块下创建config.gradle文件夹(可以不是config但后缀必须是gradle),依赖库,项目中sdk等等的版本号把有重用的地方都放在这里,以后的每个模块的版本号都要引用这里的
ext{
android = [
compileSdkVersion : 30,
buildToolsVersion : "30.0.2",
minSdkVersion : 16,
targetSdkVersion : 30,
versionCode : 1,
versionName : "1.0"
]
dependencies = [
"appcompat" : 'androidx.appcompat:appcompat:1.2.0',
"material" : 'com.google.android.material:material:1.2.1',
"constraintLayout" : 'androidx.constraintlayout:constraintlayout:2.0.4',//约束性布局
//test
"junit" : "junit:junit:4.13.1",
"testExtJunit" : 'androidx.test.ext:junit:1.1.2',//测试依赖,新建项目时会默认添加,一般不建议添加
"espressoCore" : 'androidx.test.espresso:espresso-core:3.3.0',//测试依赖,新建项目时会默认添加,一般不建议添加
]
}
在主模块的build.gradle中加载config.gradle
//加载config.gradle
apply from: "config.gradle"
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
2.2 基础层的搭建
点击file->new->new module,选择library module模块。我这里的名字是commlib
打开此模块下的build.gradle,修改android和dependencies如下
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
buildToolsVersion rootProject.ext.android["buildToolsVersion"]
defaultConfig {
//applicationId "com.example.moduletextt" commlib是library,不需要applicationId
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
................................
}
dependencies {
api rootProject.ext.dependencies["appcompat"]
api rootProject.ext.dependencies["material"]
api rootProject.ext.dependencies["constraintLayout"]
testImplementation rootProject.ext.dependencies["junit"]
androidTestImplementation rootProject.ext.dependencies["testExtJunit"]
androidTestImplementation rootProject.ext.dependencies["espressoCore"]
}
让其它模块依赖与基础模块
在其他模块的build.gradle的dependencies中添加
implementation project(':commlib')
2.3功能层的搭建
2.3.1 创建一个module
new->module->phone&Tablet Module
这里在填写Library name 和 Activity name时注意包名和资源文件名命名冲突问题,避免和别的组件模块发生冲突。
2.3.2 统一版本号处理
修改build.gradle,注意要继承自基础层,继承基础层后基础层api对应的依赖不用重复去写,只写本模块需要的依赖
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
buildToolsVersion rootProject.ext.android["buildToolsVersion"]
defaultConfig {
applicationId "com.example.moduletextt"
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
............................
}
dependencies {
implementation project(