组件化
接口下沉 + callback原理
将一个app的代码拆分成几份独立的组件,组件之间是低耦合的,可以独立编译打包;也可以将组件打包到一个apk中。
【没有组件化的缺点】:
- (1)项目可维护性下降。随着项目的增加,即使有做分包目录,但是项目会逐渐失去层次感,可读性、可维护性下降
- (2)开发和调试效率低。开发和调试时,修改了一个小功能,但是需要重新build整个项目才能看到结果,耗费时间
- (3)易阻断不同业务模块的并发开发。一个业务模块的小bug,可能阻断其他业务模块的开发和调试,不同业务模块的并发开发会被阻断。
- (4)版本管理困难。多人联合开发时,在版本管理中容易出现冲突和代码覆盖问题。
【组件化的拆分】
- 按照业务(功能)划分各个业务组件模块。
【组件化后的优点】
- (1)每个模块可独立编译,提高了编译速度;
- (2)开发只负责自己的模块,还可以再做的隔离一些,每个业务线只可见自己业务模块的代码,避免了误修改和版本管理问题。
- (3)公共的Lib依然是个独立模块
与模块化的区别:是每个模块的角色的转换,一个组件可以独立编译打包,也可以作为lib集成到整个apk中
android组件化开发
APT
Java Poet
WMRouter:美团外卖Android开源路由框架
https://tech.meituan.com/2018/08/23/meituan-waimai-android-open-source-routing-framework.html
ARouter
仓库
项目搭建
app_config.gradle
用于全局版本统一配置,整个app的项目配置文件
在项目中的 build.gradle 中配置
apply from: "app_config.gradle"
buildScript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
}
}
allprejects {
...
}
自定义扩展内容
ext {
test="测试"
}
使用自定义扩展内容
在app中的 build.gralde 中设置
// 使用方式一,定义变量
def test = this.rootProject.ext.test
println "test is :" + test
// 使用方式二,直接引用
println "${rootProject.ext.test}"
println "test is :" + test
android {
xxxx
}
println是个当过语法,相当于js 弱类型
依赖简单的配置
config.gradle
ext {
app_impl = [
"appcompat" : "androidx.appcompat:appcompat:1.1.0",
"junit" : "junit.junit:4.12",
...
]
}
app的build.gradle
// 可以这么简单的循环下不用每个都写了
app_impl.each {
k, v -> implementation v
}
环境的设置
通过下面设置环境
release {
buildConfigFiled("string", "SERVER_URL", "\"${url.release}\"")
}
debug {
buildConfigFiled("string", "SERVER_URL", "\"${url.debug}\"")
}
结构搭建
MyApp/
├── base 存放基类 访问有权限,很少改动
├── common 存放公共工具类或者自定义View,大家都可以改动
├── network 存放网络框架 访问有权限,很少改动
├── 业务module 各个业务的module,使用arouter或者cc连接
│ └── api
├── 用户中心
└── 业务1
├── api
└── other
组件化和集成化切换
状态表示
组件化:有小绿点,可以单独运行
集成化:柱状图,不能单独运行,需要依赖app
排除业务模块的测试代码
配置sourceSets
组件化模块之间的交互
组件化APT JavaPoet
APT编译的时候处理注解,依赖于注解
JavaPoet 生成java文件 BufferedWriter writer = new BufferedWriter(SourceFile.openWriter()); writer.writer("import xxxxxx");
编译期做事 在compiler java module的依赖中设置两个
构建 -> 编译 -> 打包 -> 安装
compileOnly 'com.google.auto.service:auto-service:1.0-rc4'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc4'
// 导入java poet
implementation 'com.squareup:javapoet:1.9.0'
创建两个java项目,一个注解,一个注解处理。
注解处理继承AbstractProcessor实现process()方法
资料
详解Gradle自动实现Android组件化 https://juejin.im/post/6844903847572275213
模块化,组件化傻傻分不清?附带组件化福利 https://www.jianshu.com/p/f5212cf7df55
Android组件化最佳路由—ARetrofit https://www.jianshu.com/p/4210234cf0a0
牛笔了!阿里P8大佬熬夜15天,把所有Android第三方库整理成了PDF https://www.jianshu.com/p/8ba7af02b003
腾讯大牛最佳总结!只需一篇文章教会你Android组件化 https://www.jianshu.com/p/18e46e0e4b9c
一次搞懂—模块化、组件化与插件化 https://www.jianshu.com/p/35bc4f456759
从零开始搭建Android组件化框架 *** https://github.com/tome34/frameDemoMo2
资料
腾讯Android研发岗必刷真题:说下组件之间的跳转和组件通信原理机制