解决错误的正确方法:所有支持库必须使用完全相同的版本

时间:2017-11-01 10:53:59

标签: android android-studio android-gradle

我正在使用Tommy Buonomo的优秀图书馆(here on GitHubthis SO question where he introduced it)向ViewPager添加位置指示符,但我收到gradle有关支持的错误图书馆版本为我提出了一个更大的问题。

具体错误是:

Error:(39, 20) All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 27.0.0, 25.3.1. Examples include 'com.android.support:support-compat:27.0.0' and 'com.android.support:animated-vector-drawable:25.3.1'

(请注意,Android Studio将其标记为Error但该应用仍会编译并运行。)

这引发的更大问题是如何正确处理这样的支持库版本中的冲突?

我只是通过添加:

添加了库
compile 'com.tbuonomo.andrui:viewpagerdotsindicator:1.0.1'

我的应用程序级别build.gradle中的依赖关系,正如我所说,除错误外,一切正常。

我想尽可能保持我的应用程序错误和警告,所以我想了解我可以做些什么来解决这个问题。

这是我第一次在我的某个项目中使用第三方库,所以这是我第一次遇到这个特定问题。

所以,有些问题。

  1. 库开发人员必须创建针对特定其他支持库版本的库的各种版本,还是只需创建一个支持特定版本的所有版本的库? (由于您不知道库用户将使用哪些版本,因此必须创建特定版本似乎不切实际。)

  2. 用户通常是否能够更改第三方库调用的其他支持库的版本?我似乎无法在项目树的外部库部分找到任何可以让我为Tommy的库执行此操作的部分,因此我假设许多库都是这样的。

  3. 唯一的选择是等待库开发人员创建一个使用我的应用程序使用的相同API级别支持库的新版本吗? (或者更改我的应用使用的支持库版本。)

  4. 另一种选择是在github上分叉库并更改它在新fork中使用的支持库版本吗?这就引发了学习如何编译和使用库以及重新发布它们以供其他人使用的问题(可能作为对原作者的拉取请求,以便他们可以合并这些更改 - 这最符合Tommy发布的精神)无论如何,图书馆 - 并且还需要了解所有问题1-3。

  5. 我觉得我遇到了这个错误,我已经在这里打开了一堆蠕虫,但是如果我要正确地做事,我想更多地了解这个应该如何修复。

    (仅供参考,我正在使用编译和目标SDK v27构建我的应用程序,以便遵循目标最新API级别的最佳实践.Tommy的库已经有一个拉动请求来支持API v26,等待行动)

2 个答案:

答案 0 :(得分:4)

您可以强制依赖项使用特定版本的support library,尝试在项目级build.gradle文件中添加此项:

subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "yourSupportLibVersion"
            }
        }
    }
}

如果您使用支持库版本27.0.0,请将yourSupportLibVersion替换为27.0.0

说明:

  • 为什么我们使用子项目?

    在多项目gradle构建中,您有一个根项目和子项目。根项目是构建开始的地方。其他所有内容,无论是作为gradle中的依赖项添加还是手动添加的外部库,都将通过gradle作为子项目处理。

  • 什么是ResolutionStrategy?

    引用docsResolutionStrategy定义了依赖解析的策略。例如,强制某些依赖项版本,替换,冲突解决方案或快照超时。

  • 为什么要排除multidex

    我们排除multidex强制使用我们所需版本的原因是,multidex的依赖项名称还包含com.android.support,其中com.android.support:multidex:someVersionsomeVersion if与支持lib版本不同,它独立于它,这就是我们将其排除在强制支持lib版本之外的原因。 注意: 如果您有更多此类依赖项,则应将其添加到上面的class NameForm extends React.Component { constructor(props) { super(props); this.state = {data: this.props.data}; } handleChange(event) { let updatedData = Object.assign({}, this.state.data); updatedData[event.target.name][event.target.dataset.lang] = event.target.value; this.setState({ data: updatedData }); } render() { return ( <form> {Object.keys(this.props.data.titles).map((l, index) => <input type="text" name="titles" data-lang={l} value={this.state.data.titles[l]} onChange={this.handleChange.bind(this)} /> )} </form> ); } } class App extends React.Component { constructor(props) { super(props); this.state = { images: [{"titles": {"en": "deluxe1500x930.jpg"} }], count: 1 }; } render() { return ( <div> {Object.keys(this.state.images).map((x,index) => <div> {this.state.images[x].titles.en} <NameForm data={this.state.images[x]} /> <button onClick={(() => {this.setState({ count: 2 })}).bind(this)}>test</button> </div> )} </div> ) } } 条件中。

在我们确保依赖确实是一个支持库之后,我们只是告诉gradle使用我们想要的版本。

答案 1 :(得分:1)

您提到的库正在使用appcompat库的v25.3.1,并且在过去4个月内未更新。

为了避免支持库版本冲突,我认为您应该克隆/下载库并将其作为模块依赖项手动包含在项目中,以便您可以更新appcompat库的版本并毫无问题地使用它。 / p>

  • 将git存储库克隆到另一个目录。
  • 在Android Studio中,选择File → Import Module and choose the module directory(包含文件build.gradle的那个)
  • 然后右键点击您的模块app → open module settings → dependencies → add module dependency