Как внедрить конфигурацию Android в каждый подпроект с помощью Gradle?

Вместо дублирования блока конфигурации Android в каждом из подпроектов:

android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersion 9 targetSdkVersion 14 } } 

Я бы скорее поставил это в файл сборки верхнего уровня / корневого градиента, например:

 subprojects{ android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersion 9 targetSdkVersion 14 } } } 

Однако это не работает. 🙁

Ошибка: ".. Не удалось найти метод android () для аргументов …"

Решение этого оказалось:

 subprojects{ afterEvaluate { android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersion 9 targetSdkVersion 14 } } } } 

Насколько мне известно, это связано с тем, что для обработки / использования андроида {…} во время оценки означает, что он должен присутствовать (т. Е. Явно написан или включен как часть «применить плагин»), как только он попадает Подпроекты в файле корневой сборки. И, что более точно, это означает, что проект верхнего уровня должен быть определен (что, вероятно, не потому, что это может быть не сама «андроида» или «сборка андроидов»). Однако, если мы отталкиваем его после оценки, то он может использовать то, что доступно в каждом подпроекте напрямую.

Этот вопрос + решение также предполагает, что все подпроекты представляют собой некоторую форму проекта андроида (в моем случае это верно, но не обязательно для других). Более безопасным ответом будет использование:

 subprojects{ afterEvaluate { if(it.hasProperty('android')){ android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersion 9 targetSdkVersion 14 } } } } }