Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio 如何从Android Studio gradle版本中排除某些文件?_Android Studio_Gradle_Android Gradle Plugin_Build.gradle - Fatal编程技术网

Android studio 如何从Android Studio gradle版本中排除某些文件?

Android studio 如何从Android Studio gradle版本中排除某些文件?,android-studio,gradle,android-gradle-plugin,build.gradle,Android Studio,Gradle,Android Gradle Plugin,Build.gradle,我正在使用Android Studio和Google Drive,这会使隐藏的系统文件可见(如图标和桌面.ini),导致错误,如前所述。我希望指示gradle 2.14忽略这些文件,而不是运行脚本来删除这些文件 为了找出如何排除文件,我在目录\app\src\main\res\values和\app\src\main\java\com\hfad\stopwatch\中创建了名为“excludeme.txt”的文件。我尝试对项目中的两个build.gradle文件进行各种修改,但均未成功。无成功排

我正在使用Android Studio和Google Drive,这会使隐藏的系统文件可见(如
图标
桌面.ini
),导致错误,如前所述。我希望指示gradle 2.14忽略这些文件,而不是运行脚本来删除这些文件

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

具体来说,我对
模块:app
build.gradle
文件进行了以下修改,根据:

我还将其添加到同一
build.gradle
文件的
android
部分,根据:

我还补充说:

sourceSets {
    main {
        java {
            srcDir "src"                [I also tried w/o this line]
            exclude "**/excludeme.txt"
        }
    }
}
当我选择触发生成的
Build>cleanproject
时,我得到了这个输出,它表明resources文件夹中的文件没有被忽略:

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
文件中添加了以下内容:

android {
    [omitted]
    sourceSets.main.res.exclude '**/whatever.txt'
}
我在
res/layout
目录中添加了一个名为
whater.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

根据内森的建议,我补充道:

packagingOptions {
    exclude '**/whatever.txt'
    exclude 'src/main/res/layout/whatever.txt'
}
到android的
build.gradle(模块: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

(与Windows上的其他版本不同,上次的版本是在Mac上构建的。)

Android插件有自己的源集概念:

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

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 'src\main\res\layout\whatever.txt' 
}
允许您控制
APK
中包含的文件
exclude
将字符串或模式作为参数,允许您按名称或模式忽略文件或目录

编辑 自定义要从中保留的资源

  • 使用
    标记在项目中创建
    XML
    文件
  • 添加
    tools:keep=“[列出资源]”
  • 添加`tools:discard=“[list resources]”
  • 将文件保存在project resources中的
    res/raw/keep.xml
    生成将不包括此文件
  • 结束文件应与中的文件相似


    看起来gradle最近的一项更改更改了源集的DSL,因此您现在需要在过滤器字段中指定排除:

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

    在头重重地撞在键盘上之后,这对我起了作用:

    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'
                }
              }
            } 
         }         
    
    注意:贷记给:
    对于编写getCurrentFlavor方法,上的Gradle文档可能会有所帮助。是否有理由在构建的依赖项部分编译文件树?如果要从生成资源中排除文件,请使用块。谢谢。我在任何
    build.gradle
    文件中都没有看到
    sourceSet
    块。我将查看您引用的文档。如果在尝试使用
    sourceSet
    进行一些操作后遇到问题,请更新您的答案,我将看看是否可以提供帮助:)我尝试添加
    sourceSet
    ,如上所述。这些错误似乎都与资源文件有关。我不确定是否需要从src目录中排除非*.java文件;他们可能会自动被忽略。@EllenSpertus我想出来了。请看下面的答案,谢谢,但它不起作用。当我尝试将其放入应用程序的build.gradle文件时,我遇到了相同的错误。谢谢。在奖金到期前推迟午餐测试。:-)将
    whater.txt
    更改为
    whater.xml
    。由于它位于layouts文件夹中,Android可能需要一个.xml文件。多项目构建的构建过程可能会有点混乱,无法跟踪首先执行的任务,而不明确地对每个任务进行排序。更改扩展名后,请查看收到的错误消息。谢谢。我做了建议的改变。现在,我在解析whatever.XML的XML时遇到错误,因此它仍然没有被排除。布局目录中的每个文件都必须遵循“定义用户界面布局的XML文件”。请尝试排除实际问题文件并删除引入的文件。谢谢。这对我在Android Studio中使用Gradle 3.3不起作用。我没有得到一个错误,但它不排除文件。你使用的是什么版本的Gradle?Gradle 3.3,带有Android插件2.3.0。我忘了提到的一件事是,Android Studio仍将在项目视图中显示文件。但是,在编译时,这些文件将被排除/忽略。这并没有使解决这个问题变得更容易;)我在更新1中尝试了这个。它仍然不起作用。我在
    app:mergeDebugResources
    上遇到了相同的错误。可能是个bug。如果你看一下文档(),它肯定是受支持的。
    <?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" />
    
    android {
        sourceSets.main.res.filter.exclude '**/whatever.txt'
    }
    
    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'
                }
              }
            } 
         }