一、架构整体设计
这是一个典型的 URI Scheme 路由框架,采用了分层架构:
┌─────────────────────────────────────────────────────────────┐
│ 外部调用层 │
│ SchemeRouter (入口) │
├─────────────────────────────────────────────────────────────┤
│ 拦截层 │
│ BaseSchemeInterceptor (拦截器链) │
├─────────────────────────────────────────────────────────────┤
│ 分发层 │
│ SchemeDispatcher (分发器) │
├─────────────────────────────────────────────────────────────┤
│ 执行层 │
│ BaseSchemeAction (具体Action处理) │
├─────────────────────────────────────────────────────────────┤
│ 模型层 │
│ SchemeModel + SchemeUtility + SchemeConstants │
└─────────────────────────────────────────────────────────────┘二、核心流程分析
1. URI 解析 (SchemeUtility)
URI 格式:scheme://module/action?params
以 nadcorevendor://vendor/ad/download?ad_id=123&charge_url=xxx 为例:
| 组成部分 | 解析方法 | 示例值 |
|---|---|---|
| Scheme | getScheme() | nadcorevendor |
| Module | getModule() | vendor/ad(host + path前缀) |
| Action | getAction() | download(path最后一段) |
| Params | getParams() | {ad_id=123, charge_url=xxx} |
核心解析逻辑:
// Module = host + path除最后一段
// 例如: vendor/ad/sub/action → module = "vendor/ad/sub", action = "action"
public static String getModule(Uri uri) {
String host = uri.getHost(); // "vendor"
List<String> path = uri.getPathSegments(); // ["ad", "download"]
// 拼接 host + path[0..n-1] 作为 module
}
public static String getAction(Uri uri) {
// 取 path 最后一个元素作为 action
return path.get(path.size() - 1); // "download"
}2. 路由分发 (SchemeRouter → SchemeDispatcher)
invoke(command)
│
├── 1. 校验 URI 有效性 (isValidScheme)
│
├── 2. 构建 SchemeModel (解析 URI)
│
└── 3. dispatch 到 SchemeDispatcher
│
├── 3.1 检查拦截器 (shouldInterceptDispatch)
│ └── 遍历注册的 BaseSchemeInterceptor
│
├── 3.2 验证 module 是否为 "vendor/ad"
│
├── 3.3 根据 action 查找对应的 BaseSchemeAction
│ └── 从 mActionMap 中获取
│
└── 3.4 执行 action.handle() 或降级到宿主处理3. Action 注册机制
通过 依赖注入 方式在编译期收集所有 Action:
Java
插入复制
static {
SchemeRuntime schemeRuntime = new SchemeRuntime();
SCHEME_ACTIONS = schemeRuntime.sSchemeActionList.getList();
SCHEME_INTERCEPTORS = schemeRuntime.sSchemeInterceptorList.getList();
}
// 构造时建立 action name → Action 实例的映射
for (BaseSchemeAction item : SCHEME_ACTIONS) {
mActionMap.put(item.getActionName(), item);
}4. 支持的 Action 类型 (SchemeConstants)
| Action | 说明 |
|---|---|
call | 调起拨号盘 |
easybrowse | 打开 WebView |
download | H5 广告下载 |
dlink | DeepLink 跳转 |
reward | 激励视频请求 |
mnprogram | 小程序跳转 |
openWXNativePage | 微信原生页跳转 |
prerender | 预渲染 |
webpanel | H5 半屏 |
toast | 弹 Toast |
| … | 等共 20+ 种 |
三、设计亮点
1. 拦截器模式
Java
插入复制
// 可在 Action 执行前拦截处理
public abstract boolean shouldInterceptDispatch(
Context context,
SchemeModel schemeModel,
Map<String, Object> msgMap,
IHandleCallback handleCallback
);- 支持登录校验、权限检查、埋点统计等横切关注点
- 每个拦截器可指定要拦截的 action
2. 统一回调机制
Java
插入复制
// 标准化的回调格式
Map<String, String> params = {
"status": "状态码",
"message": "错误信息",
"data": "业务数据",
"callback": "JS回调函数名"
};3. JS Bridge 支持
Java
插入复制
// 支持生成 JS 回调字符串
// javascript:callback('{"status":"0","message":"成功","data":"..."}');
public static String map2JsCallbackJsonStr(Map<String, String> params)4. 降级机制
Java
插入复制
// module 不匹配或 action 不存在时,降级到宿主处理
if (!checkModuleIsValid(module) || schemeAction == null) {
return CmdRuntime.hostRouter().invoke(context, command, ...);
}四、与业界主流方案对比
主流路由方案对比表
| 特性 | 本项目方案 | ARouter (阿里) | Navigation (Google) | DeepLink |
|---|---|---|---|---|
| 路由注册 | 运行时依赖注入 | 编译期注解处理 APT | XML 导航图 | Manifest 声明 |
| 路由表生成 | 手动注册 | 自动生成 | XML 配置 | 系统级 |
| 拦截器 | ✅ 支持 | ✅ 支持(优先级) | ❌ 不支持 | ❌ 不支持 |
| 参数注入 | 手动解析 | @Autowired自动注入 | Safe Args 类型安全 | Intent 传递 |
| 跨模块解耦 | ✅ 部分支持 | ✅ 完全解耦 | ⚠️ 需配置 | ❌ 耦合 |
| 外部跳转 | ✅ URL Scheme | ✅ URL Scheme | ✅ Deep Link | ✅ 原生支持 |
| 降级处理 | ✅ 宿主处理 | ✅ 全局降级策略 | ❌ 无 | ❌ 无 |
| Fragment支持 | ❌ 不支持 | ✅ 支持 | ✅ 原生支持 | ❌ 仅Activity |
| 服务发现 | ❌ 不支持 | ✅ IProvider | ❌ 不支持 | ❌ 不支持 |
市面上的主流方案
| 方案类型 | 代表框架 | 适用场景 |
|---|---|---|
| 注解路由 | ARouter、TheRouter、WMRouter | 大型模块化 App,需要完全解耦 |
| URL Scheme | 本项目、自研方案 | SDK/组件库、H5交互、广告系统 |
| 官方导航 | Jetpack Navigation | 单 Activity + 多 Fragment 架构 |
| DeepLink | App Links / Universal Links | 外部引流、SEO、分享跳转 |
更新: 2026-02-12 15:41:35
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/cpqs8oavgo7v206r