WMRouter

Project Url: meituan/WMRouter
Introduction: WMRouter 是一款 Android 路由框架,基于组件化的设计思路,有功能灵活强大、使用简单的特点。
More: Author   ReportBugs   
Tags:

License Release Version PRs Welcome

WMRouter 是一款 Android 路由框架,基于组件化的设计思路,有功能灵活、使用简单的特点。

请注意,因为 JCenter 下线,从 1.2.1 开始,Group 从 com.sankuai.waimai.router 变更为 io.github.meituan-dianping。

WMRouter 主要提供 URI 分发、ServiceLoader 两大功能。

URI 分发功能可用于多工程之间的页面跳转、动态下发 URI 链接的跳转等场景,特点如下:

  1. 支持多 scheme、host、path
  2. 支持 URI 正则匹配
  3. 页面配置支持 Java 代码动态注册,或注解配置自动注册
  4. 支持配置全局和局部拦截器,可在跳转前执行同步/异步操作,例如定位、登录等
  5. 支持单次跳转特殊操作:Intent 设置 Extra/Flags、设置跳转动画、自定义 StartActivity 操作等
  6. 支持页面 Exported 控制,特定页面不允许外部跳转
  7. 支持配置全局和局部降级策略
  8. 支持配置单次和全局跳转监听
  9. 完全组件化设计,核心组件均可扩展、按需组合,实现灵活强大的功能

基于SPI (Service Provider Interfaces) 的设计思想,WMRouter 提供了 ServiceLoader 模块,类似 Java 中的java.util.ServiceLoader,但功能更加完善。通过 ServiceLoader 可以在一个 App 的多个模块之间通过接口调用代码,实现模块解耦,便于实现组件化、模块间通信,以及和依赖注入类似的功能等。其特点如下:

  1. 使用注解自动配置
  2. 支持获取接口的所有实现,或根据 Key 获取特定实现
  3. 支持获取 Class 或获取实例
  4. 支持无参构造、Context 构造,或自定义 Factory、Provider 构造
  5. 支持单例管理
  6. 支持方法调用

其他特性:

  1. 优化的 Gradle 插件,对编译耗时影响较小
  2. 编译期和运行时配置检查,避免配置冲突和错误
  3. 完善的调试功能,帮助及时发现问题

适用场景

WMRouter 适用但不限于以下场景:

  1. Native+H5 混合开发模式,需要进行页面之间的互相跳转,或进行灵活的运营跳转链接下发。可以利用 WMRouter 统一页面跳转逻辑,根据不同的协议(HTTP、HTTPS、用于 Native 页面的自定义协议)跳转对应页面,且在跳转过程中可以使用 UriInterceptor 对跳转链接进行修改,例如跳转 H5 页面时在 URL 中加参数。

  2. 统一管理来自 App 外部的 URI 跳转。来自 App 外部的 URI 跳转,如果使用 Android 原生的 Manifest 配置,会直接启动匹配的 Activity,而很多时候希望先正常启动 App 打开首页,完成常规初始化流程(例如登录、定位等)后再跳转目标页面。此时可以使用统一的 Activity 接收所有外部 URI 跳转,到首页时再用 WMRouter 启动目标页面。

  3. 页面跳转有复杂判断逻辑的场景。例如多个页面都需要先登录、先定位后才允许打开,如果使用常规方案,这些页面都需要处理相同的业务逻辑;而利用 WMRouter,只需要开发好 UriInterceptor 并配置到各个页面即可。

  4. 多工程、组件化、平台化开发。多工程开发要求各个工程之间能互相通信,也可能遇到和外卖 App 类似的代码复用、依赖注入、编译等问题,这些问题都可以利用 WMRouter 的 URI 分发和 ServiceLoader 模块解决。

  5. 对业务埋点需求较强的场景。页面跳转作为最常见的业务逻辑之一,常常需要埋点。给每个页面配置好 URI,使用 WMRouter 统一进行页面跳转,并在全局的 OnCompleteListener 中埋点即可。

  6. 对 App 可用性要求较高的场景。一方面,可以对页面跳转失败进行埋点监控上报,及时发现线上问题;另一方面,页面跳转时可以执行判断逻辑,发现异常(例如服务端异常、客户端崩溃等)则自动打开降级后的页面,保证关键功能的正常工作,或给用户友好的提示。

  7. 页面 A/B 测试、动态配置等场景。在 WMRouter 提供的接口基础上进行少量开发配置,就可以实现:根据下发的 A/B 测试策略跳转不同的页面实现;根据不同的需要动态下发一组路由表,相同的 URI 跳转到不同的一组页面(实现方面可以自定义 UriInterceptor,对匹配的 URI 返回 301 的 UriResult 使跳转重定向)。

设计与使用文档

设计与使用文档

发展背景

关于 WMRouter 的发展背景和过程,可参考美团技术博客 WMRouter:美团外卖 Android 开源路由框架

更新日志

更新日志

使用了 WMRouter 的项目


美团外卖

美团外卖商家版

美团

大众点评

欢迎补充,并创建 PullRequest。

贡献者 / Contributors ✨

All Contributors

感谢所有参与贡献的人员:


江子健

💻 📖 🤔 📝 🚧

李少杰

🤔 💻 👀 🚧

yuanboGeng

💻 🤔

Laberat Yi

🤔

郑金光

🐛 👀 🚧

Ultra-Dejavu

💻

Jeremy Liao

💻

kiminozo

💻 🐛

zjiecode

🐛 🚧

hibate

🐛

卓修武

🐛 💻

Vali

📖

Caij

🐛

Acropolis

🐛

dingshaoran

🐛

栉风

🐛
  • 如有遗漏和需要补充的,可按照 all-contributors 文档自行添加,并创建 Pull Request。
  • 参与贡献者可加微信 jzj2015,进入 WMRouter Contributors 微信群学习交流。
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools