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

时间:2014-10-07 19:13:46

标签: android gradle android-gradle

我有一个基于gradle的Android项目,包含4个子模块 - 两个库和两个应用程序。我试图通过将一些共享代码/配置移动到顶级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'时出现问题。   无法在根项目'android'上找到参数[build_7dngpra6ldok366maq0on77r7e $ _run_closure3_closure5 @ 43d95624]的方法android()。

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

当您在同一个项目中拥有应用和库时,有没有办法在android {}内使用subprojects {}

3 个答案:

答案 0 :(得分:31)

这实际上是对android-gradle插件结构方式的限制,并且the android tools website记录了一种解决方法。

  

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

建议的解决方案是:

  

...在根项目的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,这似乎可以正常工作。

答案 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

答案 2 :(得分:0)

您可以使用afterEvaluate

afterEvaluate {
        subprojects { project ->
            android {
                buildToolsVersion "20.0.0"
            }
        }
    }