一、架构整体设计

这是一个典型的 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 为例:

组成部分解析方法示例值
SchemegetScheme()nadcorevendor
ModulegetModule()vendor/ad
(host + path前缀)
ActiongetAction()download
(path最后一段)
ParamsgetParams(){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. 路由分发 (SchemeRouterSchemeDispatcher)

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
downloadH5 广告下载
dlinkDeepLink 跳转
reward激励视频请求
mnprogram小程序跳转
openWXNativePage微信原生页跳转
prerender预渲染
webpanelH5 半屏
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
路由注册运行时依赖注入编译期注解处理 APTXML 导航图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 架构
DeepLinkApp Links / Universal Links外部引流、SEO、分享跳转

更新: 2026-02-12 15:41:35
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/cpqs8oavgo7v206r