android.support.v4.app.INotificationSideChannel$Stub$Proxy或Manifest merger failed with multiple…

  • Post author:
  • Post category:其他

前言

导入第三方框架或者开源库(我是导入GSYVideoPlayer)的时候,出现Manifest merger failed with multiple errors, see logs异常;

可能原因有:

1,V4或者V7包重复导致Manifest清单文件合并失败;

2,Androidx和v4或者v7不能共存

解决办法:

方法一:

升级AndroidStudio和project 的build.gradle中引入gradle插件版本

例如Androidstudio升级到3.4.1,gradle插件升级到classpath ‘com.android.tools.build:gradle:3.4.1’,当然高版本的AndroidStudio可能需要更高版本的Gradle

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

有关gradle,gradle-wrapper,Android plugin for gradle之间的关系

Gradle: https://docs.gradle.org/current/userguide/userguide_single.html
Gradle Wrapper: https://docs.gradle.org/current/userguide/gradle_wrapper.html
Android Plugin for Gradle: https://developer.android.com/studio/build/index.html
 

Gradle:是一个构建系统,能够简化你的编译、打包、测试过程。

Gradle Wrapper:能帮我们搞定项目gradle的安装部署。不同版本的项目可能需要不同版本的Gradle,手工部署的话比较麻烦,而且可能产生冲突,所以需要Gradle Wrapper帮你搞定这些事情。Gradle Wrapper是Gradle项目的一部分。

Android Plugin for Gradle:它是一堆适合Android开发的Gradle插件的集合,主要由Google的Android团队开发,Gradle不是Android的专属构建工具,但是有了Android Plugin for Gradle的话,你会发现使用Gradle构建Android项目尤其的简单

方法二:把项目迁移到androidx

1,在Terminal中输入gradlew processReleaseManifest –stacktrace可以查看具体报错

2,也可以在Androidstudio 中点开AndroidManifest的Merged Manifest右边有具体的报错信息和建议

3,根据上面提示在<application> 标签下添加了tools:replace=”android:appComponentFactory”属性;但是依旧报错错误信息可能有以下几种,不同的操作可能导致的报错信息不一样,但是错误原因一样:

Program type already present: android.support.v4.app.INotificationSideChannel$Stub$Proxy

Program type already present: android.support.v4.os.ResultReceiver

Program type already present: xxxxxxxx 可能还会有其他衍生的错误信息

4,原因其实就是Androidx和V4或者V7包冲突不能共存,有冲突,在gradle.properties添加以下内容,从android support迁移到androidx(Google 2018 IO 大会推出了 Android新的扩展库 AndroidX,用于替换原来的 Android扩展库,将原来的android.support.**替换成androidx.**;只有包名和Maven工件名受到影响,原来的类名,方法名和字段名不会更改。):

android.enableJetifier=true //表示当前项目启用 androidx
android.useAndroidX=true //表示将依赖包也迁移到androidx 。如果取值为false,表示不迁移依赖包到androidx,但在使用依赖包中的内容时可能会出现问题,如果你的项目中没有使用任何三方依赖,那么,此项可以设置为false

5,把module下的build.gradle 中的所有关于V4和V7等support依赖删掉;

6,编译,这时Androidstuido 把之前引用过V4和V7的类全部以错误的形式列出来,如下图:找不到包的错误信息;把报错的地方导入的V4和V7包全部删掉,从新导入Androidx包即可;

以上是把项目中的V4和V7等库删掉,使用Androidx,既是迁移到Androidx;这样项目和第三方框架或者库都用同一个兼容库Androidx;这样就不会出现androidx和Android support库共存的问题了;Androidstudio升级到3.2以上版本,gradle升级到4.6以上支持一键迁移(Androidstudio 选择菜单上的ReFactor —>Migrate to AndroidX… 即可)

方法三:使用没有迁移到androidx之前的第三方库

有些第三方框架最新版已经迁移到了androidx,可以使用第三方框架之前的老版本,即:使用之前没有迁移到androidx的版本;这样项目和第三方框架或者库都用同一个兼容库V4和V7等库,这样就不会出现androidx和Android support库(主要是V4和V7等库)共存的问题了;

 附:

       在 Terminal 中输入gradlew :app:dependencies命令,查看第三方库的依赖树并找出引用了 androidx的库;

方法三

总结:

如果之前项目中没有使用Androidx,使用的时v4或者V7包;导入的第三方框架或者库中使用了Androidx,会导致以上错误,原因Androidx和v4或者V7等包冲突,也就是不能共存;


androidx概述

官方文档:https://developer.android.com/jetpack/androidx

项目迁移到androidx

使用Android Studio迁移现有项目

条件:Androidstudio版本3.2及以上版本;gradle插件classpath ‘com.android.tools.build:gradle:3.2.0’   3.2及以上版本; Gradle version is 4.6及以上版本

1,首先在gradle.properties文件中设置以下两个Android Gradle插件标志。

android.enableJetifier=true //表示当前项目启用 androidx
android.useAndroidX=true //表示将依赖包也迁移到androidx 。如果取值为false,表示不迁移依赖包到androidx,但在使用依赖包中的内容时可能会出现问题,如果你的项目中没有使用任何三方依赖,那么,此项可以设置为false

2,使用Android Studio 3.2及更高版本,可以通过从菜单栏中选择Refactor> Migrate to AndroidX,快速迁移现有项目以使用AndroidX 。

3.3,勾选Backup project as Zip file 选项(即:在开始迁移之前备份项目的选项),点击Migrate备份项目代码,一路下一步;中间会涉及选择存储路径,选择备份项目的存储路径即可;

3,迁移到androidx 官方文档:https://developer.android.com/jetpack/androidx/migrate

 


版权声明:本文为ezconn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。