Arouter 的坑 ARouter::There is no route match the path

本文详细介绍了ARouter在Android开发中的使用方法,包括配置、初始化及常见问题的解决方案,如路径匹配失败、InstantRun冲突等,帮助开发者快速定位并解决ARouter使用过程中的难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每次使用Arouter 在第一次使用的时候一定会出现,ARouter::There is no route match the path,浪费了很多时间去调试!这次自己写demo 的时候又出现了,很无语!

1.gradle 配置


    implementation rootProject.ext.dependencies["arouter"]
    annotationProcessor rootProject.ext.dependencies["arouter-compiler"]
   javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }

2.使用之前需要init

public class App extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        initLibs();
    }


    private void initLibs(){
        Utils.init(this);
        ARouter.init(this);
        if(AppUtils.isAppDebug()){
            ARouter.openLog();
            ARouter.openDebug();
        }
    }
}

3.随便用一下

     Observable.just(true).
                delay(1, TimeUnit.SECONDS, Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread()).
                compose(this.bindToLifecycle()).
                subscribe(aBoolean -> {
                    ARouter.getInstance().build("/main/HomeActivity")
                            .navigation();
                    finish();
                });

然后就出现了 跳转失败!

不是第一次出现,配置初始化不可能有问题,其他项目也都是这样,最开始怎么弄都不行,后面突然就可以了,其实什么都没改!不过这次实在忍不了!

在gradle console 里面会有一些 Arouter 的初始化日志

 里面会生成一个 root

ARouter$$Root$$app

找到这个类进去看看

public class ARouter$$Root$$app implements IRouteRoot {
  @Override
  public void loadInto(Map<String, Class<? extends IRouteGroup>> routes) {
    routes.put("main", ARouter$$Group$$main.class);
    routes.put("splash", ARouter$$Group$$splash.class);
  }
}
/**
 * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
public class ARouter$$Group$$splash implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/splash/activity", RouteMeta.build(RouteType.ACTIVITY, SplashActivity.class, "/splash/activity", "splash", null, -1, -2147483648));
  }
}
public class ARouter$$Group$$main implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/main/HomeActivity", RouteMeta.build(RouteType.ACTIVITY, HomeActivity.class, "/main/homeactivity", "main", null, -1, -2147483648));
  }

就是这样现在调着想看看到底是哪的问题的时候又好了!!!

clean 一下重新运行又不行了!!看了下源码,跟上面生成的文件时一样的就是加载不了!

后面找到一个人的博客原文地址!就是下面的问题3

问题1:"W/ARouter::: ARouter::No postcard![ ]" 问题。

这个Log正常的情况下也会打印出来,如果您的代码中没有实现DegradeService和PathReplaceService的话,因为ARouter本身的一些功能也依赖 自己提供的Service管理功能,ARouter在跳转的时候会尝试寻找用户实现的PathReplaceService,用于对路径进行重写(可选功能),所以如果您没有 实现这个服务的话,也会抛出这个日志

推荐在app中实现DegradeService、PathReplaceService

问题2:"W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]"。

通常来说这种情况是没有找到目标页面,目标不存在
如果这个页面是存在的,那么您可以按照下面的步骤进行排查
检查目标页面的注解是否配置正确,正确的注解形式应该是 (@Route(path="/test/test"), 如没有特殊需求,请勿指定group字段,废弃功能)
检查目标页面所在的模块的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
问题3:开启InstantRun之后无法跳转(高版本Gradle插件下无法跳转)?

因为开启InstantRun之后,很多类文件不会放在原本的dex中,需要单独去加载,ARouter默认不会去加载这些文件,因为安全原因,只有在开启了openDebug之后 ARouter才回去加载InstantRun产生的文件,所以在以上的情况下,需要在init之前调用openDebug

问题4:TransformException:java.util.zip.ZipException: duplicate entry ….

ARouter有按组加载的机制。ARouter允许一个module中存在多个分组,但是不允许多个module中存在相同的分组,会导致映射文件冲突

问题5:Kotlin类中的字段无法注入如何解决?

首先,Kotlin中的字段是可以自动注入的,但是注入代码为了减少反射,使用的字段赋值的方式来注入的,Kotlin默认会生成set/get方法,并把属性设置为private 所以只要保证Kotlin中字段可见性不是private即可,简单解决可以在字段上添加 @JvmField

问题6:通过URL跳转之后,在intent中拿不到参数如何解决?

需要注意的是,如果不使用自动注入,那么可以不写 ARouter.getInstance().inject(this),但是需要取值的字段仍然需要标上 @Autowired 注解,因为 只有标上注解之后,ARouter才能知道以哪一种数据类型提取URL中的参数并放入Intent中,这样您才能在intent中获取到对应的参数

问题7:新增页面之后,无法跳转?

ARouter加载Dex中的映射文件会有一定耗时,所以ARouter会缓存映射文件,直到新版本升级(版本号或者versionCode变化),而如果是开发版本(ARouter.openDebug()), ARouter 每次启动都会重新加载映射文件,开发阶段一定要打开 Debug 功能。

 

按照上面说的改下代码就好了

   private void initLibs(){
        Utils.init(this);
        if(AppUtils.isAppDebug()){
            ARouter.openLog();
            ARouter.openDebug();
        }
        ARouter.init(this);
    }

这次又浪费我快两个小时!!!这种坑找到我死我也找不出来,更加说明了‘’小菜‘’在引入别人的库一定要谨慎啊,能不用的尽量别用,尤其是没什么人用这个库的时候。

<think>好的,我现在需要帮助用户解决关于“KeyError: 'chromedriver.exe' not in archive”的错误。首先,我需要理解这个问题的背景。根据用户提供的引用信息,特别是引用[3],用户可能在打包程序时没有正确包含chromedriver.exe文件,导致在其他机器上运行时找不到这个文件,从而引发KeyError错误。 首先,我应该检查用户是否在打包时将chromedriver.exe包含在归档中。引用[3]提到,用户需要将第三方库或应用程序一起打包,比如将chromedriver.exe放到dist文件夹中。如果用户打包时没有正确包含这个文件,就会出现问题。 接下来,我需要考虑可能的解决方案。根据错误提示,问题可能出在文件路径或打包配置上。可能的解决步骤包括:确认chromedriver.exe是否被正确包含在打包文件中,确保文件路径在代码中正确配置,或者在打包工具(如PyInstaller)的配置中添加数据文件。 另外,引用[1]和[2]提到了chromedriver和geckodriver的版本匹配问题,但用户已经确认版本是最新且匹配的,所以可能可以暂时排除版本问题。不过,还是需要提醒用户检查版本兼容性,尽管主要问题可能在于文件是否被正确打包。 然后,我需要考虑如何验证这些解决方案。例如,用户可以在打包后检查生成的dist文件夹中是否存在chromedriver.exe,或者在代码中使用绝对路径或相对路径来定位该文件。此外,如果使用PyInstaller,可以通过修改spec文件来确保数据文件被正确包含。 最后,需要生成相关问题,帮助用户进一步理解和解决可能遇到的类似问题。例如,如何配置PyInstaller打包数据文件,如何处理其他类似的可执行文件缺失错误等。</think>### 解决 "KeyError: 'chromedriver.exe' not in archive" 的步骤 #### 1. **确认文件包含在打包目录** - **问题根源**:打包工具(如PyInstaller)默认仅打包代码依赖的Python库,不会自动包含外部可执行文件如`chromedriver.exe`[^3]。 - **解决方法**: - 手动将`chromedriver.exe`复制到打包后的`dist`目录中(与主程序同级)。 - 使用PyInstaller的`--add-data`参数指定包含文件: ```bash pyinstaller --add-data "chromedriver.exe;." your_script.py ``` #### 2. **检查代码中的路径配置** - **常见错误**:代码中直接使用`chromedriver.exe`而未指定正确路径,导致在其他机器上运行时路径失效。 - **修正方案**: ```python import os from selenium import webdriver # 获取当前脚本所在目录的绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) chromedriver_path = os.path.join(current_dir, "chromedriver.exe") driver = webdriver.Chrome(executable_path=chromedriver_path) ``` #### 3. **验证打包后的文件结构** - 打包完成后,检查`dist/your_app_name`目录是否包含: ``` ├── your_script.exe └── chromedriver.exe # 必须存在 ``` - 若缺失,需重新打包并确保参数配置正确[^3]。 #### 4. **使用临时目录清理机制** - **问题补充**:若未正确关闭浏览器驱动,可能导致临时文件堆积(参考引用[2]关于FirefoxDriver的类似问题)。 - **代码优化**: ```python try: driver = webdriver.Chrome(executable_path=chromedriver_path) # 业务逻辑 finally: driver.quit() # 确保退出时关闭驱动 ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值