【问题标题】:Android studio doesn't recognise source foldersAndroid Studio 无法识别源文件夹
【发布时间】:2014-03-30 21:28:56
【问题描述】:

我使用的是标准的 Android Studio 目录结构,并创建了不同的构建类型:

buildTypes {
    debug {
        runProguard false
        packageNameSuffix ".debug"
        signingConfig signingConfigs.debug
    }
    preview.initWith(buildTypes.debug)
    preview {
        packageNameSuffix ".preview"
    }
    release {
        runProguard false
        signingConfig signingConfigs.release
    }
}

一切编译正常,但 AS 无法识别所有源文件夹。 只有maindebug 下的文件夹被标记为源,previewrelease 下的文件夹显示为普通文件夹 实际上,这些文件夹中没有错误检查

我检查了 .iml 文件,没有添加 sourceFolder 标签。

如果我手动编辑项目 iml 文件添加行:

 <sourceFolder url="file://$MODULE_DIR$/src/preview/java" isTestSource="false" />
 <sourceFolder url="file://$MODULE_DIR$/src/preview/res" type="java-resource" />

它似乎工作正常。

...直到我与我的 gradle 文件同步 - 这将删除上述行。

这是 gradle 插件中的错误,还是我做错了什么?

【问题讨论】:

  • 我希望你明白,你不应该编辑 *.iml 文件,因为它是从 Gradle 生成的。项目是否从命令行正确构建?如果不是这样,导入可能会失败并且项目模型不会更新。顺便说一下,我不确定你是否真的需要 'initWith' 行。
  • 我刚刚编辑了iml文件,看看是不是这个原因。所以我的结论是它没有正确生成。
  • 该项目从命令行和 Studio 编译 - 它只是将文件夹显示为 sourceFolders - 这实际上使工作变得非常困难
  • 好吧,很公平,构建类型是否显示在构建变体列表中?,我实际上认为下面 Ladios 的答案就是您要寻找的,只有一种构建类型会在IDE。
  • 任何正在寻找 android studio 风格演示的人

标签: android gradle android-studio


【解决方案1】:

您必须在构建变体列表中切换它,然后 AS 将选择适当的源集。

【讨论】:

  • 我仍然希望未来 AS 能够看到不同变体的来源 - 如果我需要对不同变体进行小改动,我必须手动切换,这有点烦人
  • 同意,每个构建变体都应该被识别并立即显示出来,这非常令人困惑!
  • 即使做了这一切,它对我也不起作用。在我包含在 2 个自定义风格中的 common src 包中导入类时遇到问题。项目在 Android Studio 编辑器中成功编译,由于导入问题,我看到错误。
  • @Ladios Jonquil。上帝祝福你。而且我不信教,所以这意味着更多
【解决方案2】:

首先,尝试重新导入项目。删除所有构建目录、.iml 文件和.idea 文件夹。然后导入项目。

如果这不起作用,那么您可以尝试“强制执行”。 Checkout this response from Bernd Bergler. 请注意,这是一个 hack,理想情况下没有必要

这是他的代码稍作修改的版本。

task addPreview {
    def src = ['src/preview/java']
    def file = file("app.iml")

    doLast {
        try {
            def parsedXml = (new XmlParser()).parse(file)
            def node = parsedXml.component[1].content[0]
            src.each {
                def path = 'file://$MODULE_DIR$/' + "${it}"
                def set = node.find { it.@url == path }
                if (set == null) {
                    new Node(node, 'sourceFolder', ['url': 'file://$MODULE_DIR$/' + "${it}", 'isTestSource': "false"])
                    def writer = new StringWriter()
                    new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml)
                    file.text = writer.toString()
                }
            }
        } catch (FileNotFoundException e) {
            // nop, iml not found
        }
    }
}

// always do the addPreview on prebuild
gradle.projectsEvaluated {
    preBuild.dependsOn(addPreview)
}

只需将其放在build.gradle 文件中android 部分之外。 Description from this source:

Android Studio 自动从 gradle 生成 .iml 项目文件 构建文件。此任务编辑 Android Studio 项目文件 app.iml 并添加测试目录。每当 Android 时,更改都会丢失 Studio 重新扫描 gradle 文件,但之后立即运行构建 任务与此挂钩,所以一切都很好。这个版本有一个 一些调整,例如将新任务添加到正常构建中 循环有点不同,并优雅地处理没有 .iml 文件。

这在一定程度上对我有用:IDE 现在将其识别为 src 树,但不想将其与任何其他 src 树链接。

【讨论】:

  • ...这基本上归结为破解 *.iml 文件,这是一种严重的破解。
  • 不反对你。
  • 太棒了 :) 现在让我们祈祷一下,这不会被接受或反对。
  • 好吧,我不是要争吵,但它是解决一个实际上并不存在的问题的方法。在 AS 中,您可以根据构建类型选择源文件夹。不同的构建类型/风格有效地意味着不同的代码。因此,将活动构建类型之外的其他文件夹添加到 IDE 类路径是没有意义的。如果您确实需要将自定义代码添加到构建路径,“正确”的方法是通过 Android Gradle 插件提供的扩展点。
  • 我看到这个问题的次数越多,我就越相信我很快就会发布这个答案。它现在解决了一个非常具体的问题,这个问题与我想要回答的问题略有不同。
【解决方案3】:

在我的情况下,只有 File -> Invalidate Caches / Restart 对我有帮助,所以如果上述解决方案对您不起作用 - 试试这个。

【讨论】:

    【解决方案4】:

    将此添加到模块的 build.gradle 文件中:

    sourceSets {
        main.java.srcDirs += 'src/preview/java'
        main.java.srcDirs += 'src/release/java'
    }
    

    【讨论】:

    • 我试过这个 - 它确实将两者都添加到源代码树中,一旦我在 build.gradle 文件的“android”组下添加了 sourceSets 组。但是,我的项目在两种构建风格中都有 Foo.java,所以这个技巧最终没有奏效,因为编译器抱怨两个具有相同名称的源文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多