最近在维护公司的一个老项目,因为之前都是别人写的,刚开始看他的代码时,我是一脸懵逼,不是因为看不懂,而是因为他的编码风格太过飘逸,格式不太规范,让我有点难受,这次改了一个bug,让我想起了以前笑了很久的一张图
hhh扯远了,话不多说,最近项目需要加一个新功能,拿起键盘直接开撸,没想到刚添加一个依赖库,编译到一半就报错了
Error:Executionfailedfortask':test:processDebugManifest'.>Manifest merger failed with multiple errors,see logs
我看了半天,都不知道错误在哪儿,网上百度了一波,可能使用命令查看详细的错误日志
./gradlew processDebugManifest --stacktrace //我用的是Mac,window系统需要把前面的./去掉
结果又报错了
zsh: permission denied: ./gradlew
继续百度,需要添加gradlew权限
chmod +x gradlew
重新执行命令查看错误日志,结果还是没有看到有用的信息,当时我都想砸电脑了,长期做程序员这一行,导致血压都有点偏高,做事比较浮躁,我整理了一波情绪,发现log太长,有用的错误信息在最顶上,此时的我突然觉得可能还是我太暴躁了,我努力使自己平静下来,看了一下报错信息
Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory). Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:6:5-21:19 to override.
又经过一番百度,发现是新加的依赖库版本是androidx,和现有的support库有冲突,解决这个问题的方法有两种
- 使用依赖库的老版本,不使用androidx
- 将现有现有项目升为androidx版本
当然第一种最省事,但是作为一个敢于挑战困难的程序员(其实是老版本库不满足需求- -),我们就要迎难而上,最终我选择了将旧项目升级为androidx,升级androidx的方法我就不提了,网上一收一大把,升级倒是简单,但是升级之后又出现了了一大波坑,又报错了
The given artifact contains a string literal with a package reference 'android.support.v4.content' that cannot be safely rewritten. Libraries using reflection such as annotation processors need to be updated manually to add support for androidx
最后发现是butterknife的依赖出了问题,原来support库和androidx是不能兼容的,这个老项目之前的依赖包都比较老,有v4也有v7,无法和现有的androidx相互兼容,最终参考了这篇文章,将butterknife,glide,pickerview修改后终于可能正常运行了
AndroidX升级;项目升级AndroidX遇到的问题和解决
总结
自己有时候还是太浮躁了,改bug必须要心平气和,因为急也没有用,这个不是着急就能解决问题的,需要静下心自己去慢慢分析