处理 manifest merger failed 错误

在android开发中,butterkinfe 是一个非常好用的库,能极大的减少代码量,简化开发,提示开发效率。但在使用其最新版本(10.1.0)进行项目编译时,会得到一个错误信息: “ERROR: Manifest merger failed”,如何解决呢?

问题描述

按照 butterkinfe 的官方文档,在 app module 对应的 build.gradle 文件中加入 butterkinfe 库,

1
2
3
4
5
6
7
8
9
10
11
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}

文件保存以后, 代码的第3行会在 Android Studio 中会被红线标记,提示出错。出错信息为:

1
2
Dependencies using groupId com.android.support and androidx.* can not be combined but found IdeMavenCoordinates{myGroupId='com.android.support', myArtifactId='cursoradapter', myVersion='28.0.0', myPacking='aar', myClassifier='null'} and IdeMavenCoordinates{myGroupId='androidx.lifecycle', myArtifactId='lifecycle-runtime', myVersion='2.0.0', myPacking='aar', myClassifier='null'} incompatible dependencies less... (⌘F1) 
Inspection info:There are some combinations of libraries, or tools and libraries, that are incompatible, or can lead to bugs. One such incompatibility is compiling with a version of the Android support libraries that is not the latest version (or in particular, a version lower than your targetSdkVersion). Issue id: GradleCompatible

如果不理会以上的错误信息,强行进行编译、构建,则会构建失败,并得到如下的错误信息:

1
2
3
ERROR: 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-25:19 to override.

初看这个错误信息,会以外解决问题出现在 AndroidManifest.xml 文件中,并试图根据提示在 AndroidManifest.xml 中的 application 节点中增加 tools:replace=”android:appComponentFactory 属性,但问题依旧。

解决方法

其实如果仔细查看 Android Studio 中的红线标记中的提示就可以看出来,问题的关键是 Android 的兼容包出的问题。在新版的 butterkinfe 中,使用了 Android 官方新的兼容包 androidx, 而不再用 appcompat 包。但使用 Android Studio 新建的项目默认还是使用的是 appcomat。因此造成了库依赖的错误。

要解决这个问题,有两种方案:

  1. 使用低版本的 butterkinfe
  2. 将项目的兼容依赖库换位 androidx 。

在这里我们选择使用第二种方案,将项目的兼容依赖库换为 androidx。

直接使用 Android Studio 中的菜单项即可完成切换的工作,在菜单上选择 Refactor -> Migrate to AndroidX…, 然后根据提示进行操作即可。

切换以后, build.gradle 文件中的依赖项变为:

1
2
3
4
5
6
7
8
9
10
11
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.material:material:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}

然后就可以顺利的进行编译、构建项目了。

本文标题:处理 manifest merger failed 错误

文章作者:梅老师

发布时间:2019年06月05日 - 19:06

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/app/android/android-manifest-merger-failed/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。