【问题标题】:How to exclude certain files from Android Studio gradle builds?如何从 Android Studio gradle 构建中排除某些文件?
【发布时间】:2017-06-13 11:44:30
【问题描述】:

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

为了弄清楚如何排除文件,我在目录\app\src\main\res\values\app\src\main\java\com\hfad\stopwatch\ 中创建了名为“excludeme.txt”的文件。我尝试对项目中的两个build.gradle 文件进行各种修改,但未成功。没有成功排除文件。

具体来说,我对Module: appbuild.gradle 文件进行了以下修改,每个this question

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 部分,每个 this question

aaptOptions {
    ignoreAssetsPattern "!excludeme.txt"
}

我还补充了:

sourceSets {
    main {
        java {
            srcDir "src"                [I also tried w/o this line]
            exclude "**/excludeme.txt"
        }
    }
}

当我选择触发构建的Build > Clean Project 时,我得到了这个输出,这表明资源文件夹中的文件没有被忽略:

Information:Gradle tasks [clean, :app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources]
C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Stopwatch\app\src\main\res\values\excludeme.txt
Error:(1, 1) Error: Premature end of file.
Error:Execution failed for task ':app:mergeDebugResources'.
> C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Stopwatch\app\src\main\res\values\excludeme.txt:1:1: Error: Premature end of file.

如果我去掉感叹号,结果是一样的:

aaptOptions {
    ignoreAssetsPattern "!excludeme.txt"
}

如何正确指示 gradle 在构建 Android 项目时忽略包含特定模式的文件?

更新 1

根据下面 Stefan 的建议,我将以下内容添加到 build.gradle 文件中,用于 Module: app

android {
    [omitted]
    sourceSets.main.res.exclude '**/whatever.txt'
}

我在res/layout 目录中添加了一个名为whatever.txt 的文件,构建失败:

Error:Execution failed for task ':app:mergeDebugResources'.
> C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Starbuzz\app\src\main\res\layout\whatever.txt: Error: The file name must end with .xml

更新 2

根据 Nathan 的建议,我补充说:

packagingOptions {
    exclude '**/whatever.txt'
    exclude 'src/main/res/layout/whatever.txt'
}

android 部分中的build.gradle (Module: app)。没有改善:

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 上。)

【问题讨论】:

  • file trees 上的 Gradle 文档可能会有所帮助。是否有理由在构建的依赖项部分编译 fileTree?如果您要从构建资源中排除文件,请使用 sourceSet 块。
  • 谢谢。我在任何build.gradle 文件中都没有看到sourceSet 块。我会看看你引用的文档。
  • 如果在尝试使用sourceSet 之后遇到问题,请更新您的答案,我会看看是否可以提供帮助:)
  • 我尝试添加sourceSets,如上所述。这些错误似乎都与资源文件有关。我不确定是否需要从 src 目录中排除非 *.java 文件;它们可能会被自动忽略。
  • @EllenSpertus 我想通了。请参阅下面的答案

标签: android-studio gradle android-gradle-plugin build.gradle


【解决方案1】:

Android 插件有自己的 SourceSet 概念:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure

所以你可能想要做类似的事情

android {
    sourceSets.main.res.exclude '**/whatever.txt'
}

【讨论】:

  • 谢谢,但没用。当我尝试将它放入应用程序的 build.gradle 文件时,我遇到了同样的错误。
【解决方案2】:

在子项目中,我认为是:APP,将以下内容添加到build.gradle 文件中。

packagingOptions {
    //Exclude the file(s) in this method. Provide the path and file name.    
    exclude 'src\main\res\layout\whatever.txt' 
}

PackagingOptions DSL object 允许您控制APK 中包含的文件。 exclude 将字符串或模式作为参数,允许您按名称或模式忽略文件或目录。

编辑 自定义从Android Studio docs 保留哪些资源。

  1. 在您的项目中创建带有<resources> 标记的XML 文件。
  2. 添加tools:keep="[list resources]"
  3. 添加`tools:discard="[列出资源]"
  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" />

【讨论】:

  • 谢谢。将午餐推迟到赏金到期前进行测试。 :-)
  • whatever.txt 更改为 whatever.xml。由于它位于 layouts 文件夹中,Android 可能需要一个 .xml 文件。多项目构建的构建过程可能会有点令人困惑,因为要跟踪首先执行的任务而不明确地对每个任务进行排序。更改扩展程序后,请查看收到的错误消息。
  • 谢谢。我做了建议的改变。我现在在解析任何.xml 的 XML 时遇到错误,所以它仍然没有被排除在外。
  • 布局目录中的每个文件都必须遵循:“定义用户界面布局的 XML 文件。”尽量排除实际的问题文件,去掉引入的文件。
【解决方案3】:

看起来最近 gradle 的变化改变了 sourceSets 的 DSL,所以你现在需要在过滤字段上指定排除:

android {
    sourceSets.main.res.filter.exclude '**/whatever.txt'
}

【讨论】:

  • 谢谢。这对我在 Android Studio 中使用 Gradle 3.3 不起作用。我没有收到错误,但它不排除文件。您使用的是什么版本的 Gradle?
  • Gradle 3.3,带有 Android 插件 2.3.0。我忘记提及的一件事是,Android Studio仍然在项目视图中显示文件。但是,在编译时,文件将被排除/忽略。这并没有让解决这个问题变得更容易;)
  • 我在更新 1 中试过这个。它仍然不起作用。我在app:mergeDebugResources 遇到同样的错误。
  • 可能是一个错误。如果您查看绝对应该支持的文档 (google.github.io/android-gradle-dsl/current/…)。
【解决方案4】:

在用头撞键盘后,这对我有用:

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'
            }
          }
        } 
     }         

注意归功于: How to get current flavor in gradle 用于编写 getCurrentFlavor 方法,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多