当前位置: 首页 > 知识库问答 >
问题:

如何使用Gradle管理第三方部门的不同支持库版本?

乌璞瑜
2023-03-14

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

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

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

然而,有一吨的支持库和排除他们所有的每一个我的第三方库似乎是矫枉过正。

有更好的办法吗?

阅读这篇博文:https://www.devsbedevin.net/android-commanding-gradle-dependencies-and-resolution-conflicts/

报告建议:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}

然而,当我使用它时,我仍然会在Android Studio的gradle文件中得到一个警告,即检测到多个版本的支持库。

如果我的依赖关系依赖于不同版本的支持库,我该怎么办?在上面的任何一种情况下,我都将强制第三方库使用它们没有构建的特定版本的支持库。我应该用哪个版本?最新的支持库?所有第三方依赖项的最小支持库?

这里是一个最小的gradle文件示例,展示了拉入第三方依赖关系,每个依赖于自己版本的支持库。

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给出如下警告:

共有2个答案

乐宜民
2023-03-14

第一种情况:您有兼容的库,并且已经更新了它们自己的内部库,在这里没有问题。

第二种情况:您的项目中有一个库,它的版本高于其他库内部包含的其他库,并且这些库可以更新到新版本,而没有这样的问题,这里也没有问题。

最坏的情况是:您的项目中的库的版本高于其他库内部包含的其他库,而这些库没有一个已经更新了的新版本(内部库),建议的解决方案是:

  1. 下载该库并将其作为projectImplementation project(':library')包含到应用程序中,然后更新其内部库。
  2. 或改用其他库。

不要忘记使用./gradlew app:dependencies检查您的依赖项。

我也相信应该有某种方法自动地做到这一点。

谢飞舟
2023-03-14

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

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"
            }
        }
    }
}

下面的代码确保对于所有依赖项,'com.android.support'依赖项版本将等于$supportlib_version。对于'com.google.android.gms'框架也是如此。

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

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

在官方的Gradle文档中阅读更多关于强制某个依赖版本的内容。

更新谷歌已解耦库版本。因此,强制使用15.0.0以上的特定版本可能行不通。相反,您可以允许有限的版本范围。下面的示例允许任何高于15.0.0但低于16的版本。

gps_version = '[15.0.0, 16.0.0)'
 类似资料:
  • 在生成APK时,我得到了一个错误:项目使用的是一个不受支持的Gradle版本。我正在使用Android Studio3.5版本。 我试图更改build gradle类路径以匹配gradle-wrapper.properties中的distributionUrl,但是错误仍然存在。 首先,在项目级设置中,选择Use default gadle wrapper。 build.gradle文件:

  • 这是指生成中出现的警告消息。gradle文件: 一切正常。Android支持库必须使用完全相同的版本规范(混合版本可能会导致运行时崩溃) 我很清楚这一点,并在自己的代码/构建中使用相同的版本。然而,对于我使用的一些第三方库,情况并非如此。 有时第三方库使用旧版本,而其他一些库使用新版本-因此更新您的支持库版本不会解决问题。 在某些情况下,您可能不想升级正在使用的支持库的升级版本。 使用不同版本的支

  • 在印度,Shopify支持以下支付网关: 柑橘付款 但我们在安讯士银行有一个现有的商户账户。我不知道在哪里用Shopify配置我的Axis银行支付网关。 所以问题是: 如何使用Shopify配置Axis银行支付网关? 是否甚至可以添加其他支付网关,这些网关尚未被Shopify支持(未在其商店管理面板中列出)?

  • 本文向大家介绍Angular 如何使用第三方库的方法,包括了Angular 如何使用第三方库的方法的使用技巧和注意事项,需要的朋友参考一下 Angular 的组件与模块看似好像与现有各种第三方类库(例如:lodash、moment 等)使用上有点格格不入,这很大的原因是 TypeScript 造成的假象。三足鼎立的前端其实都是雷同的,不管是哪种前端框架都可以使用到这些第三方类库。 以下我将从另一个

  • 我正在尝试迁移tomcat服务器。 两者都使用版本,并且都应该准备好将我的java/jsp文件从一台服务器带到另一台服务器。我做到了,并且我得到了错误。这很正常,因为在旧的版本中我有,在新安装中我有(均来自Oracle)。 我继续将第二个升级到1.8。一切都很好,因为在新版本中,java版本的输出是: java版本“1.8.0\u 191”java(TM)SE运行时环境(build 1.8.0\u

  • Gradle同步失败:不支持的类文件主版本60(13 m 44 s 731 ms) 无法为初始化脚本'C:\User\umer\AppData\Local\Temp\ijresolvers.gradle'打开初始化泛型类缓存(C:\User\umer.gradle\cache\6.7.1\script\c6td7o6d0dhgcyioq91fpl38q)。 缺陷源单元“BuildScript”中的