为什么组件化?
- 解耦
- 解决项目庞大 编译慢
怎么做?
思路:
1.模块化项目 可按功能或者业务对项目进行划分重构
2.动态控制模块依赖
模块化项目可以按照各自项目实际情况 不多做介绍
如何动态依赖?
配置properties文件
properties
文件是java的配置文件
作用:对项目进行一系列的配置 包括:版本号 版本信息 开发模式 keystore等等
几个知识点:
- 新建AS项目会默认生成
gradle.properties
和local.properties
文件 -
Gradle
内置了对gradle.properties
的使用方式
栗子:
gradle.properties:
something = "hello 34sir"
build.gradle:
println something //可以直接使用这个变量
- 使用其他的 .properties文件
例如上文提到的local.properties
Properties properties = new Properties()
properties.load(new FileInputStream("local.properties"))
println properties.getProperty("something")
或者
def config = new ConfigSlurper().parse(new File("local.properties").toURL()) //这种方式除了加载 properties文件外,还可以加载 groovy 文件 或者 gradle 文件
println config.something
使用properties文件的配置
利用配置文件的DEVELOP_MODE变量 动态更改依赖方式(application 还是 library)
gradle.properties:
DEVELOP_MODE = true
build.gradle:
if (DEVELOP_MODE.toBoolean) { //如果当前是组件化模式
apply plugin: 'com.android.application'
} else { //集成模式
apply plugin: 'com.android.library'
}
遇到的问题
AndroidManifest合并
每个组件都会有一个清单文件 那么如果这些清单文件都含有各自的Application
这样肯定会产生冲突
解决方案和上述动态更换依赖方式类似:
通过DEVELOP_MODE控制动态依赖的清单文件
build.gradle文件中进行如下配置:
sourceSets {
main {
if (DEVELOP_MODE.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml' //组件模式下依赖此清单文件
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml' //集成模式下依赖此清单文件
}
}
}
资源冲突
解决方案:
- 命名规范上面强制要求 按模块划分各个模块的命名规范
-
resourcePrefix "girls_"
强制代码审查
模组间通信
由于模组间是相互隔离的 那么某些类的调用就不能用常规方式
很容易想到一个方案:反射
但是 众所周知 频繁反射会带来很大的性能开销 于是我们采用路由的方案:
项目初始化的时候 一次性反射构造所有模块的router 在所有模块都依赖的公共模块中存在一个公共router管理类Grouter,此类完成通信的中转 相当于路由器的功能
网友评论