如何从Android Studio渐变版本中排除某些文件



我使用的是带有Google Drive的Android Studio,它使隐藏的系统文件(如Icondesktop.ini)可见,从而导致错误,如下所述。与其运行脚本来删除这些文件,我想指示gradle 2.14忽略它们。

为了弄清楚如何排除文件,我在目录appsrcmainresvaluesappsrcmainjavacomhfadstopwatch中创建了名为"excludeme.txt"的文件。我尝试对项目中的两个build.gradle文件进行各种修改,但都没有成功。无成功排除文件。

具体来说,根据这个问题,我对Module: appbuild.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: appbuild.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文档中保留的资源。

  1. 使用<resources>标记在项目中创建XML文件
  2. 添加tools:keep="[list resources]"
  3. 添加`tools:丢弃="[列出资源]">
  4. 将文件保存在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方法,

最新更新