原理
DDComponentForAndroid组件化实现原理主要基于两点:
- 静态注解:作用是实现路由的扫描、路由注册接口实现、路由表生成、路由参数的传递;
- gladle plugin:作用是动态调整编译脚本、资源管理和类修改;
实现
注解知识点和自定义注解请参考:
DDComponentForAndroid中定义了两个注解:RouteNode(路由节点)和Autowired(参数装配),这个两个注解分别用于标记那些页面(DD中指的时activity)可以作为一个路由节点和这个页面需要那些参数。再看看DDComponentForAndroid中怎么根据这个两个注解去实现路由的扫描、路由注册接口的实现、路由表的生成、路由参数注入。
- RouteNode注解的注解处理器为RouterProcessor,该注解处理器主要做以下几件事情:
- 解析注解:查找所有activity上标注了RouteNode注解元素,并记录路由节点同时扫描Autowired注解同样记录注解标记的参数和参数类型;
- 路由注册接口的实现,根据gradle脚本下host属性并结合RouteNode中的path值生成一个java类该类通过继承BaseCompRouter然后实现getHost和initMap分别返回host标志和向父类登记路由(path);
- 生成路由表:依照解析注解时记录的路由节点生成一个txt文件,文件写明了host名称,path路径和每个节点需要的参数;
- Autowired注解的注解处理器为AutowiredProcessor,该注解处理器主要做以下几件事情:
- 解析注解:查找所有activity中属性标注了Autowired注解元素,并根据activity名称进行分类记录下标记的属性;
- 生成参数注入的辅助类:依照解析注解记录的参数分类记录为每个activity生成一个注入辅助类(类名后缀为:$$Router$$Autowired,这个可以根据自己喜好来的),这个辅助类是类ISyringe接口的实现;
sign
以上静态注解处理器生成的java类都在[module名称]/build/generated/source/apt下的debug或release下。而路由表的生成路径就看源码里面设置的在哪里,主要还是注解处理器生成的java类。
通过以上分析,静态注解部分工作已经完成,也可以看到所有的结果还是在具体module下,各个module还是对非自身内的路由不可见的,结下就是让各个module的路由对其他module可见,这个呢则是通过gladle plugin来达到这个目的。接下来分析gladle plugin如何去实现各个module的路由可见。
gladle plugin主要工作是动态调整编译脚本、资源管理和类修改,进一步看下其是如何实现的;
动态调整编译脚本:
- 记录当前assemble的module的名称,也就是点击AS的右三角运行的module;
- 查找module下gradle配置文件中的isRunAlone属性,同时查找根项目下的gradle配置文件中的mainModuleName属性;
- 根据上面两步的结果,判定当前module是主项目还是依赖的项目,如果是主项目则动态设置编译脚本应用的插件为application,
1
project.apply plugin: 'com.android.application'
如果是依赖的项目则动态设置编译脚本应用的插件为library,
1
project.apply plugin: 'com.android.library'
通过动态调整编译脚本,现在已经实现了各个module的class文件对其他module是可见的了,但是目前还是不能实现路由间的跳转,继续分析。
- 资源文件管理:
- 在第1步中前两步知道当前那些module是依赖的项目,注意!!android中application和library的AndroidManifest,因此对于依赖的项目中的AndroidManifest文件进行管理或者修改,DDComponentForAndroid通过指定另外的路径来加载library的AndroidManifest文件。
类修改:
- 扫描所有项目的directory文件,扫描出application文件并记录;
- 扫描所有项目的directory文件,扫描出实现了接口IApplicationLike的文件并记录,应为在IApplicationLike实现类中会去注册路由实现类;
通过类修改,这个样就达到了路由间的跳转。自此组件化就达到了,而且各个组件间可以独立调试无需手动再次设置。