滴滴开源DRouter:一款高效的Android路由框架(1)

这篇具有很好参考价值的文章主要介绍了滴滴开源DRouter:一款高效的Android路由框架(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

路由表在编译期通过插件动态生成。插件会启动多线程同时异步处理所有的组件;增量扫描功能可以帮助开发者在第二次编译时,只对修改过的代码进行处理,极大地缩短路由表生成的时间。

在本人的开发机上测试,19年滴滴乘客端扫描5.5万个类,全量需要不到6s的时间;如果是修改了application模块,增量扫描只需要处理修改的单类,耗时0.4s时间;如果是修改了library组件,增量扫描需要扫描整个jar包,根据jar包的大小时间会稍多一些,例如滴滴专快组件增量耗时3.9s。

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

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的原理和架构

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

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

架构设计


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

1. 数据流层

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

2. 组件层

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

3. 开放接口层

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

功能原理


1. RouterFlow

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

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

2. ServiceFlow

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

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

3. RemoteFlow

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

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

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

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

5.写在最后

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

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

统计数据看,从2020年底开源至今公司内外目前已有62个不同的app接入DRouter,在此感谢各位的信任和支持。DRouter作为组件化方案的践行者,将继续提升各个场景的支持能力,并会持续进行问题修复以及功能迭代,也欢迎各位开发者使用并提出宝贵的反馈意见。

分享


小编学习提升时,顺带从网上收集整理了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,希望能帮助到大家学习提升,如有需要参考的可以直接去我 CodeChina地址:https://codechina.csdn.net/u012165769/Android-T3 访问查阅。

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

滴滴开源DRouter:一款高效的Android路由框架(1),程序员,开源,android

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-859088.html

5P9J8EF-1713682121200)]

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

到了这里,关于滴滴开源DRouter:一款高效的Android路由框架(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一位程序员将一款开源工具变成了价值75亿美元的帝国

    他的成功,激励着年轻的程序员 除了写代码,作为开发者,我们也需要时不时地仰望星空。我们每个人都怀有着远大的理想,希望用代码改变自己的生活、行业,甚至是这个世界。编码不仅仅是工作,更是对自己梦想和追求的执着。但是,如何开始,如何改变,有时候我们可

    2023年04月11日
    浏览(34)
  • 探索Ollama-WebUI:一款高效灵活的前端框架

    项目地址:https://gitcode.com/ollama-webui/ollama-webui Ollama-WebUI 是一个开源的前端框架,设计用于快速构建现代化、响应式和交互性强的 Web 应用程序。该项目的目标是提供一套简洁、易用且功能丰富的组件库,帮助开发者提升开发效率,减少重复工作,并确保应用的一致性和美观性

    2024年04月14日
    浏览(38)
  • Yunfly 一款高效、性能优异的node.js企业级web框架

    Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。 Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一套强大的插件系统, 给开发者提

    2024年02月15日
    浏览(54)
  • 探索 ImmortalWRT:一款强大而易用的开源路由器固件

    项目地址:https://gitcode.com/immortalwrt/immortalwrt ImmortalWRT 是一个基于 OpenWRT 的高度定制化路由器固件项目,旨在提供更加稳定、安全且功能丰富的网络环境。它的目标是让每个用户都能轻松地个性化和优化自己的网络设备,无论你是技术新手还是经验丰富的开发者。 OpenWRT 基础

    2024年04月10日
    浏览(37)
  • 分享一款嵌入式开源按键框架代码工程MultiButton

    MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块。 Github地址:https://github.com/0x1abin/MultiButton 这个项目非常精简,只有两个文件: (1)可无限扩展按键; (2)按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让按键业务逻辑更清晰。 通

    2024年04月15日
    浏览(58)
  • LSPatch —— 一款基于Android的免root框架

    前言 LSPosed(百度百科) 是一个基于 Riru 的 ART hook 框架 (最初用于 Android Pie) ,提供与原版 Xposed 相同的 API, 使用 YAHFA (或 SandHook) 进行 hook, 支持 Android 9 及其以上安卓版本。 LSPatch 则是LSPosed开发者所开发的另一款基于Android的免root框架。 Rootless implementation of LSPosed framework, in

    2024年02月12日
    浏览(39)
  • [Bread.Mvc] 开源一款自用 MVC 框架,支持 Native AOT

    Bread.Mvc 是一款完全支持 Native AOT 的 MVC 框架,搭配同样支持 AOT 的 Avalonia,让你的开发事半功倍。项目开源在 Gitee,欢迎 Star。 IoC容器是 MVC 框架的核心,为了支持AOT,Bread.Mvc 框架选择使用 ZeroIoC 作为 IoC 容器。ZeroIoC 是一款摒弃了反射的 IoC 容器,具有极高的性能并且完全兼

    2024年02月10日
    浏览(34)
  • [开源]一款企业级物联网平台低代码开发框架,代码精简,开箱即用

    基于Go 1.20前后端分离架构,代码精简,开箱即用,前端紧随前沿 Vue3.0 + TypeScript + vite3 + Element-plus技术 对前后端进行了大部分功能的封装,后端自封装go-restful,使用起来更加简洁,功能逻辑清晰,能快速上手学习,并用在生产中。 报表大屏设计器: 我们只需要拖拉拽即可绑定

    2024年02月04日
    浏览(48)
  • 探索Android USBCamera:一款开源的USB摄像头应用

    项目地址:https://gitcode.com/jiangdongguo/AndroidUSBCamera 本文将带您走进Android USBCamera项目,这是一个强大的开源库,允许Android设备通过USB连接物理相机并作为系统默认摄像头使用。无论您是开发者、摄影师还是对移动设备摄影有独特需求的用户,这个项目都值得您的关注。 Android

    2024年04月27日
    浏览(26)
  • 探索开源创新:Gorb - Go语言构建的高效RESTful API框架

    项目地址:https://gitcode.com/kobolog/gorb Gorb 是一个为Go语言开发者设计的轻量级、高性能的RESTful API框架。它旨在简化API开发流程,提高代码可读性和可维护性,同时也提供了一套强大的工具来帮助开发者创建健壮的Web服务。 Gorb的核心特性包括: 路由控制 :Gorb使用了直观且灵活

    2024年04月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包