Я пытаюсь использовать 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, как определено в этом ответе .