
鸿蒙版组件化路由框架HRouter
目的
不管在什么平台上,大型项目组件化的趋势是不可逆的,而协助项目组件化的路由框架又是首当其冲。比如在android上比较有名的路由框架就有阿里的ARouter,ARouter的功能很丰富很强大,路由功能只是他一部分的工作,我们试着模仿ARouter的路由实现,来一个鸿蒙版的HRouter。
设计思路
熟悉Arouter的人都知道,ARouter内部维护了一个Map,Key是路由名,Value是对应的Class对象,当使用者指定路由名称的时候,那么ARouter就马上找到对应的Class对象,实现跳转等功能。那么Map中的数据怎么设置进去呢?难道让使用者在每个使用到的地方put一下吗?这样的设计有点low,估计要被使用者吐槽。那就让框架来自己设置,但是作为被引用者,怎么能做到这点呢?ARouter内部使用到了两者技术实现,一种字节码插桩,一个是APT。字节码插桩就是在原先的代码上插入框架需要的代码,很牛逼但不太熟悉。APT熟悉,编译器注解处理技术,普遍应用在各大框架中,就是能通过注解自动生成一些有规则的java文件的技术,那么生成代码路径信息都可以由框架控制,然后通过类加载技术扫描固定的包名,然后反射生成实例并调用。ok!逻辑通了!
代码实现
声明注解
简单,声明了编译器注解一枚
注解处理器
通过它可以生成如下代码:
因为框架约定路由名需要按照"/模块名/页面名"来设置,所有同一个模块只会生成一个路由文件,里面会注册所有配置注解的类,如上。
Api设计
routerMap就是用来存放对应关系的数据结构,其他方法比较简单就是调用来下鸿蒙系统提供的页面跳转方法,着重来看下init方法中的ClassUtils.ScanClassInfoWithPackageName这个工具方法。
这个方法扫描了目标包下面的类,并通过类加载器加载到虚拟机,并返回。其实这段代码写的我相当不自信,我本来根据android上的经验写的时候发现一些类引用不了,比如PathClassLoader,DexFile这些在android上跟类加载相关的类,血崩......但是我打印了getClassLoader的Class类型发现居然是PathClassLoader,那就明白了,这些类系统已经复制加载进了虚拟机,只是我不能直接引用,那就反射!代码逻辑基本上参考android上的经验,只不过鸿蒙输出的hap后缀的文件。
使用
框架核心的类已经介绍完了,我们用用看,我们按照组件化的模式,创建了4个module:
4个module的引用关系至上而下,同级之间没有依赖关系。
夸模块之间的Ability跳转,成功!
在entrybusiness02中使用entrymain的AbilitySlice实例,成功!
结束
所有测试全部通过。HRouter已经具备了基础的组件化路由能力了,当然仅限于页面跳转,后面还会不断完善,把跨模块的数据提供能力,业务处理能力都集成进去,向ARouter靠拢,致敬!
相关链接
Github:https://github.com/loubinfeng2013/HarmonyTools
作者:暗影萨满
