欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

技巧篇 之 这可能是解决 Could not resolve X 最有效的办法之一咯。

程序员文章站 2022-06-01 15:15:05
...

夜深人静,远离了城市的喧嚣,开启了个人的狂欢。

技巧篇 之 这可能是解决 Could not resolve X 最有效的办法之一咯。

前言

本文扯皮话较多,主要记录下心路历程,勿喷。

事情的开始,源于某天下发了一个维护老项目的任务。

当时那个头大,依稀记得刚入职便在这个项目哼哧哼哧搞了好久,而最后因为某些原因,项目直接跑不起来了,索性直接本地干掉,专心整现有项目了。

The start

行云流水般导入,编译,准备 build 成功后开始一通霍霍。事实告诉我,小伙子还是忒年轻。

喏。

ERROR: Unable to resolve dependency for ':aaa@qq.com/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+.
Show Details
Affected Modules: app

ERROR: Unable to resolve dependency for ':aaa@qq.com/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+.
Show Details
Affected Modules: app

ERROR: Unable to resolve dependency for ':aaa@qq.com/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+.
Show Details
Affected Modules: app

ERROR: Unable to resolve dependency for ':aaa@qq.com/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+.
Show Details
Affected Modules: app

ERROR: Unable to resolve dependency for ':aaa@qq.com/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+.
Show Details
Affected Modules: app

INFO: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html
Affected Modules: app

ummm,能脑补下当时尴尬的画面么?

Fuck Road

第一想法,肯定又是哪儿依赖了低版本的库了。问下 Google 老兄,得到几乎大部分的解决方案如下:

  • 将项目中所有 support 库版本指定为 26.+,并且将项目 compileSdkVersion 以及 targetSdkVersion 指定为 26。(哎,指标不治本啊,有的 api 引用的高版本的啊)
  • 将 gradle 设置为离线模式。(我就很是纳闷,依赖的事儿,咋和 gradle 相关呢)
  • 还有重装 AS。。。(听着不靠谱,Bye)

也可能是对于基本的搜索技能还处于小 low B 一个,经过一天的挣扎,成功给我干郁闷了。

Google 估计对我都无奈了。

遂只能自己看看哪儿块依赖使用了 com.android.support:appcompat-v7:26.+,检查很久,当时项目 support 相关配置如下:

implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:support-v4:27.1.1'

都是引入的 27.1.1 版本库,接着继续在项目中翻腾,翻腾。。。

突然看到一个 Version Config Gradle,内容如下:

ext {
    cfgs = [
            compileSdkVersion    : 27,
            buildToolsVersion    : "27.1.1",
            minSdkVersion        : 21,
            targetSdkVersion     : 27,
            versionCode          : 10,
            versionName          : "2.0.0",
            ucropVersionCode     : 22,
            ucropVersionName     : "2.2.0-native",

            //open version control
            androidSupportVersion: "27.1.1",
            glide                : "4.5.0",
            rxjava               : "2.0.5",
            rxandroid            : "2.0.1"
    ]
}

也是鸡老大提醒,是否引入依赖未生效呢?

为了防止配置版本引用失效,这里直接讲其他依赖库修改为制定版本(此处原先应用配置文件中的版本,现已修改为指定版本号):

dependencies {
	// 此处为某个依赖 Module 中引入的依赖
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:27.1.1'
    //noinspection GradleCompatible
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation "com.github.bumptech.glide:glide:${cfgs.glide}"
}

再次 Build,依旧傲然挺立,我能怎么办?

忽然想起鸡老大说,有没有可能是引入第三方 Module 中又引入了其他的依赖源呢?

一脸懵逼的继续在项目中翻腾,翻腾。忽然想到,Android Studio 不是为我们提供了很多现有强大的小插件么?直接打印项目中的所有依赖流检查一边不就好了吗?

右侧找到 app —> help —> dependencies,狂点:
技巧篇 之 这可能是解决 Could not resolve X 最有效的办法之一咯。
随后听到 Air 不堪重负的风扇狂飙,????????????

身为鸡老大弟子,怎会一个个找,多 low 呀,直接查找 26.+
技巧篇 之 这可能是解决 Could not resolve X 最有效的办法之一咯。
折腾我好半天的罪魁祸首终于现身了,迫不期待的向鸡老大汇报进度咯。

真凶,我们已经抓到,那么怎么处理它方能以解心头恨呢?当然直接恁死。

    // 起先是这样子
    implementation 'com.github.JiangAndroidwork:MyImagePicker:1.3.0'
    
    // 修改后如下
    implementation ('com.github.JiangAndroidwork:MyImagePicker:1.3.0'){
        // 排除 support 库
        exclude group: 'com.android.support'
    }

随后,项目终于成功的跑起来咯,可想我当时激动的心,颤抖的手,真想搂着我鸡老大香一个,????????????

奖励自己抽根烟缓缓后,回来继续点击 Android Studio 插件,查看下排除之后的样子又是怎样?
技巧篇 之 这可能是解决 Could not resolve X 最有效的办法之一咯。
美滋滋的和鸡老大汇报成果后,鸡老大摸了摸小胡子淡淡的来了一句:

  • 这样会有个问题呐。万一低版本在高版本中 api 被移除了,你这会崩溃呀,巴拉巴拉。。。

ummm,脑瓜子想了想,哈哈,木事,船到桥头自然直。????????????**(各位道友莫学我,我还有其他任务没开搞。。。)**

The end

在解决这个问题的过程中,发现了自己对于解决问题的方式的欠缺,以及对于我挚爱的 Android 的表面爱,丝毫未深入感受其魅力。不由得膜拜已封神的鸡老大,我鸡老大万寿无疆~!!!

很多时候,一定要透过问题看本质,一点点来,说不定哪儿天就可以追赶上我鸡老大四分之一的功力呢?

以前的自己,追求完成任务即可,而今追随鸡老大,我想了解更多,比如这个 exclude Google 又是怎么解释的?

以下内容节选自 Google Developers,文末附上地址:

随着应用的范围不断扩大,它可能会包含许多依赖项,包括直接依赖项和传递依赖项(应用中导入的库所依赖的库)。要排除不再需要的传递依赖项,您可以使用 exclude 关键字,如下所示:

	dependencies {
        implementation('some-library') {
            exclude group: 'com.example.imgtools', module: 'native'
        }
    }

其中列举下个人理解:

  • exclude: 要排除的依赖组,例如我只是排除了使用 support:26.+ 依赖;
  • module: 这个我没有实际使用,大体猜测为排除某个 module 下的指定依赖组。

The end,如有不正或更好的方式,欢迎交流学习~

参考资料

  1. 添加编译依赖项