Как исключить файл cpp в экспериментальной градации?

Я пытаюсь использовать Android Studio 1.3.1 для компиляции проекта NDK с использованием экспериментального синтаксиса gradle.

Мой build.gradle очень похож на тот, который build.gradle в примере с чайником

За исключением того, что в моем исходном дереве есть файлы, которые я не хочу включать в сборку. Я не могу удалить эти файлы, поэтому мне нужно, чтобы они игнорировали их.

Я попытался добавить определение exclude :

 android.sources { main { jni { source { srcDirs 'src/main/jni' excludes += "src/main/jni/FileToExclude.cpp" } } } } 

Но это не повлияло на результат . Gradle по-прежнему пытается скомпилировать этот файл.

Я попробовал excludes , exclude с = , += и ничего не делать, но никаких перестановок не работает.

Из того, что я нашел, правильная директива об исключении файла из сборки исключается , а не исключает . Проверьте свой build.gradle, чтобы убедиться, что вы здесь не ошиблись (вы использовали исключение в предоставленном образце).

Обновление: хорошо, после некоторых исследований я нашел эту тему в трекере AOSP. Тема стартер говорит следующее:

Компоненты java / resources в наборах источников позволяют включать / исключать шаблоны.

Мы должны сделать это для aidl / rs / jni / assets.

Проблема все еще открыта, поэтому я предполагаю, что эта функциональность должна быть реализована в плагине Android Gradle или в Android Studio или в обоих из них (и еще не реализована). Он будет реализован в Android Studio 1.5, по крайней мере, это то, что говорят теги.

Я думаю, что вы неправильно указываете путь файла. Должен быть:

SrcDir 'src / main / jni'

Исключить 'FileToExclude.cpp'

Вы можете перейти по этой ссылке. https://discuss.gradle.org/t/how-can-i-exclude-certain-java-files-from-being-compiled/5287/2

Также обратите внимание, что вместо исключений следует использовать исключение и srcDir вместо srcDirs .

Я посмотрел в источник Android, похоже, что вы можете обновить фильтр, чтобы исключить ваш файл. Я не знаю, какую версию плагина gradle вы используете, поэтому я не могу быть уверен, что такое базовый api. Вы можете попытаться установить PatternFilterable вручную, чтобы исключить файл.

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

Я просмотрел обзор кодов Gradle и увидел, что используется LanguageSourceSet. Глядя на документацию Gradle для LanguageSourceSet , к которой вы можете обратиться к SourceDirectorySet , который имеет PatternFilterable, на который вы можете установить исключение.

Поскольку это еще экспериментально, на Gradle Experimental нет большой документации. Но с некоторыми экспериментами я смог проложить путь к тому, как исключить некоторые файлы, то есть:

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

Примечание: решение работает на gradle-experimental 0.7.0

Самый простой способ – установить свойства в 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, как определено в этом ответе .