我使用的是带有Google Drive的Android Studio,它使隐藏的系统文件(如Icon
和desktop.ini
)可见,从而导致错误,如下所述。与其运行脚本来删除这些文件,我想指示gradle 2.14忽略它们。
为了弄清楚如何排除文件,我在目录appsrcmainresvalues
和appsrcmainjavacomhfadstopwatch
中创建了名为"excludeme.txt"的文件。我尝试对项目中的两个build.gradle
文件进行各种修改,但都没有成功。无成功排除文件。
具体来说,根据这个问题,我对Module: app
的build.gradle
文件进行了以下修改:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'], excludes: ['**/excludeme.txt'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
}
根据这个问题,我还将其添加到同一build.gradle
文件的android
部分:
aaptOptions {
ignoreAssetsPattern "!excludeme.txt"
}
我还补充道:
sourceSets {
main {
java {
srcDir "src" [I also tried w/o this line]
exclude "**/excludeme.txt"
}
}
}
当我选择触发构建的Build > Clean Project
时,我得到了这个输出,这表明resources文件夹中的文件没有被忽略:
Information:Gradle tasks [clean, :app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources]
C:UsersEllenGoogleDriveEllen-CS115AndroidStudioProjectsStopwatchappsrcmainresvaluesexcludeme.txt
Error:(1, 1) Error: Premature end of file.
Error:Execution failed for task ':app:mergeDebugResources'.
> C:UsersEllenGoogleDriveEllen-CS115AndroidStudioProjectsStopwatchappsrcmainresvaluesexcludeme.txt:1:1: Error: Premature end of file.
如果我去掉感叹号,结果是一样的:
aaptOptions {
ignoreAssetsPattern "!excludeme.txt"
}
在构建Android项目时,我如何正确地指示gradle忽略包含特定模式的文件?
更新1
根据Stefan下面的建议,我在Module: app
的build.gradle
文件中添加了以下内容:
android {
[omitted]
sourceSets.main.res.exclude '**/whatever.txt'
}
我在res/layout
目录中添加了一个名为whatever.txt
的文件,构建失败,返回:
Error:Execution failed for task ':app:mergeDebugResources'.
> C:UsersEllenGoogleDriveEllen-CS115AndroidStudioProjectsStarbuzzappsrcmainreslayoutwhatever.txt: Error: The file name must end with .xml
更新2
根据Nathan的建议,我补充道:
packagingOptions {
exclude '**/whatever.txt'
exclude 'src/main/res/layout/whatever.txt'
}
到CCD_ 16部分中的CCD_。无改善:
Information:Gradle tasks [:app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources]
/Users/spertus/GoogleDrive/Ellen-CS115/AndroidStudioProjects/MacTest/app/src/main/res/layout/whatever.txt
Error:Error: The file name must end with .xml
Error:Execution failed for task ':app:mergeDebugResources'.
> /Users/spertus/GoogleDrive/Ellen-CS115/AndroidStudioProjects/MacTest/app/src/main/res/layout/whatever.txt: Error: The file name must end with .xml
Information:BUILD FAILED
(上一个版本是在Mac上构建的,与其他版本不同,后者是在Windows上构建的。)
看起来gradle最近的一次更改更改了sourceSets的DSL,所以您现在需要在filter字段中指定exclude:
android {
sourceSets.main.res.filter.exclude '**/whatever.txt'
}
Android插件有自己的SourceSets概念:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-配置结构
所以你可能会想做一些类似的事情
android {
sourceSets.main.res.exclude '**/whatever.txt'
}
在子项目中,在您的情况下,我认为它是:APP
,请将以下内容添加到build.gradle
文件中。
packagingOptions {
//Exclude the file(s) in this method. Provide the path and file name.
exclude 'srcmainreslayoutwhatever.txt'
}
PackagingOptions DSL对象允许您控制APK
中包含的文件。exclude
以字符串或模式作为参数,允许您按名称或模式忽略文件或目录。
编辑自定义要从Android Studio文档中保留的资源。
- 使用
<resources>
标记在项目中创建XML
文件 - 添加
tools:keep="[list resources]"
- 添加`tools:丢弃="[列出资源]">
- 将文件保存在
res/raw/keep.xml
的项目资源中。生成将不包括此文件
结束文件应该与Android Studio Docs 中的文件相似
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
tools:discard="@layout/unused2" />
经过多次敲击键盘,这对我来说很有效:
apply plugin: 'com.android.library'
def getCurrentFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if (tskReqStr.contains("assemble"))
pattern = Pattern.compile("assemble(\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\w+)(Release|Debug)")
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find())
return matcher.group(1).toLowerCase()
else {
println "NO MATCH FOUND"
return "";
}
}
android {
.
.
.
sourceSets {
main {
if (getCurrentFlavor() == 'stripped') {
java.exclude('**/excluded1.java',
.
.)
}
java {
srcDir 'main'
}
}
}
}
N.B.信用证:如何在gradle中获得当前风味用于编写getCurrentFlavor方法,