这可能是解决 Could not resolve X 问题有效方式之一

2019-12-05 21:55:38 浏览数 (1)

前言

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

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

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

The start

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

喏。

代码语言:javascript复制
ERROR: Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support:appcompat-v7:26. .
Show Details
Affected Modules: app

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

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

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

ERROR: Unable to resolve dependency for ':app@releaseUnitTest/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,能脑补下当时尴尬的画面么?

XX Road

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

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

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

Google 估计对我都无奈了。

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

代码语言:javascript复制
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,内容如下:

代码语言:javascript复制
ext {
    cfgs = [
            compileSdkVersion    : 27,
            buildToolsVersion    : "27.1.1",
            minSdkVersion        : 21,
            targetSdkVersion     : 27,
            // 。。。

            //open version control
            androidSupportVersion: "27.1.1",
            // 。。。
    ]
}

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

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

代码语言:javascript复制
dependencies {
  // 此处为某个依赖 Module 中引入的依赖
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:27.1.1'
    //noinspection GradleCompatible
    implementation 'com.android.support:recyclerview-v7:27.1.1'
}

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

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

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

右侧找到 app —> help —> dependencies,狂点:

随后听到 Air 不堪重负的风扇狂飙,???

身为鸡老大弟子,怎会一个个找,多 low 呀,直接查找 26.

折腾我好半天的罪魁祸首终于现身了,迫不期待的向鸡老大汇报进度咯。

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

代码语言:javascript复制
// 起先是这样子
implementation 'com.github.JiangAndroidwork:MyImagePicker:1.3.0'

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

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

奖励自己抽根烟缓缓后,回来继续点击 Android Studio 插件,查看下排除之后的样子又是怎样?

美滋滋的和鸡老大汇报成果后,鸡老大摸了摸小胡子淡淡的来了一句:

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

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

The end

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

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

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

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

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

代码语言:javascript复制
dependencies {
    implementation('some-library') {
        exclude group: 'com.example.imgtools', module: 'native'
    }
}

其中列举下个人理解:

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

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

0 人点赞