从gradle构建Android项目时,找不到参数的方法android()

Mik*_*ren 29 android gradle android-gradle-plugin

我有一个基于gradle的Android项目,包含4个子模块 - 两个库和两个应用程序.我试图通过将一些共享代码/配置移动到顶级build.gradle文件来简化每个子模块的build.gradle文件,并用于subprojects {}使每个子模块都可以使用该代码.

文件系统结构如下所示:

Root
 |- App1/
 |- App2/
 |- Lib1/
 |- Lib2/
 |- build.gradle
 |- settings.gradle
Run Code Online (Sandbox Code Playgroud)

问题是,如果我android {}向子项目添加一个部分,那么gradle任务就会失败.例如,这是我的顶级build.gradle文件:

subprojects { project ->
  android {
    buildToolsVersion "20.0.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

运行gradle返回:

出了什么问题:评估根项目'android'时出现问题.无法在根项目'android'上找到参数[build_7dngpra6ldok366maq0on77r7e $ _run_closure3_closure5 @ 43d95624]的方法android().

我搜索了类似的帖子,有些人建议在apply plugin: 'android'每个子项目中添加该行,以揭示android()gradle抱怨的缺失方法.但是,该解决方案对我不起作用,因为它会有效地将该行添加到库项目中,而这需要apply plugin: 'android-library'相反.

当你在同一个项目中有应用程序和库时,有没有办法在android {}里面使用subprojects {}

小智 31

这实际上是对android-gradle插件结构方式的限制,并且在android工具网站上有一个解决方法.

如果你有很多Android模块,你可能想避免在所有模块中手动设置相同的值.因为您可能混合了android和android-library项目,所以不能通过子项目闭包来应用这些插件.

建议的解决方案是:

...在根项目的build.gradle中:

ext {
  compileSdkVersion = 19
  buildToolsVersion = "19.0.1"
}
Run Code Online (Sandbox Code Playgroud)

在所有的android模块中:

android {
  compileSdkVersion rootProject.ext.compileSdkVersion
  buildToolsVersion rootProject.ext.buildToolsVersion
}
Run Code Online (Sandbox Code Playgroud)

...

有人认为我注意到这不适用于旧版本的gradle(我尝试使用1.10并收到错误).使用Gradle 2.1,这似乎可以正常工作.