组件化总结

library和phone的区别

  1. library 是集成化,phone是组件化
  2. library中是apply plugin: ‘com.android.android’,且没有applicationId,phone是apply plugin: ‘com.android.application’,有applicationId
  3. library不能单独运行和单独打包,phone可以

流程

  1. 定义config.gradle,统一配置信息及,定义是否为isRelease开关(是否为发布版本)
  2. 在每个模块里做isRelease判断,是否是library,修改组件和集成库的区别
  3. 组件时debug代码的配置

组件化开发规范

组件前缀

module之间的交互

  1. EventBus 必须一对一,若一对多将混乱不堪难以维护
  2. 反射 维护成本高,容易出现高版本@hide限制
  3. 隐式意图,需要维护manifest
  4. BroadcastReceiver ,7.0后需要动态注册,需求方发送广播
  5. 类加载,需要准确的全类名,维护成本高容易出错

注解处理器的APT的应用

  1. 简单来说是一种按一定规则,自动生成代码的工具
  2. 需要了解他的程序元素Element包括:PackageElement包元素,TypeElement类或接口元素,VariableElement属性字段参数元素,ExecutableElement方法(包括构造,静态方法)元素
  3. Android studio 及 gradle的 版本兼容 1.as3.3.2 gradle 4.10.1(临界版本) 2. as3.4.1 gradle5.1.1(向下兼容)
  4. 定义需扫描的注解类
  5. 创建注解处理器@AutoService(Processor.class),指定支持的注解,编译的java版本及注解处理器接受内容的参数
  6. 通过获取节点,定义包名及新的class名称,通过filter创建一个JavaFileObject对象
  7. 获取JavaFileObject的Write对象,进行一行一行的写入文件

JavaPoet的应用

JavaPoet是square推出的开源的java代码自动生成框架,提供javaApi生成Java文件

  1. MethodSpec生成方法
  2. TypeSpec生成类或者接口class
  3. JavaFile创建java文件
  4. Element的子类,包括TypeElement, PackageElement等等表示程序可操作的元素,包括类,方法,属性,包等
  5. TypeMirror,获取类的所有信息,可以判断子类关系

Arouter的源碼分析

1. 初始化過程ARouter.init -> Arouter.init -> LogisticsCenter.init()
* 在该方法中会进行APT生成文件的dex文件的扫码,加载所有的class文件,保存到routerMap对像并保存到sp中(第一次启动比较慢),同时开启了线程池每个dex的加载都会创建一个线程,最后放入缓存对象Warehouse的map中
* 在 LogisticsCenter.init() -> _Arouter.afterInit()内部会创建拦截器对象interceptorService

路由的设计及应用

参考Arouter

  1. 组件间的跳转
  2. 组件间的值传递
  3. 获取其他组件的资源及实习方法
  4. 对未安装组件的拦截

项目实践

存在问题

  1. 各模块的service耦合度高
  2. 模块间的跳转都类名
  3. 数据的传输是调用方法的