如何在Android Studio中添加链接的源文件夹?

68

在Eclipse中,我可以将源文件夹添加到我的Android项目中作为“链接的源文件夹”。如何在Android Studio中实现相同的功能?

或者,是否可以将外部文件夹添加到Gradle构建中?

7个回答

109
在你的build.gradle文件中,在Android节点末尾添加以下内容:
android {
    ....
    ....

    sourceSets {
        main.java.srcDirs += 'src/main/<YOUR DIRECTORY>'
    }

}

1
真的很有帮助。为什么要将“sourceSets”放在“android”的范围内?我的“dependencies”不在其中。 - CopperCash
5
但是这个解决方案仅处理Java文件。那么src下的所有资源,比如drawable、layouts、strings等,该怎么办呢?如何能够将它们放在外部文件夹中? - GyRo
我猜没有支持Eclipse的包含/排除选项。太遗憾了。 - Brian White
2
@Deckard 在模块“app”的build.gradle中应该有一个android块,而不是在根构建文件中。 - user905686
1
@GyRo 你可以对资源文件执行相同的操作:在sourceSets中添加一行 main.res.srcDirs += '<YOUR DIRECTORY>' - FlorianT
显示剩余5条评论

24

正确答案是:

android {
    ....
    ....

    sourceSets {
        main.java.srcDirs += 'src/main/<YOUR DIRECTORY>'
    }
}

此外,如果您的外部源目录不在 src/main 之下,您可以使用如下的相对路径:
sourceSets {
    main.java.srcDirs += 'src/main/../../../<YOUR DIRECTORY>'
}

关于相对路径-我想知道是否可以使用某种Gradle变量,例如:srcDirs += "$(ProjectDir)/mylib/src"?我是Gradle的新手,不知道它是否支持这样的功能。 - Tom
5
由于点(.)可以取消路径组件,因此您可以省略 src/main/../../ 前缀。 - Brian White
@BrianWhite 我该如何在另一台机器上指定源集?sourceSets { main.java.srcDirs += 'src/main/\\10.51.70.21\me\myco\apps\myapp\src' } - likejudo
我不希望你能够这样做,因为据我所知,它只是使用操作系统的 open() 函数来访问文件。你可以使用类似 nfssmb 的东西将远程目录挂载到文件系统中,但这与 Android Studio 无关。 - Brian White
虽然这个解决方案可行,但我发现如果您的项目由多个模块组成,并且多个模块想要引用相同的外部源代码,则它将无法工作。似乎只有一个模块可以引用外部源文件。这很遗憾,因为我原本打算拥有一个共享常量的公共src文件夹,而不需要创建jar或aar文件。 - Johann
相对路径的使用对我来说非常有效,特别是在使用外部C++本地库时,只需要确保我在Gradle中设置了cmake { }路径也是相对的。谢谢。 - user1300214

2

2

sourceSets虽然可以包括整个目录结构,但在Android Studio中(1.2版本至今)无法排除它的部分内容,如从Android Studio中排除类所述。

在Android Studio更新支持Android源代码的包含/排除指令之前,符号链接是一个不错的选择。如果你使用Windows,那么像junctionmklink这样的本地工具可以实现类Unix系统中符号链接的等效功能。稍加措施,Cygwin也可以创建它们。详情请见:Windows中的Git符号链接如何在Windows 7中使用Cygwin创建符号链接


5
很遗憾,在使用符号链接的情况下,我在Android Studio 2.1.2中遇到以下问题:文件显示在项目文件旁边,并且在进行干净构建后它能够正常工作。但是,每次更改符号链接目录后的普通构建都会出现Gradle错误:“无法找到源Java类:'<full-absolute-path>/<added directory>/MyClass.java',因为它不属于任何源目录:[包括符号链接所在的包文件夹在内的src dirs列表,例如“.../src/main/java”]”。 - user905686
4
是的!天哪。我花了好几个小时才找到其他人也遇到了同样的问题。就像你所说的,在重新构建时符号链接可以工作,但在后续运行中无法工作。这太耗时间了,所以我已经更新了我的设置,引用实际目录而不是符号链接。有点麻烦,但可以使开发速度更快。 - Joshua Pinter
1
我已添加错误报告 https://issuetracker.google.com/issues/65343978,但我不确定它是否会被接受为错误。 - Vojtěch Sázel

2
以下是一个完整的Java模块Gradle文件,可以正确生成和引用Android多模块应用程序中的构建工件:
buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "net.ltgt.gradle:gradle-apt-plugin:0.15"
    }
}

apply plugin: "net.ltgt.apt"
apply plugin: "java-library"
apply plugin: "idea"

idea {
    module {
        sourceDirs += file("$buildDir/generated/source/apt/main")
        testSourceDirs += file("$buildDir/generated/source/apt/test")
    }
}

dependencies {

    // Dagger 2 and Compiler
    compile "com.google.dagger:dagger:2.15"
    apt "com.google.dagger:dagger-compiler:2.15"
    compile "com.google.guava:guava:24.1-jre"

}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"


1
这是针对Kotlin DSL(build.gradle.kts)的:

点击此处查看详情。

android {
    sourceSets["main"].java.srcDirs("src/main/myDirectory/code/")
    sourceSets["main"].resources.srcDirs("src/main/myDirectory/resources/")

    // Another notation:
    // sourceSets {
    //     getByName("main") {
    //         java.srcDirs("src/main/myDirectory/code/")
    //         resources.srcDirs("src/main/myDirectory/resources/")
    //     }
    // }
}

@PeterMortensen,我更新了链接。感谢您指出这一点。嗯...如果我没有使用正确的文章,请原谅我。 - Mahozad

0

如果您没有使用Gradle(例如从APK创建项目),则可以通过Android Studio UI(截至版本3.3.2)完成此操作:

  • 右键单击项目根目录,选择打开模块设置
  • 点击+添加内容根目录按钮(位于中心右侧)
  • 添加您的路径并点击确定

根据我的经验(使用本地代码),只要您的.so文件是使用调试符号构建的,并且来自相同的绝对路径,那么在源文件中添加的断点将自动被识别。


失去我在第二点...看不到添加内容根按钮。 - JCutting8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接