【问题标题】:Workaround for Using Different Versions of Android Support Libraries使用不同版本的 Android 支持库的解决方法
【发布时间】:2018-02-28 13:54:34
【问题描述】:

这是参考出现在 build.gradle 文件中的警告消息:

所有 com.android.support 库必须使用完全相同的版本 规范(混合版本可能导致运行时崩溃)

我很清楚这一点,并在我自己的代码/构建中使用相同的版本。但是,当涉及到我使用的一些 3rd 方库 时,情况并非如此。

有时第 3 方库使用旧版本,而其他一些库使用新版本 - 因此更新您的支持库版本不会解决问题。

在某些情况下,您可能不想升级正在使用的支持库的版本。

使用不同版本的支持库重新编译 3rd 方库也不是一种选择,因为在我的情况下代码不可用。

当其他引用的第 3 方库使用不同版本的支持库时,解决此问题的解决方法或推荐方法是什么?

【问题讨论】:

    标签: android android-support-library versions multiple-versions


    【解决方案1】:

    您可以排除所有传递依赖项,也可以一一排除,然后将所需版本包含在您的 build.gradle 文件中。

    方法一——排除一个库的所有依赖

    使用 transitive 字段告诉 gradle 您不希望解析 transitive 依赖项。 transitive 的文档说:

    设置是否应解析此依赖项,包括或排除其传递依赖项。属于此依赖项的工件本身可能依赖于其他工件。后者称为传递依赖。

    示例:

    compile('com.super.lib:awesome@aar') {
        transitive = false
    }
    

    方法 2 - 选择您不想包含的依赖项

    使用exclude 方法:

    添加排除规则以排除此依赖项的传递依赖项。

    示例:

    compile('com.super.lib:awesome@aar') {
        exclude group: 'com.dont.want.this', module: 'old-artifact'
    }
    

    但是请注意,这并不能保证排除的依赖项不会被另一个依赖项拉入。如果您想从任何地方排除依赖项,请使用配置范围的排除策略:

    configurations.all {
        exclude group: 'com.dont.want.this', module: 'old-artifact'
    }
    

    另外,您需要同时指定group 和module 名称。这个例子来自gradle的JavaDoc:

    dependencies {
         compile('org.hibernate:hibernate:3.1') {
             //excluding a particular transitive dependency:
             exclude module: 'cglib' //by artifact name
             exclude group: 'org.jmock' //by group
             exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group
         }
    }
    

    警告

    只是一个关于更改依赖版本号的危险的友好提醒。

    当您使用此技术更改依赖项版本时,您必须彻底测试应用程序,因为在新/旧版本的依赖项中可能会出现重大更改或意外行为。很明显,major 版本号跳转可能会导致崩溃/意外行为,但你必须注意版本号的 patch 部分,因为 lib 创建者可能已经预料到所使用的依赖版本有一些错误,并且包含一些修复,一旦错误被修复,可能会破坏 lib。

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 2020-10-02
      相关资源
      最近更新 更多