TheRouter 常见问题处理


如无法解决你的问题,建议登记应用,获取优先技术支持 https://github.com/HuolalaTech/hll-wp-therouter-android/issues/57

问题列表不定期更新中…


Q1: 路由表不生成(或生成的代码有问题编译报错)

(注:1.2.0-rc5版本已修复:KSPViewBinding共用不生成路由表的问题)

请按照以下步骤排查:

  1. plugin 加了吗?plugin 必须加且只能加在 app 模块里。
  2. kapt加了吗?kapt不能只加最底层,所有用了注解的模块都要加。
  3. router、plugin、kapt,三个依赖的版本号必须一致。
  4. 在这里查看JDK信息:Preferences-> Build Tools-> Gradle-> Gradle JDK。不能用AS自带的jdk,KSP会有兼容问题,请在 Oracle 官网下载:Java 17Java 11Java 8
  5. 尝试更新至最新rc版本查看是否修复。版本列表

Q2:kotlin使用@Autowired注解编译不通过

查看 GitHub Issue:https://github.com/HuolalaTech/hll-wp-therouter-android/issues/6


Q3:使用Gradle 8.X,编译报错

https://github.com/HuolalaTech/hll-wp-therouter-android/issues/22


Q4:从 ARouter 迁移 TheRouter 时通过 Bundle 传递的参数不能正确获取

https://github.com/HuolalaTech/hll-wp-therouter-android/issues/29


Q5:多进程如何使用

https://therouter.cn/docs/2022/09/03/01


Q6:同一个服务名有多个服务提供方,如何使用

请查看文档 【1.3 服务提供方】章节的内容:https://therouter.cn/docs/2022/08/27/01


Q7:多进程使用 TheRouter

TheRouter 路由支持多进程,但默认只会在主进程执行初始化逻辑。如果使用了多进程,可以先关闭TheRouter的自动初始化,然后手动在ApplicationonCreate()中执行初始化功能。

override fun attachBaseContext(base: Context) {
    super.attachBaseContext(base)
    theRouterUseAutoInit = false
}

override fun onCreate() {
    super.onCreate()
    TheRouter.init(this)
}

注意


Q8:自定义Log输出

默认情况下,TheRouter会在debug模式下,将log打印到控制台,在release模式下不做任何输出。
如果你希望采集线上日志信息,可以自定义release场景下的日志输出方式:

override fun onCreate() {
    // 这一步建议放在Application.onCreate()之前,否则可能会在赋值之前就有部分日志已经执行了默认逻辑。
    TheRouter.logCat = {tag, msg ->  
        // 执行上报日志的逻辑
    }
    super.onCreate()
}

Q9:判断String,是否为路由path

// 判断是否为路由落地页path
TheRouter.isRouterPath(path) : Boolean  

// 判断是否为 Action
TheRouter.isRouterAction(path) : Boolean

Q10:导出路由历史记录

如果需要记录用户历史操作信息,用于排查错误时回放,可以直接使用历史记录导出功能:

// level共8个状态可选
val NONE // 不导出任何数据
val ACTIVITY //仅导出Activity的路由操作
val FRAGMENT //仅导出Fragment的路由操作
val PAGE  // 导出 Fragment + Activity的路由操作
val ACTION  // 导出 ActionManager 的操作记录
val SERVICE_PROVIDER // 导出 ServiceProvider的记录
val FLOW_TASK // 导出 FlowTaskExecutor 的历史记录
val ALL // 导出全部记录

// 8种状态可互相叠加,例如
val level = ACTIVITY + ACTION + FLOW_TASK

export(level).forEach {
    info.append(it).append('\n').append('\n')
}

Q11:导入导出 Intent 对象到路由

有一些特殊的业务场景可能必须使用Intent对象作为参数,例如通知栏点击以后,系统只提供了Intent参数,或者用于替代startActivityForResult()的新 API ActivityResultLauncher
TheRouter 也支持这样的使用场景:

导入 Intent:

TheRouter.build(intent).withXxxxx().navigation()

导出 Intent:

// 注:导出Intent时,需要url有对应的落地页,否则Intent不会附带withXXX()的参数信息
val intent = TheRouter.build(url).withXxxxx().createIntent()

Q12:插件化项目集成

TheRouter 的路由表是完全动态化的,所以允许动态加载插件路由表。 现有市面上插件化框架较多,具体可参考使用的插件化方案,当插件被加载时分别调用如下代码

// 在异步线程执行
execute {
    // 初始化插件内的依赖注入
    TheRouterServiceProvideInjecter.trojan();
    // 初始化插件内的FlowTask
    TheRouterServiceProvideInjecter.addFlowTask(context, TheRouter.digraph);
    // 初始化插件内的路由表
    TheRouterServiceProvideInjecter.initDefaultRouteMap();
}

Q13:Flutter/RN/WEEX 等混编项目集成

TheRouter 的路由表是完全动态化的,所以允许动态加载跨平台项目的路由表。

可以直接将路由表配置到/assets/RouteMap.json文件中。
如果路由表的 url 是具备规律的,可简单使用正则表达式一次性加载。

[
  {
    "path": "https://kymjs.com/flutter/\\S*",
    "className": "com.therouter.FlutterActivity",
    "action": "",
    "description": "",
    "params": {
      "key":"value"
    }
  },
  ......
  // 添加其他路由表
  ......
]

Q14:我的项目使用的Gradle8.x(或AGP8),引入插件失败

请完整查看接入文档https://therouter.cn/docs/2022/11/23/01,并仔细阅读【第一步:接入classpath】


Q15:我为什么总是拉不到TheRouter的依赖

TheRouter 的依赖全部上传在 mavenCentral,请检查你的仓库声明中是否有声明。另外,请不要使用阿里云的镜像仓库,否则也会造成拉不到依赖的情况。

repositories {
    mavenCentral()
}

Q16:编译报错 API 'android.registerTransform' is removed

https://github.com/HuolalaTech/hll-wp-therouter-android/issues/121


相关推荐:

TheRouterSwift iOS 路由介绍TheRouterSwift iOS 路由介绍

TheRouterSwift是货拉拉TheRouter系列开源框架的Swift版本,为日益增多的Swift开发者提供一高可用路由框架。TheRouterSwift用于模块间解耦和通信,基于Swift协议进行动态懒加载注册路由与打开路由的工具。同时支持通过Service-Protocol寻找对应的模块,并用 protocol进行依赖注入和模块通信。

16 mins
TheRouter iOS 路由介绍TheRouter iOS 路由介绍

TheRouter 是货拉拉打造的一款同时支持 Android 及 iOS 的轻量级路由中间件,在iOS端吸取了其他其他语言的特性,支持注解功能,极大提升了路由在iOS端的使用体感。摒弃了传统 iOSer 的 target-action 或 protocol 理念,向更广的后台或 Android 应用对齐。

4 mins
动态路由 TheRouter 的设计与实践动态路由 TheRouter 的设计与实践

详细讲解 TheRouter 框架内部实现原理,以及在完整企业级项目中使用的实践效果。这篇文章是我在 2022【GIAC 全球互联网架构大会】分享时所讲内容的文字版本,修改删减了演讲时的冗余言语,现开放给大家阅读,希望能给买不到票参加分享的 开源实验室 读者带来帮助。

1 mins