ARouter-Kotlin踩坑
kotlin/java混合开发接入ARouter遇到的问题Compiler An exception is encountered, [These no module name, at ‘build. 以及There is no route match the path [/xxx/xxxx], in group [\xxx][ ]
当前ARouter的版本
模块 | arouter-api | arouter-compiler | arouter-register | arouter-idea-plugin |
---|---|---|---|---|
最新版本 | 1.5.2 | 1.5.2 | 1.0.2 | 13k |
项目基本结构:
lib_common
作为底层库,是所有仓库底层的依赖
# Compiler An exception is encountered
# 报错
# 修正
问题原因:ARoute (opens new window) 未完全兼容Kotlin - Java混编的问题导致,需要Kotlin、Java各写一份,希望官方未来的版本早日兼容。查这个问题耗费了挺多时间😭😭
问题源解,参考自:
- kotlin/java混合开发接入ARouter遇到的问题Compiler An exception is encountered (opens new window)
- KOTLIN AROUTER THERE IS NO ROUTE MATCH THE PATH IN GROUP (opens new window)
# 报错信息
ARouter::Compiler An exception is encountered, [These no module name, at 'build.gradle', like :
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
]
Execution failed for task ':settings:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
> java.lang.reflect.InvocationTargetException (no error message)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
刚开始报错配置如下:
Base Module (opens new window):
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
}
android {
defaultConfig {
// ...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
dependencies {
api 'com.alibaba:arouter-api:1.5.2'
kapt 'com.alibaba:arouter-compiler:1.5.2'
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Other Modules:
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
}
android {
defaultConfig {
// ...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
dependencies {
api project(':base')
kapt 'com.alibaba:arouter-compiler:1.5.2'
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
总是提示我没有配置【javaCompileOptions】这部分,但是我明明配置了,换成kotlin版的也不行
项目是Kotlin项目,有部分Java类,build.gradle脚本是Grovey语言,并非是KTS
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
2
3
4
5
查找相关问题后,类似的解决方案是Java和Kotlin两个版本都配置;于是两个版本都一起配置上去了,居然就行了,这坑真是深,接入的版本是1.5.2😱😱😱
android {
defaultConfig {
// ...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 继续报错:There is no route match the path [/xxx/xxxx], in group [\xxx][ ]
但是,在我配置完上述内容后,我发现我的项目依然存在问题, 路由路劲找不到🥶🥶
过滤到的ARouter日志是:
2023-10-04 21:57:00.047 8388-8388 ARouter:: top.iqqcode.viewcustoms W ARouter::There is no route match the path [/animations/ModuleAnimationMainActivity], in group [animations][ ]
一一排除了官方给出的可能性,我的配置没有任何问题:
https://github.com/alibaba/ARouter/blob/master/README_CN.md#%E4%B8%83qa
"W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]"
一、通常来说这种情况是没有找到目标页面,目标不存在
二、如果这个页面是存在的,那么您可以按照下面的步骤进行排查
- 检查目标页面的注解是否配置正确,正确的注解形式应该是 (@Route(path="/test/test"), 如没有特殊需求,请勿指定group字段,废弃功能);不同的模块间一级路径名称要个不相同,如login模块/login/LoginActivity,而user模块/user/UserInfoActivity
- 检查目标页面所在的模块的gradle脚本中是否依赖了 arouter-compiler sdk (需要注意的是,要使用apt依赖,而不是compile关键字依赖)
- 检查编译打包日志,是否出现了形如 ARouter::�Compiler >>> xxxxx 的日志,日志中会打印出发现的路由目标
- 启动App的时候,开启debug、log(openDebug/openLog), 查看映射表是否已经被扫描出来,形如 D/ARouter::: LogisticsCenter has already been loaded, GroupIndex[4],GroupIndex > 0
排除法确认上述配置均正确
# Kapt解决
在引用**arouter-compiler
**时,Kotlin的项目或者Kotlin-Java混编的项目,必须使用 **kapt
**来依赖,否则会出现 "W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]"
将lib_common模块对config.gradle
的arouter-compiler依赖引用由API的方式换为 kapt 即可
检查目标页面所在的模块的gradle脚本中是否依赖了 arouter-compiler sdk (需要注意的是,要使用 **kapt
**依赖,而不是compile
或者implementation
关键字依赖) ,即无论哪个模块需要路由跳转,双方的modle都要引入annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
【参考文章】
[1]. Android 手把手带你搭建一个组件化项目架构. https://juejin.cn/post/7033954652315975688?searchId=20231004133953C45B44465E3AD7FBF44B#heading-8
[2]. kotlin/java混合开发接入ARouter遇到的问题. https://blog.csdn.net/guangdeshishe/article/details/119787100
[3]. KOTLIN AROUTER THERE IS NO ROUTE MATCH THE PATH IN GROUP. https://www.freesion.com/article/9534626868/