Android / Gradle:如何找到Google依赖版本的良好组合?

时间:2018-11-27 14:03:52

标签: java android android-studio gradle android-gradle

由于不同的Google依赖项之间存在不良互动的版本,我经常会编译错误。

典型的gradle文件:

implementation 'com.google.android.gms:play-services-analytics:16.0.1'
    implementation 'com.google.android.gms:play-services-ads:17.1.1' 
    implementation 'com.google.firebase:firebase-core:16.0.1'
    implementation 'com.google.firebase:firebase-messaging:17.1.0'
 implementation 'com.google.ads.mediation:facebook:4.22.1.0'

最后,项目不会出现如下错误:

   FAILURE: Build failed with an exception.

    * What went wrong:
    Could not determine the dependencies of task ':XXX:preDebugBuild'.
    > In project 'XXX' a resolved Google Play services library dependency depends on another at an exact version (e.g. "[1
      5.0.1]", but isn't being resolved to that version. Behavior exhibited by the library will be unknown.

      Dependency failing: com.google.android.gms:play-services-tasks:15.0.1 -> com.google.android.gms:play-services-basement@[
      15.0.1], but play-services-basement version was 16.0.1.

      The following dependencies are project dependencies that are direct or have transitive dependencies that lead to the art
      ifact with the issue.
      -- Project 'XXX' depends onto com.google.firebase:firebase-config@16.0.0
      -- Project 'XXX' depends onto com.google.android.gms:play-services-analytics@16.0.1
      -- Project 'XXX' depends onto com.facebook.android:audience-network-sdk@4.22.1
      -- Project 'XXX' depends onto com.google.android.gms:play-services-ads@17.1.1
      -- Project 'XXX' depends onto com.google.firebase:firebase-core@16.0.1
      -- Project 'XXX' depends onto com.google.firebase:firebase-messaging@17.1.0

      For extended debugging info execute Gradle from the command line with ./gradlew --info :XXX:assembleDebug to see the
       dependency paths to the artifact. This error message came from the google-services Gradle plugin, report issues at http
      s://github.com/google/play-services-plugins and disable by adding "googleServices { disableVersionCheck = false }" to yo
      ur build.gradle file.

    * Try:
    Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.

    * Get more help at https://help.gradle.org

    BUILD FAILED in 25s

如何用可靠的方法解决此类问题? (目的是为每个库提供最新的版本)

2 个答案:

答案 0 :(得分:0)

根据您的日志文件

 Dependency failing: com.google.android.gms:play-services-tasks:15.0.1 -> com.google.android.gms:play-services-basement@[
      15.0.1], but play-services-basement version was 16.0.1.

其问题是由于Google Play Service的版本不同所致。

要解决android中的此类问题,请在gradle.properties文件中定义一个恒定版本

# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=27.0.3
TARGET_SDK_VERSION=26
MIN_SDK_VERSION=17
ANDROID_SUPPORT_VERSION=26.1.0
PLAY_SERVICE_VERSION=16.0.1

要在build.gradle(Module:app)中使用这些常量,请如下定义:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "com.android.support:appcompat-v7:${ANDROID_SUPPORT_VERSION as String}"
    implementation "com.google.android.gms:play-services-analytics:${PLAY_SERVICE_VERSION as String}"
    implementation "com.google.android.gms:play-services-ads:${PLAY_SERVICE_VERSION as String}"

}

类似地,您可以定义其他库,例如firebase或其他库。

答案 1 :(得分:0)

我认为您的问题没有直接的答案。

我的建议是使用com.google.firebase:firebase-ads:17.1.0,因为它还应同时包含play-services-analyticsplay-services-ads,然后可以将其删除。然后每两周关注一次release versions个库。

是的,我知道,这可能不是您想要的答案,但是从长远来看,它将减少您的头痛。


如果这不足以说服您,则可以使用另一种方法来减少使用次要版本号中的+(例如,16.0.+)来保持最新版本所需的时间。 16.0.0)。

警告:自动增加版本号可能会导致问题(例如:CI和本地计算机中解析的版本不同,意料不到的不兼容性,无法复制的构建等)。 )

在主build.gradle文件上定义一个常量:

allprojects {

    ext {
        global_version_firebase = '16.0.+'
    }
}

并像implementation "com.google.firebase:firebase-core:$global_version_firebase"

一样使用它

firebase和play服务的某些版本差异为actually major changes(即firebase-core:16.0.4firebase-ads:17.1.0),因此次要版本上方便的+不适用于所有情况下,您都需要在整个版本号上加上+,这是不可以的。