Не удалось найти метод android() для аргументов при создании проекта Android из gradle
У меня есть проект Android с gradle с четырьмя подмодулями - две библиотеки и два приложения. Я пытался упростить файлы build.gradle каждого подмодуля, переместив некоторые из общих кодов/конфигураций в файл build.gradle верхнего уровня и используя subprojects {}
, чтобы сделать этот код доступным для каждого подмодуля.
Структура файловой системы выглядит следующим образом:
Root
|- App1/
|- App2/
|- Lib1/
|- Lib2/
|- build.gradle
|- settings.gradle
Проблема заключается в том, что если я добавлю раздел android {}
в подпроекты, то gradle выполняются задачи. Например, это мой файл build.gradle верхнего уровня:
subprojects { project ->
android {
buildToolsVersion "20.0.0"
}
}
Запуск gradle возвращает это:
Что пошло не так: Возникла проблема оценки корневого проекта "андроид". Не удалось найти метод android() для аргументов [build_7dngpra6ldok366maq0on77r7e $_run_closure3_closure5 @43d95624] в корневом проекте 'android'.
Я искал похожие сообщения, и некоторые люди предлагают добавить строку apply plugin: 'android'
в каждый подпроект, чтобы разоблачить отсутствующий метод android()
, о котором жалуется gradle. Однако это решение не работает для меня, потому что оно эффективно добавит этот проект в библиотеку, для которого вместо этого требуется apply plugin: 'android-library'
.
Есть ли способ использовать android {}
внутри subprojects {}
, когда у вас есть приложения и библиотеки в одном проекте?
Ответы
Ответ 1
Это на самом деле ограничение на то, что плагин android- gradle структурирован, и есть обходное решение, описанное на веб-сайте инструментов Android.
Если у вас много Android-модулей, вы можете избежать ручной установки одинаковых значений во всех них. Поскольку у вас, вероятно, есть проект андроида и андроида-библиотеки, вы не можете применять эти плагины через закрытие подпроектов.
Предлагаемое решение:
... в корневом проекте build.gradle:
ext {
compileSdkVersion = 19
buildToolsVersion = "19.0.1"
}
во всех модулях android:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}
...
Думаю, я заметил, что это не работает в более старых версиях gradle (я пытался с 1.10 и получил ошибку). С gradle 2.1 это, кажется, работает правильно, хотя.
Ответ 2
Там одна незначительная проблема с user4118620 отвечает... хотя бы на Gradle 2.10, когда я ее использовал.
Для того, чтобы ключ был видимым для модулей Android. Нам нужно разместить ext в области подпроекта
В корневом файле Gradle вам необходимо добавить следующие
subprojects {
ext{
<android_compile_sdk_key> = <sdk_value>
<android_build_key> = <build_value>
}
}
В каждом из подмодулей вы просто следуете тому, что он упоминал ранее
android {
compileSdkVersion <android_compile_sdk_key>
buildToolsVersion <android_build_key>
}
Вы можете найти документы о Gradle multibuild по следующей ссылке
https://docs.gradle.org/current/userguide/multi_project_builds.html#sub:adding_specific_behavior