如何在实验 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 仍然试图编译这个文件。
我尝试了excludes
、exclude
和=
、+=
,但什么都没有,但排列无效。
【问题讨论】:
有gradle-experimental:0.3.0
,exclude
语法可用,见***.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 而不是 excludes 和 srcDir 而不是 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 文件中排除依赖项?