如何在实验性Gradle中排除一个cpp文件?

22

我正在尝试使用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.0,可以使用 exclude 语法,请参见 https://dev59.com/k4_ea4cB1Zd3GeqPLTi7#32640823。 - Alex Cohn
5个回答

10

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

更新:好的,在进行一些研究后,我在 AOSP 问题跟踪器上找到了这个线程。话题发起人说:

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

我们应该为 aidl/rs/jni/assets 执行此操作。

该问题仍未解决,因此我认为这个功能必须在 Android Gradle 插件或 Android Studio 中实现,或者两者都要实现(目前还没有实现)。至少标签显示它将在 Android Studio 1.5 中实现。


1
@shoosh 看起来它还没有被实现,可以查看更新的答案。 - aga
2
看起来你运气不太好。除非你想自己构建Gradle插件,否则你最好的选择是使用Android.mk通过ndk-build。 - Alex Cohn

2

0

由于Gradle Experimental仍处于实验阶段,因此文档不是很完善。但是通过一些实验,我找到了一种排除某些文件的方法,即:

model {
    //...

    android.sources {
        //...

        jni {
            //...

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

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

0

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

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

我看了一下Gradle代码审查,发现使用了LanguageSourceSet。查看Gradle文档中的LanguageSourceSet,您可以访问一个SourceDirectorySet,该目录集合具有PatternFilterable,您可以在其中设置排除。


-1
最简单的方法是在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,如 answer 中所定义的。


这个回答与问题无关。 - rockeye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接