如何在实验 gradle 中排除 cpp 文件?

Posted

技术标签:

【中文标题】如何在实验 gradle 中排除 cpp 文件?【英文标题】:How to exclude a cpp file in experimental gradle? 【发布时间】:2015-11-26 16:58:03 【问题描述】:

我正在尝试使用 android Studio 1.3.1 使用实验性 gradle 语法编译 NDK 项目。

我的build.gradle 看起来很像Teapot example 中的那个

除了我的源代码树有一些我不想包含在构建中的文件之外。 我无法删除这些文件,所以我需要 gradle 来忽略它们。

我尝试添加 exclude 定义:

android.sources 
    main 
        jni 
            source 
                srcDirs 'src/main/jni'

                excludes += "src/main/jni/FileToExclude.cpp"
            
        

    

但这并不影响结果。 gradle 仍然试图编译这个文件。

我尝试了excludesexclude=+=,但什么都没有,但排列无效。

【问题讨论】:

gradle-experimental:0.3.0exclude语法可用,见***.com/questions/32636150/… 【参考方案1】:

根据我的发现,从构建中排除文件的正确指令是 exclude,而不是 excludes。检查您的 build.gradle 以确保您没有在此处犯错(您在提供的示例中使用了 excludes)。

更新:好的,经过一番研究,我在 AOSP 问题跟踪器上找到了this thread。主题启动器如下:

源集的 java/resources 组件允许包含/排除模式。

我们应该为aidl/rs/jni/assets 这样做。

这个问题仍然存在,所以我认为这个功能必须在 Android Gradle 插件或 Android Studio 或两者中实现(并且尚未实现)。它将在 Android Studio 1.5 中实现,至少标签是这么说的。

【讨论】:

@shoosh 似乎尚未实现,请参阅更新后的答案。 看来你倒霉了。除非您想构建自己的 gradle 插件,否则最好的选择是通过 ndk-build 使用 Android.mk。【参考方案2】:

我认为您以错误的方式提供文件路径。 应该是:

srcDir 'src/main/jni'

排除'FileToExclude.cpp'

您可以点击此链接。 https://discuss.gradle.org/t/how-can-i-exclude-certain-java-files-from-being-compiled/5287/2

另外请注意,您应该使用 exclude 而不是 excludessrcDir 而不是 srcDirs

【讨论】:

【参考方案3】:

我查看了 android 源代码,看来您可以更新过滤器以排除您的文件。我不知道你使用的是什么版本的 gradle 插件,所以我无法确定底层的 api 是什么。您可以尝试手动设置 PatternFilterable 以排除该文件。

android.sources 
    main 
        jni 
            source 
                srcDirs 'src/main/jni'
                getFilter().exclude('**/FileToExclude.cpp')
            
        
    

我查看了Gradle Code Review,发现正在使用 LanguageSourceSet。查看LanguageSourceSet 的Gradle 文档,您可以访问SourceDirectorySet,其中有一个PatternFilterable,您可以设置排除项。

【讨论】:

【参考方案4】:

由于它仍处于试验阶段,因此有关 Gradle Experimental 的文档并不多。但是通过一些实验,我能够挖掘出一种排除某些文件的方法,即:

model 
    //...

    android.sources 
        //...

        jni 
            //...

            source 
                excludes.add("<FILE PATH>") // You can have multiple excludes.add(...)
            
        
    

注意:该解决方案适用于 gradle-experimental 0.7.0

【讨论】:

【参考方案5】:

最简单的方法是在build.gradle中设置属性:

sourceSets.main.jni.srcDirs = [] // now, AS will not try to compile your source files
sourceSets.main.jniLibs.srcDirs = ['libs'] // now, AS will pick up the compiled SO files from libs (where ndk-build will normally put them)

您还可以定义一个“buildNative”任务,将 ndk-build 作为 compileTask 的一部分运行,正如 answer 中所定义的那样。

【讨论】:

这个答案与问题无关

以上是关于如何在实验 gradle 中排除 cpp 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gradle 构建文件中正确排除“junit-vintage-engine”?

在 Android Gradle 构建中,如何从包含的 jar 文件中排除依赖项?

从 Gradle 中的 FileTree 中排除文件

使用 Gradle 从 jar 中排除文件

Android apk - 如何使用 gradle 从 3rd 方依赖项中排除 .so 文件

请教 如何运行含多个cpp的一个c++项目里面的一个cpp