我正在使用标准的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插件中的错误,还是我做错了什么?
答案 0 :(得分:125)
您必须在构建变体列表中切换它,然后AS将选择适当的源集。
答案 1 :(得分:3)
首先,尝试重新导入项目。删除所有构建目录,.iml
文件和.idea
文件夹。然后导入项目。
如果这不起作用,那么你可以试试这个“强迫它”。 Checkout this response from Bernd Bergler. 请注意,这是一个黑客攻击,理想情况下不是必需的
这是他的代码的略微修改版本。
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树链接。
答案 2 :(得分:2)
仅在我的情况下文件 - &gt;无效的缓存/重启帮助了我,所以如果上面的解决方案不适合你 - 试试这个。
答案 3 :(得分:1)
将其添加到模块的build.gradle文件中:
sourceSets {
main.java.srcDirs += 'src/preview/java'
main.java.srcDirs += 'src/release/java'
}