组件化总结
library和phone的区别
- library 是集成化,phone是组件化
- library中是apply plugin: ‘com.android.android’,且没有applicationId,phone是apply plugin: ‘com.android.application’,有applicationId
- library不能单独运行和单独打包,phone可以
流程
- 定义config.gradle,统一配置信息及,定义是否为isRelease开关(是否为发布版本)
- 在每个模块里做isRelease判断,是否是library,修改组件和集成库的区别
- 组件时debug代码的配置
组件化开发规范
组件前缀
module之间的交互
- EventBus 必须一对一,若一对多将混乱不堪难以维护
- 反射 维护成本高,容易出现高版本@hide限制
- 隐式意图,需要维护manifest
- BroadcastReceiver ,7.0后需要动态注册,需求方发送广播
- 类加载,需要准确的全类名,维护成本高容易出错
注解处理器的APT的应用
- 简单来说是一种按一定规则,自动生成代码的工具
- 需要了解他的程序元素Element包括:PackageElement包元素,TypeElement类或接口元素,VariableElement属性字段参数元素,ExecutableElement方法(包括构造,静态方法)元素
- Android studio 及 gradle的 版本兼容 1.as3.3.2 gradle 4.10.1(临界版本) 2. as3.4.1 gradle5.1.1(向下兼容)
- 定义需扫描的注解类
- 创建注解处理器@AutoService(Processor.class),指定支持的注解,编译的java版本及注解处理器接受内容的参数
- 通过获取节点,定义包名及新的class名称,通过filter创建一个JavaFileObject对象
- 获取JavaFileObject的Write对象,进行一行一行的写入文件
JavaPoet的应用
JavaPoet是square推出的开源的java代码自动生成框架,提供javaApi生成Java文件
- MethodSpec生成方法
- TypeSpec生成类或者接口class
- JavaFile创建java文件
- Element的子类,包括TypeElement, PackageElement等等表示程序可操作的元素,包括类,方法,属性,包等
- TypeMirror,获取类的所有信息,可以判断子类关系
Arouter的源碼分析
1. 初始化過程ARouter.init -> Arouter.init -> LogisticsCenter.init()
* 在该方法中会进行APT生成文件的dex文件的扫码,加载所有的class文件,保存到routerMap对像并保存到sp中(第一次启动比较慢),同时开启了线程池每个dex的加载都会创建一个线程,最后放入缓存对象Warehouse的map中
* 在 LogisticsCenter.init() -> _Arouter.afterInit()内部会创建拦截器对象interceptorService路由的设计及应用
参考Arouter
- 组件间的跳转
- 组件间的值传递
- 获取其他组件的资源及实习方法
- 对未安装组件的拦截
项目实践
存在问题
- 各模块的service耦合度高
- 模块间的跳转都类名
- 数据的传输是调用方法的