Как исключить файл cpp в экспериментальном gradle?
Я пытаюсь использовать Android Studio 1.3.1 для компиляции проекта NDK с использованием экспериментального синтаксиса gradle.
Мой build.gradle
очень похож на тот, который представлен в примере чайника
За исключением того, что в моем исходном дереве есть файлы, которые я не хочу включать в сборку. Я не могу удалить эти файлы, поэтому мне нужно gradle игнорировать их.
Я попытался добавить определение exclude
:
android.sources {
main {
jni {
source {
srcDirs 'src/main/jni'
excludes += "src/main/jni/FileToExclude.cpp"
}
}
}
}
, но это не повлияло на результат. gradle все еще пытается скомпилировать этот файл.
Я пробовал excludes
, exclude
с помощью =
, +=
и ничего не имел, но перестановка не работает.
Ответы
Ответ 1
Из того, что я нашел, правильная директива об исключении файла из сборки исключить, а не исключает. Проверьте свой build.gradle, чтобы убедиться, что вы не допустили ошибку здесь (вы использовали исключает в предоставленном образце).
Обновление: ОК, после некоторого исследования я нашел этот поток в трекере проблемы AOSP. Начальник темы говорит следующее:
Компоненты java/resources в наборах источников позволяют включать/исключать шаблоны.
Мы должны сделать это для aidl/rs/jni/assets.
Проблема все еще открыта, поэтому я предполагаю, что эта функциональность должна быть реализована в плагине Android Gradle или в Android Studio или в обоих из них (и еще не реализована). Он будет реализован в Android Studio 1.5, по крайней мере, это то, что говорят теги.
Ответ 2
Я думаю, что вы неправильно указываете путь к файлу.
Это должно быть:
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.
>
Ответ 3
Я посмотрел в источник Android, похоже, что вы можете обновить фильтр, чтобы исключить ваш файл. Я не знаю, какую версию плагина gradle вы используете, поэтому я не могу быть уверен, что такое базовый api. Вы можете попробовать установить PatternFilterable вручную, чтобы исключить файл.
android.sources {
main {
jni {
source {
srcDirs 'src/main/jni'
getFilter().exclude('**/FileToExclude.cpp')
}
}
}
}
Я просмотрел Gradle Обзор кода и увидел, что используется LanguageSourceSet. Глядя на документацию gradle для LanguageSourceSet, к которой вы можете получить доступ 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.