Android Studio无法识别源文件夹


70

我使用标准的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无法识别所有源文件夹。仅将main和下方的文件夹debug标记为源文件夹,将preview和下方的文件夹标记为release普通文件夹实际上,这些文件夹中没有错误检查

在此处输入图片说明

我检查了.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插件中的错误,还是我做错了什么?


1
希望您能理解,不要编辑* .iml文件,因为它是从Gradle生成的。项目是否从命令行正确构建?如果不这样做,则导入可能会失败,并且项目模型将不会更新。我不确定您是否真的需要'initWith'行。
botteaap 2014年

我只是编辑了iml文件,看这是否是原因。所以我的结论是它生成不正确。
imbryk 2014年

该项目从命令行和Studio进行编译-它只是将文件夹显示为sourceFolders-这实际上使工作变得非常困难
imbryk 2014年

好了,很公平,构建类型是否显示在构建变体列表中?,我实际上认为,下面的Ladios答案就是您要查找的内容,IDE中仅激活一种构建类型。
botteaap 2014年

谁在寻找android studio风味演示
nitesh,2015年

Answers:


132

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


13
我仍然希望将来的AS能够看到不同版本的资源-有点烦人的是,如果我需要对不同版本进行小的更改,则必须手动切换
imbryk 2014年

2
同意,每个构建变量都应该被识别并立即显示出来,这非常令人困惑!
Blacklight

1
即使做了所有这些,它对我也不起作用。我在将通用的src包中的类导入到2种自定义样式中时遇到了麻烦。Project仅在Android Studio编辑器中成功编译,由于导入问题,我看到了错误。
Himanshu Virmani 2015年

@Ladios Jonquil。上帝祝福你。而且我不信教,所以意思更多
Nativ

3

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

如果那不起作用,那么您可以尝试使用它来“强制”它。 查看来自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.gradleandroid部分之外的文件中即可。 此来源的说明

Android Studio从gradle构建文件自动生成.iml项目文件。此任务将编辑Android Studio项目文件app.iml并添加测试目录。每当Android Studio重新扫描gradle文件时,所做的更改都会丢失,但是此后它立即运行构建并将任务挂接到该构建中,因此一切都很好。此版本有一些调整,例如将新任务添加到正常构建周期中有所不同,并优雅地处理缺少.iml文件的情况。

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


...基本上可以归结为入侵* .iml文件,这是一个严重的入侵。
botteaap 2014年

1
不反对你。
Sababado 2014年

太好了:)现在,让我们交叉手指,这将不会被接受或反对。
botteaap 2014年

好吧,我不是故意要争吵,但这是一个不存在的问题的解决方案。在AS中,根据构建类型选择源文件夹。不同的构建类型/风格实际上意味着不同的代码。因此,将除活动构建类型以外的其他文件夹添加到IDE类路径中没有任何意义。如果您确实需要在构建路径中添加自定义代码,则“正确”的方法是通过Android Gradle插件提供的扩展点。
botteaap 2014年

2
我越看这个问题,就越相信我会很快发布这个答案。目前,它解决了一个非常具体的问题,这个问题与我要回答的问题略有不同。
Sababado 2014年


1

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

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

1
我试了一下-一旦在build.gradle文件的“ android”组下添加了sourceSets组,它的确将两者都添加到了源树中。但是,我的项目在两个构建版本中都具有Foo.java,因此该技巧最终没有用,因为编译器抱怨两个同名的源文件。
gjgjgj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.