【问题标题】:How to exclude a cpp file in experimental gradle?如何在实验 gradle 中排除 cpp 文件?
【发布时间】: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=+=,但什么都没有,但排列无效。

【问题讨论】:

标签: android c++ android-studio gradle android-ndk


【解决方案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 中所定义的那样。

        【讨论】:

        • 这个答案与问题无关
        猜你喜欢
        • 1970-01-01
        • 2018-12-04
        • 2019-06-19
        • 2012-12-08
        • 2018-01-04
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多