在使用Gradle的IntelliJ Idea中未能解析com.google.android.gms:play-services。

85

我正在尝试将Google Play服务添加到我的libGDX项目中,使用IntelliJ Idea进行开发。我已经按照这里的设置指南进行操作:https://developers.google.com/android/guides/setup

看起来很简单。我只是在对应部分的build.gradle文件中添加了那些代码行,所以现在的情况看起来像:

project(":android") {
    apply plugin: "android"
    apply plugin: 'com.android.application'
    
    configurations { natives }
    
    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
        compile "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86"
        compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
        compile 'com.google.android.gms:play-services:11.2.0'
    }
}

然后我尝试在Idea中同步我的gradle项目,结果出现了“无法解析”的错误。

好吧,设置指南也说“确保每次更新Google Play服务时更新此版本号”,但问题是似乎很难找到该版本号:根据Android SDK管理器,我的Google Play Services SDK版本为“43”,到目前为止,我一直无法将这种“11.2.0”或其他典型的版本字符串与“43”版本号相对应。而设置指南并没有提及这方面的内容。

总之,我尝试了许多与此相关的问题,但都没有成功。特别要指出的是,我已经正确更新了我的Android SDK,并且确定它正在被Idea使用(我已经三重检查过了...):

Android SDK Manager Project Structure

我正在使用API级别26,但无论如何,其他定义都在使用相同的Android SDK目录。此外,在这台笔记本电脑上我没有安装任何其他android SDK,因此不存在Idea使用其他SDK的问题。

欢迎任何想法。


2
我看不到 apply plugin: 'com.google.gms.google-services' - Tim
我在“设置Google Play服务”指南中也没有看到它。那是从哪里来的? - Fran Marzoa
顺道提一下,将版本号换成11.0.0似乎解决了问题,但我还在这里进行一些测试,因此在确定之前不会发布它作为答案。 - Fran Marzoa
@Darush,这个包含了关于如何解决基于libGDX的项目问题的具体信息,无论是在问题还是答案中,而其他内容则没有。 - Fran Marzoa
1
@Darush,在libGDX项目中,build.gradle文件的结构与标准Android Studio项目中的不同。特别是我回答中提到的“allprojects”和“project(:android)”部分在后者中不存在,而在前者中放置这些内容是正确的位置。它还提供了其他一般信息,这些信息在其他答案中缺失(例如整个答案所基于的更改日志文档),因此尽管这两个解决方案都源自同一个问题,但我认为它们并不完全相同。 - Fran Marzoa
显示剩余3条评论
14个回答

226

在项目级别的build.gradle中,我将jcenter()放在google()之前时出现了问题。当我更改了顺序并将google()放在jcenter()之前时,问题消失了。

这是我的最终build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

1
它起作用了...但是为什么一开始会出现那个问题呢? - other Tall guy
1
@PaulMathew:如果我有这个问题/修复的解释,我会在帖子上发布。当我在尝试很多操作并与这个问题斗争时,我偶然发现了这个修复程序。 - Moussa
1
这是什么神奇的操作?运行得非常好。也许这两个仓库之间有问题...又有一个想知道解释的人。 - Pl4yeR
可能的原因之一是:它首先尝试在jcenter()上查找以下存储库,找到一个是私有的或由于任何其他原因而失败,并向您返回错误。然后,如果您将“google()”放在顶部,它首先在Google存储库上查找,只有在找不到任何内容时才转到jcenter。 - A. Kazarovets
我非常想念 Eclipse,自从使用 Android Studio 以来,似乎我花在“修复”Gradle上的时间和我编程的时间一样多。 - Martin Belcher - AtWrk

85

我刚刚用11.0.0版本替换了11.2.0版本,然后似乎一切正常,这必须意味着11.2.0没有包含在最新的Android SDK中。

因此,在经过所有可用的分散文档的努力后,我偶然找到了这个文档(我猜它在Google上的排名不够高):https://developers.google.com/android/guides/releases

我从那里引用:

来自 Google Play services 11.2 发布的亮点。现在可以通过 maven.google.com 获取Google Play服务依赖项。

现在,即使这并不一定意味着它们不再与已下载的SDK一起提供,事实上看起来确实是这种情况。

总之,将google()添加到我的build.gradle文件并没有奏效(未找到,未定义等),因此我使用了另一种方法,我在从前面那个文档引用的这个文档中找到了它:

https://developer.android.com/studio/build/dependencies.html#google-maven

我修改了我的build.gradle文件,将该行添加到allprojects/repositories中:

allprojects {
...
    repositories {
...
        maven { url "https://maven.google.com/"}
    }
}

然后同样在相同的 build.gradle 文件中的 Android 部分:

project(":android") {
...
    dependencies {
...
        compile 'com.google.android.gms:play-services-ads:11.2.0'
    }
}

这两行代码足以使Gradle同步无问题。除了默认添加在我的libGDX项目中的插件外,我不需要添加任何插件。

之后,我遇到了几个不同的错误,但没有关于Gradle或依赖项的错误。简而言之:

首先,我的minSdkVersion为8。通过将其提高到14来解决。我认为我可以不支持14以下的所有设备。

其次,我遇到了dex上限引用的问题。我以前从未遇到过这个问题,但也许你已经注意到我使用的解决方案:不是编译整个“com.google.android.gms:play-services”,而是只使用“com.google.android.gms:play-services-ads”,这是我现在真正感兴趣的API。对于那些其他特定情况,这样的解决方案可能并不有用,这篇文档可能提供更好的见解:https://developer.android.com/studio/build/multidex.html

第三,即使如此,我仍然遇到了这个“jumbo”问题,该问题在此处进行了描述和回答:https://dev59.com/jF8e5IYBdhLWcg3wF3SV#26248495

就目前而言,一切都构建成功了,我的游戏最终显示了那些Admob横幅。

我花了几个小时来解决这个问题,这让我想知道我们最近使用的所有这些构建自动化系统是否值得增加的额外负载。

我的意思是,第一次大约五年前左右需要将Admob添加到应用程序中时,我只需要下载一个.jar文件并将其放在项目的目录中。它非常明显,从谷歌搜索“如何在我的Android项目中设置Admob”到我的应用程序展示一个Admob横幅的整个过程只花了我几分钟。我会把它放在这里,因为这不是进行此类辩论的地方。

尽管如此,我希望我的经验对其他人有所帮助。


6
我猜这个回答在接下来的几周内会受到很多访问。 - user1531971
4
这是一个非常好的回答:修复,文档,其他问题修复。我只想补充一点,在相同链接的页面中,他们将 maven { url "https://maven.google.com/"} 更新为 google()。Maven行对于低于Gradle 4.1版本的必须存在。朋友,干杯! - Antonino
你有没有想过为什么必须将repo依赖项放在顶层的build.gradle文件的allprojects{ repositories{...}}中,而不是放在模块特定的构建文件中,例如app/build.gradlerepositories中? - stan0

17

将以下内容添加到您的项目级build.gradle文件中:

repositories {
    maven {
        url "https://maven.google.com"
    }
}

它适合我


请在发布您自己的答案之前阅读先前的答案。 - Fran Marzoa

14

我花了几个小时尝试解决这个问题,因为我有些时间没有使用Android Studio,也不知道更新情况。

像这样,google()是在repositories中的第一项非常重要:

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
}

不知何故,在 jcenter() 之后,google() 成为了第二个项目,所以一切都乱了,什么都没用。也许这能帮助某些人。


11

Google Play服务SDK在Google存储库中。

  1. 启动Intellij IDEA。

  2. 在“工具”菜单上,单击 Android > SDK 管理器。

  3. 更新Android SDK管理器:单击SDK工具,展开支持存储库,选择Google存储库,然后单击“确定”。

当前Google存储库版本为57。

更新后,请同步您的项目。

编辑

从版本11.2.0开始,我们需要使用Google Maven存储库,因此请将Google Maven存储库链接添加到repositories标签中。有关详细信息,请查看此处的发行说明。

allprojects {
     ..
     repositories {
     ...
        maven {
            url 'https://maven.google.com'
            // Alternative URL is 'https://dl.google.com/dl/android/maven2/'
        }
     }
}

Google Repository已经安装。我也会添加一张截图。 - Fran Marzoa
也许你指定了错误的SDK。请在“文件”>“项目结构”中检查并确保您选择了正确的SDK。 - Abhishek Aryan
引用我在问题中的话:“我必须指出,我已经正确更新了我的Android SDK,并且我确定它是Idea正在使用的SDK(我已经三次检查过了...)”。我将添加另一个截图以避免进一步的混淆,这样也没有人需要相信我的话... - Fran Marzoa
这是不正确的。使用11.2.0版本时,您必须使用Google Maven仓库。 - Gabriele Mariotti

6

一个更加现代的答案:

allprojects {
    repositories {
        google() // add this
    }
}

别忘了将 gradle 更新到 4.1+(在 gradle-wrapper.properties 中):

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

来源:https://developer.android.com/studio/build/dependencies.html#google-maven

Google Maven仓库是一个托管在Google服务器上的Maven仓库。通过将其添加到项目中,您可以轻松地访问Google和Android SDK组件、库和其他依赖项。这使得开发者可以更加灵活地控制其应用程序所使用的库的版本,同时还能够确保其相互兼容性。


4

在最新的Google Play Services 15.0.0中,如果你像这样包含整个Play服务,就会出现以下错误:

implementation 'com.google.android.gms:play‐services:15.0.0'

相反,你必须指定详细的服务,如 谷歌云端硬盘

com.google.android.gms:play-services-drive:15.0.0

最新版本目前是17.1.0。 - Emmanuel Conradie

4
我发现以下解决方案可以替换以下代码:
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        classpath 'com.google.gms:google-services:3.2.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

对我来说它运行良好


2
在我的情况下,我使用的是版本17.0.1,它显示错误。
implementation "com.google.android.gms:play-services-location:17.0.1"

将版本更改为17.0.0后,它就可以正常工作了。

implementation "com.google.android.gms:play-services-location:17.0.0"

可能的原因是我使用了版本为17.0.0的地图依赖项和版本为17.0.1的位置。这可能会导致错误。因此,请尝试保持版本号的一致性。


1

请检查您的Gradle设置,可能已设置为离线工作


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