如何使用 gradle 为 3rd 方部门管理不同的支持库版本?

How to manage different support library versions for 3rd party deps with gradle?(如何使用 gradle 为 3rd 方部门管理不同的支持库版本?)
本文介绍了如何使用 gradle 为 3rd 方部门管理不同的支持库版本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我有一堆第三方库,我包含在我的基础应用程序中.我无法控制那些 3rd 方模块包含的支持库.这使得在我的应用程序中很难拥有相同版本的 android 支持库.

当我可以从每个依赖项中排除某些库时,我知道使用 gradle:

compile('com.test:lib1:1.0.0') {排除组:'com.android.support'}

但是,有大量的支持库,并且将它们全部排除在我的每个 3rd 方库中似乎有点矫枉过正.

有没有更好的办法?

阅读这篇博文:

解决方案

这当然是可能的.在您的项目 build.gradle 文件(顶级 build.gradle 文件)中添加以下代码块:

ext {supportlib_version = '26.1.0'gps_version = '11.2.0'}//确保所有依赖使用相同版本的Android Support库子项目{project.configurations.all {resolutionStrategy.eachDependency {详细信息->if (details.requested.group == 'com.android.support'&&!details.requested.name.contains('multidex')) {details.useVersion "$supportlib_version"}如果(details.requested.group == 'com.google.android.gms'&&!details.requested.name.contains('multidex')) {details.useVersion "$gps_version"}}}}

以下代码确保所有依赖项的com.android.support"依赖项版本都等于 $supportlib_version.'com.google.android.gms' 框架也是如此.

确保在您的模块的 build.gradle 文件中,您也将这些版本用于您的依赖项.例如:

编译com.android.support:support-v4:$supportlib_version"

在 中阅读有关强制某个依赖版本的更多信息Gradle 官方文档.

更新Google 已经分离了库版本.因此,强制高于 15.0.0 的特定版本可能不起作用.相反,您可以允许有限范围的版本.下面的示例允许任何高于 15.0.0 但低于 16 的版本.

gps_version = '[15.0.0, 16.0.0)'

I have a bunch of third party libs that I include in my base application. I cannot control the support library those 3rd party modules include. This makes it hard to have the same version of the android support library in my application.

I know using gradle when I can exclude certain libraries from each dependency:

compile('com.test:lib1:1.0.0') {
    exclude group: 'com.android.support'
}

However there are a ton of support libraries and excluding them all for each one of my 3rd party libraries seems like overkill.

Is there a better way?

Reading this blog post: https://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

It suggests:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}

However when using that I still get a warning in Android Studio in my gradle file that there are multiple versions of the support library detected.

What do I do if my dependencies depend on different versions of the support library? In either case above I would be forcing the 3rd party libraries to use a specific version of the support library that they were not build with. Which version am I supposed to use? Latest support library? Min support library of all 3rd party dependencies?

Here is a minimal gradle file example showing pulling in 3rd party dependencies that each depend on their own version of the support library.

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 17
        targetSdkVersion 25
    }
}

configurations.all {
    resolutionStrategy {
        preferProjectModules()
    }
}

dependencies {
    compile 'com.android.support:support-v13:26.0.0'
    compile 'com.test:lib1:1.0' // depends on support-v13:25.0.0
    compile 'com.test:lib2:1.0' // depends on support-v13:25.2.0
    compile 'com.test:lib3:1.0' // depends on support-v13:25.4.0
    compile 'com.test:lib4:1.0' // depends on support-v13:26.0.0
}

Android studio gives the following warning:

解决方案

This is certainly possible. In your projects build.gradle file (the top level build.gradle file) add the following code block:

ext {
    supportlib_version = '26.1.0'
    gps_version = '11.2.0'
}

//Ensure that all dependencies use the same version of the Android Support library
subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$supportlib_version"
            }
            if (details.requested.group == 'com.google.android.gms'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$gps_version"
            }
        }
    }
}

The following code ensures that the 'com.android.support' dependency version will be equal to $supportlib_version for all dependencies. The same for the 'com.google.android.gms' framework.

Make sure that in your module's build.gradle file you also use these versions for your dependencies. E.g.:

compile "com.android.support:support-v4:$supportlib_version"

Read more about forcing a certain dependency version in the Official Gradle documentation.

Update Google has decoupled library versions. Therefore, forcing a specific version above 15.0.0 may not work. Instead, you can allow a limited range of versions. The example below allows any version higher than 15.0.0 but lower than 16.

gps_version = '[15.0.0, 16.0.0)'

这篇关于如何使用 gradle 为 3rd 方部门管理不同的支持库版本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How can I use CClistview in COCOS2d Android?(如何在 COCOS2d Android 中使用 CClistview?)
cocos2d-android: how to display score(cocos2d-android:如何显示分数)
Sqlite database not copied from asset folder Android(Sqlite 数据库未从资产文件夹 Android 复制)
SQLite Database Copy Appears Corrupted When Generated by Device and not Emulator(SQLite 数据库副本在由设备而不是模拟器生成时出现损坏)
Android file copy(安卓文件拷贝)
Android how to detect Copy event of Edittext in android(Android如何在android中检测Edittext的Copy事件)