首页 > 解决方案 > 限制 Android Studio/Gradle 解析源路径(符号链接问题)

问题描述

这可能是一个 XY 问题,因为它涉及将文件符号链接到源代码树中。我有时会在开发中使用许多应用程序项目通用的库来执行此操作。更常规地,它们将(以后将)只是 .aar 进口。不这样做会简化在应用程序代码上下文中对库的 API 调整——一个选项是自动打包和导入 aar,但这仍然更像是 PITA,意味着我要么在 IDE 中运行两个项目同时(未尝试)或在它们之间切换。

通常,符号链接只是目录,但目前我正在使用单个文件进行操作,并且尝试构建涉及“重新声明”错误的应用程序时出现了一个奇怪的问题。目录偶尔会发生这种情况,但通常通过 gradle re-sync 或 invalidate-and-restart 解决。

需要明确的是,问题是一个不应该存在并且闻起来很像错误的问题:“重新声明”是指不在构建树或项目文件夹中的符号链接位置- 即,重新声明涉及处理相同的用不同的路径文件两次。1

令人沮丧的是,invalidate-and-restart 对单个文件不起作用,所以我删除了符号链接,只是将文件复制进去。没有更多的符号链接,但奇怪的是同样的问题发生了:

./gradlew assemble
> Task :app:compileDebugKotlin FAILED
e: /home/devel/Android/lib/droidutil/src/cogware/droidutil/Plexus.kt: (5, 8): Redeclaration: Plexus
e: /home/devel/Android/template/FooDemo/app/src/main/java/cogware/droidutil/Plexus.kt: (5, 8): Redeclaration: Plexus

(使用 IDE 也是一样。)这里的项目文件夹是/home/devel/Android/template/FooDemo. /home/devel/Android/lib/droidutil/src/cogware/droidutil/不是它的一部分——虽然公平地说还有其他符号链接,但 gradle 需要做的就是遵循为它设置的显式路径。现在似乎正在发生的事情是:

唯一没有意义的事情是它随机搜索整个文件系统。

为什么它会保留这条路径,我该如何摆脱它?

无效并重新启动没有任何区别。我尝试将其添加到 app/build.gradle:

android { 
    ...
    sourceSets {
        main {
            java {
                exclude '/home/devel/Android/lib/**'
                srcDirs = [ 'app/src/main/java' ]
            }
        }
    }

exclude显然没有语义价值——同样的错误。再次无效并重新启动——同样的错误。

没有擦除我的硬盘驱动器并在不同时区的另一台计算机上从头开始重新启动项目,唯一有效的方法是让我完全移动 /home/devel/Android/lib到其他地方,这样路径就不再存在了。我不应该这样做。我应该能够明确设置构建工具搜索源的位置,而不是让它解开符号链接并四处游荡。


  1. 我想念包括警卫。

标签: android-studiogradlesymlink

解决方案


似乎这是一个错误,但不幸的是,这种错误可能永远不会完全修复:

https://github.com/gradle/gradle/issues/3982

不完全相同的上下文或症状,但对我来说,没有实现 gradle 以智能方式处理符号链接,因此: 不要将符号链接与 gradle 一起使用。


推荐阅读