组件化优点
1、代码解耦
2、方便多人协作开发
3、可复用性高,不同的APP可复用不同组件
4、每个组件可独立运行,方便开发调试
组件化工程结构
**第一层:**空壳app。应用的入口,存放启动页,依赖所有业务组件
**第二层:**业务组件。根据不同业务横向拆分出来的业务组件。任何一个业务组件都可以独立出来成为一个应用
**第三层:**功能组件。通用业务是从应用业务中抽取出来的交集,从应用上说,他属于业务,而针对应用业务而言则更像是一种功能,好比登录这种业务功能,不需要关心有没有界面,当中是怎样的逻辑,只需要提供结果即可
**第四层:**公共服务组件。可存放各个组件对外暴露的接口,接口实现在组件内部,可通过ARouter或者DI(依赖注入)实现跨组件服务调用;可存放路由跳转等信息和路由服务等与业务相关Base代码
**第五层:**基础组件。网络请求、图片加载、存储、utils、通用View的封装
项目组件化
1、代码解耦
代码解耦主要是从两个方面,其一是公共代码的抽取和归纳,其二是面向接口编程,接口下沉。
公共代码的抽取和归纳:
部分通用的功能性的代码抽出成utils,上层只关心结果,不关心具体的实现逻辑
面向接口编程:
当上层需要底层的某项服务时,将服务抽象成一个接口,上层持有这个接口,而不是具体的类,那么当底层发生了改变或是实现的时候,上层只需要实例化对应的新实现类即可,如果把这层实例化也作为接口去作,那么上层完全不用改变就能拥抱变化。
依赖注入:
横向的业务代码或者功能实现可以进行依赖注入的方式来达到解耦的目。
工程结构解耦:
结构的解耦其实一般针对应用的整体业务而言进行的一个"分Module"操作,根据业务类型的横向拆分,业务属性的纵向拆分以及功能SDK下沉。
2、组件module gradle管理
- 在根目录下建立一个config.gradle文件
- 编写对应的依赖常量代码
- 在app module 的build.gradle中引用
- 注意,如果想要在别的.gradle中使用声明的这些常量,一定要在抽取的xx.gradle文件中将对应的代码块用"ext"进行包裹
config.gradle
ext {
android = [
compileSdkVersion: 28,
targetSdkVersion : 28,
minSdkVersion : 21,
]
version = [
retrofitSdkVersion : "2.4.0",
androidSupportSdkVersion: "28.0.0",
butterknifeSdkVersion : "8.8.1",
espressoSdkVersion : "3.0.1",
canarySdkVersion : "1.5.4",
glideSdkVersion : "4.8.0"
]
dependencies = [
//support
"appcompat-v7" : "com.android.support:appcompat-v7:${version["androidSupportSdkVersion"]}",
"design" : "com.android.support:design:${version["androidSupportSdkVersion"]}",
"support-v4" : "com.android.support:support-v4:${version["androidSupportSdkVersion"]}",
"cardview-v7" : "com.android.support:cardview-v7:${version["androidSupportSdkVersion"]}",
"annotations" : "com.android.support:support-annotations:${version["androidSupportSdkVersion"]}",
]
}
在工程根目录的build.gradle中加上如下代码:
apply from: "config.gradle"
在app module中的build.gradle中引用(其他组件module中引用类似):
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
defaultConfig {
applicationId "cn.com.xxx"
minSdkVer