写点什么

滴滴开源 DRouter:一款高效的 Android 路由框架,androidui 开发工具

用户头像
Android架构
关注
发布于: 38 分钟前

另外框架初始化的时候启动子线程去加载路由表,不阻塞主线程的执行,尽其所能提高效率。

2. 完整的 Router 功能

支持使用 URI 字符串导航 Activity、Fragment、View、RouterHandler,支持优先级、正则表达式、占位符、回调式 onActivityResult、拦截器;RouterHandler 还支持异步完成(不阻塞)、指定执行线程等等;同时针对 Fragment,支持单 Page、栈 Page、ViewPager 三种形式的 Fragment 加载。

3. 强大的 ServiceLoader 能力

DRouter 同样是基于 SPI 的理念,路由表会生成接口或基类对实现类的映射。


  • 获取实例时可以指定执行任意构造器、单例、优先级排序、自动拆解所有接口和基类作为 key

  • 可以通过 alias,以及任意数量多的维度对目标进行过滤

  • 动态注册

4. 像调用本地方法一样进行跨进程通信和回调

无需编写繁琐的 aidl 文件实现跨进程调用,使用方式几乎等同本地导航 RouterHandler 和 Service,只需增加一些配置即可。


  • 不需要异步去 bindService 等待,同步执行

  • 支持跨应用

  • 替代反射,服务端使用本地方法执行,提高执行效率

  • 支持任意类型的对象跨进程传递,包括 Context、自定义类,支持 RemoteCallback 回调

  • 服务端异常崩溃重启后,客户端按需自动重新执行已发送的跨进程命令

5. 框架内部尽可能减少使用反射,提升性能

加载路由表、实例化路由、以及跨进程命令到达服务端后的分发这些常规应该使用反射的场景,使用预占位或动态生成代码来替换成 java 的 new 创建和显式方式执行,最大限度的去避免反射执行,提高性能。


考虑到功能的全面性,使用 ServiceLoader 时如指定非默认构造函数以及跨进程时传递自定义类,在框架内部会使用到反射,不过可以使用默认构造函数以及对跨进程对象实现 Parcelable 来避免。

6. 动态下载与 api 匹配的 plugin,插件自升级

很多项目包括 DRouter 需要搭配 gradle 插件和 java 依赖来使用,正常来讲升级 java 依赖时大概率需要同时升级 gradle 插件,这在滴滴这种业务线繁多,各业务线除了有自己的组件同时又有自己的壳工程场景是一个非常痛的点。当业务线的组件因平台的同学在公共层升级了 java 依赖后,但又没有同时手动更新自己业务壳工程的 gradle 插件,大概率就会编译失败。


DRouter 利用 plugin-proxy 壳插件来解决这个问题,壳插件会在编译期自动检查 java 依赖的版本,同时获得应该匹配的插件版本。接着 plugin-proxy 会去下载这个匹配的 gradle 插件,并最终执行。这样就解决了因升级 java 依赖而 gradle 插件不匹配导致的编译问题。

7. 无需手动添加混淆规则

DRouter 把混淆规则隐藏到了 java 依赖里,当启用混淆功能时会自动应用混淆规则。这样即使升级了 DRouter 版本也无需关心混淆规则是否需要升级。


4.DRouter 的原理和架构


=================================================================================



架构设计




整体架构分三层,自下而上是数据流层、组件层、开放接口层。

1. 数据流层

数据流层是 DRouter 最重要的核心模块,这里承载着插件生成的路由表、路由元素、动态注册、以及跨进程功能相关的序列化数据流。所有的路由流转都会从这里取得对应的数据,进而流向正确的目标。

2. 组件层

这一层是功能组件层,核心的路由分发、拦截器、生命周期、异步暂存和监控、ServiceLoader、多维过滤、Fragment 路由,以及跨进程命令打包等。

3. 开放接口层

DRouter 在接口层做了大量的精简和优化,在灵活性和易用性方面做了很多权衡,主要目的是减少冗余 API,使框架更为简单的使用和接入。比如 Request 和 ServiceLoader 作为最核心的 API 方法数非常少,一些不常用的功能会放到 Extend 中。


功能原理



1. RouterFlow


路由数据流从创建 Request 开始,通过 URI 在路由表中找出所有的结点,会按照 RouterHandler、UI 的顺序以及优先级顺序执行。每一个元素都可以定义自己的拦截器,这里的拦截器必须放行以后才能执行对应的结点;同时对于 RouterHandler 执行完又可以决定是否拦截后面所有的结点。当所有的结点执行完,且异步暂存态也都已释放,最终把结果回传给请求处。

2. ServiceFlow

![RouterFlow](https://img-blog.csdnimg.cn/img_convert/76dedac


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


8573deef08487e7e9f215b1da.png)


ServiceLoader 既可以获取 Class 也可以获取对象实例,核心是路由表和过滤器,其中 FeatureMatcher 拥有多维过滤的功能。像滴滴这种多业务场景的应用,在使用 MVP 架构时对 P 的匹配至少会需要根据所在国家、订单业务线、订单状态三个维度来分别对应唯一的 Presenter,多维过滤就很容易解决这个问题。性能方面,对象实例化会根据构造器类型,利用插件生成的 RouterProxy 代码通过 new 来实例化无参对象(默认构造)或者反射实例化有参对象(非默认构造)。

3. RemoteFlow


DRouter 的跨进程功能是一大特色,左侧绿色代表客户端,自上而下会把所有的参数打包成命令,这里支持任意类型,框架内有一套完整的机制通过遍历集合、转换、组装,最后存储到 Parcel 里。利用 Authority 查找到服务端的 Provider 并随之利用此通道返回服务端的 Binder。


在服务端,也就是右侧的紫色,会自下而上把命令解包和分发。然后利用 DRouter 的路由 RouterHandler 和 ServiceLoader 的功能,使得客户端的命令最终在服务端执行。插件会在服务端生成一段代码,这段代码可以避免使用反射,提高整体的执行效率。


整个过程同步执行,使用简单、高效。


5.写在最后


========================================================================


DRouter 是一套功能完善、定制化程度高的路由框架,具有易于上手、架构清晰、性能优良的特点。现已成为滴滴不可或缺的基础组件之一。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
滴滴开源DRouter:一款高效的Android路由框架,androidui开发工具