Подтвердить что ты не робот

Не удалось найти метод 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 {}, когда у вас есть приложения и библиотеки в одном проекте?

4b9b3361

Ответ 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