从0到1实现一个Android路由——多模块的APT收集路由
Posted xingfeng_coder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从0到1实现一个Android路由——多模块的APT收集路由相关的知识,希望对你有一定的参考价值。
从0到1实现一个android路由系列文章
- 从0到1实现一个Android路由(1)——初探路由
- 从0到1实现一个Android路由(2)——URL解析器
- 从0到1实现一个Android路由(3)——APT收集路由
- 从0到1实现一个Android路由(4)——多模块的APT收集路由
- 从0到1实现一个Android路由(5)——对Kotlin模块的支持
- 从0到1实现一个Android路由(6)——拦截请求再跳转
在从0到1实现一个Android路由(3)——APT收集路由中,已经实现了在同一个module中收集路由,当引入了一个other_module时,发现并没有收集到这个信息,这是咋回事呢?以前需要怎么解决呢?这就是本篇文章的由来。
other_module模块
other_module其实很简单,就一个Activity,用@Path("/otherMoudleActivity")注解,其和app模块一样引用了compiler、annotation以及api模块。
这时在app里引入了other_module后,进行跳转,效果如下:
从上面可以看到启动other_module中的是成功了,但是原来启动app模块中的却失败了,这是咋回事呢?
这是因为初始化时,UrlCollectorImpl的Map只有一条"/otherModuleActivity"的记录,那app模块的信息怎么没收集到呢?
这是因为每个module都会有一个PathProcessor,而PathProcessor没有考虑对多module的区分,后面的module收集到的信息就会覆盖前面的module,这就是为什么只能看到other_module的信息。
解决多module的APT收集路由
知道了原因之后,就好解决了。解决方案可以是区分每个module,给每个module生成自己的map,然后init()方法中把每个module对应类的map组合到一起,就可以了。
区分多module
参考添加注解处理器,在other_module中加入参数标识module_name,修改build.gradle如下:
android
defaultConfig
javaCompileOptions
annotationProcessorOptions
arguments = ["module_name":"OtherModule"]
可以看到添加了一个module_name的key,value为OtherModule。
修改PathProcessor
得到外部传入的参数
可以在init()方法中通过ProcessEnvironment.getOptions()获取到外部设置的参数,取出其中的设置的value,代码如下:
private static final String MODULE_NAME_KEY = "module_name";
private Filer filer;
private String classNameSuffix;
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment)
super.init(processingEnvironment);
filer = processingEnv.getFiler();
Map<String, String> options = processingEnvironment.getOptions();
for (String key : options.keySet())
if (key.equals(MODULE_NAME_KEY))
classNameSuffix = options.get(key);
break;
if (classNameSuffix == null)
classNameSuffix = "App";
process()根据不同Module生成不同实现类
process()的实现逻辑很简单,在UrlCollectorImpl的前面加上classNameSuffix即可。
执行assembleDebug后,可以在app模块下发现AppUrlCollectorImpl,在other_module模块下发现OtherModuleUrlCollectorImpl。
APT为每个module生成的类位于每个module自己的build目录下。
整合多个UrlCollector
当生成了多个UrlCollector后,那么剩下的问题就是将这些UrlCollector的map整合到一个大的map中,这里EasyRouter提供了可以addModule()的接口,调用addModule()将其他模块生成的加入到Map中即可。代码如下:
EasyRouter.getInstance().addModule(OtherModuleUrlCollectorImpl())
这样的话,就可以实现跨模块的跳转了。
总结
APT收集路由时需要注意每个module都会有一个Processor,因此需要进行区分,而区分是通过给java编译器增加参数来进行区分的,每个module生成了各自的路由表后,还需要进行表的整合,这样才能实现最终的跨模块跳转。
关于代码,可以参考github地址
参考
关注我的技术公众号,不定期会有技术文章推送,不敢说优质,但至少是我自己的学习心得。微信扫一扫下方二维码即可关注:
以上是关于从0到1实现一个Android路由——多模块的APT收集路由的主要内容,如果未能解决你的问题,请参考以下文章