在使用Gradle构建Android项目时,出现“找不到android()方法”的错误。

31

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

文件系统结构如下:

Root
 |- App1/
 |- App2/
 |- Lib1/
 |- Lib2/
 |- build.gradle
 |- settings.gradle

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

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

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

运行gradle返回以下结果:

出错了: 在根项目“android”中评估时出现问题。 找不到方法 android(),在根项目“android”上的参数[build_7dngpra6ldok366maq0on77r7e_run_closure3_closure5@43d95624]。

我搜索了类似的帖子,有人建议在每个子项目中添加一行apply plugin: 'android'以公开Gradle抱怨缺失的android()方法。 但是,该解决方案对我无效,因为它会将该行添加到库项目中,这需要使用apply plugin:'android-library'代替。

当您在同一个项目中使用应用程序和库时,是否有一种方法可以在subprojects {}中使用android {}呢?

4个回答

32

这实际上是由于android-gradle插件的结构限制,但在android工具网站上有一种解决方法。

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

提出的解决方案是:

...in the root project's build.gradle:

ext {
  compileSdkVersion = 19
  buildToolsVersion = "19.0.1"
}

in all the android modules:

android {
  compileSdkVersion rootProject.ext.compileSdkVersion
  buildToolsVersion rootProject.ext.buildToolsVersion
}

...

我注意到的一件事是,这在旧版本的Gradle上不起作用(我尝试使用1.10并出现了错误)。但是在Gradle 2.1上似乎可以正常工作。

1
我在gradle中进行了更改,但仍然收到相同的错误。 - AdiAtAnd
对我有用,确保您编辑正确的build.gradle文件(有两个,请检查文件夹)。 - vaskort

2
您IP地址为146.190.162.183,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。
subprojects {
  ext{
     <android_compile_sdk_key> = <sdk_value>
     <android_build_key> = <build_value>
  }
}

在每个子模块中,您只需按照他之前提到的内容进行操作即可。
android {
  compileSdkVersion <android_compile_sdk_key>
  buildToolsVersion <android_build_key>
}

您可以在以下链接中找到有关Gradle多项目构建的文档: https://docs.gradle.org/current/userguide/multi_project_builds.html#sub:adding_specific_behavior

1

所以你决定升级Gradle

然后一切都崩溃了,和往常一样...

对于Gradle 7,请在你的build.gradle (:app)文件顶部添加这个小段落:

plugins {
    id 'com.android.application'
}

0

你可以使用 afterEvaluate

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接