前言
本文扯皮话较多,主要记录下心路历程,勿喷。
事情的开始,源于某天下发了一个维护老项目的任务。
当时那个头大,依稀记得刚入职便在这个项目哼哧哼哧搞了好久,而最后因为某些原因,项目直接跑不起来了,索性直接本地干掉,专心整现有项目了。
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,如有不正或更好的方式,欢迎交流学习~