2014-10-07 88 views
29

我有一个带有4个子模块的基于gradle的Android项目 - 两个库和两个应用程序。我试图通过将一些共享代码/配置移动到最高级别的build.gradle文件来简化每个子模块的build.gradle文件,并使用subprojects {}使该代码可用于每个子模块。从gradle构建Android项目时无法找到用于参数的方法android()

的文件系统结构如下所示:

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]。

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

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

回答

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

我在gradle中做了这个修改,但我得到的 – AdiAtAnd 2016-10-07 01:31:22

+0

仍然适用于我,确保你编辑了正确的build.gradle文件(有2个,检查文件夹) – vaskort 2016-11-13 22:04:12

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

相关问题