清单文件合并失败问题 Manifest merger failed with multiple errors, see logs

引入第三方库的时候容易出现清单文件合并失败的问题。

原因:
清单文件合并是按照优先级进行合并的,低优先级的清单文件内容合并到高优先级的
优先级:主工程 > module(按照依赖关系) > jar 包(aar)

排查:
提示让查看logs,直接在 Android Studio 的 Terminal 中输入命令

.\gradlew assembleDebug --stacktrace


上图引用博客 https://www.jianshu.com/p/695998515e2e

gradlew执行报错:

如果提示如下信息:
gradlew : 无法将“gradlew”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
原因是在之前的 Terminal 中可以执行 gradlew 命令 ,更新到 Android Studio Dolphin 2021.3.1 版本后 , 执行gradlew命令要加上 .\gradlew

根据log找到出错的位置:
在这里插入图片描述
上图引用博客 https://blog.csdn.net/chengxuyuan22/article/details/107369334

我这边定位到有问题的一行:

android:protectionLevel="signature"

这是自定义权限的权限级别冲突
权限级别相关:

含义
normal这是最低风险的权限,如果应用声明了此权限,也不会提示安装应用的用户授权(例如,如果声明了定位权限,则应用到定位功能时,会明确提示用户,是否授予定位权限,但是protectionLevel为normal的不会明确提示,直接默认授予),系统直接默认该应用有此权限;
dangerous这种级别的权限风险更高,拥有此权限可能会访问用户私人数据或者控制设备,给用户带来负面影响,这种类型的权限一般不会默认授权(但是我测了好多次,有时候还是会默认授权);
signature这种权限级别,只有当发请求的应用和接收此请求的应用使用同一签名文件,并且声明了该权限才会授权,并且是默认授权,不会提示用户授权
signatureOrSystem这种权限应该尽量避免使用,偏向系统级

解决:
清单文件合并规则中很重要的一个规则是节点标记,而 merge 是默认行为tools:node = "merge",当manifest 各节点属性没有声明节点标记时候,就会使用默认值。
现在合并的时候出错,所以要修改这个节点的合并规则,在出错的节点中添加 tools 节点标记。

tools:replace="android:protectionLevel"

合并规则每个值的含义:

含义
merge合并该attribute 所有的属性和子属性;
replace替换其他的值,使用该清单文件的值(一般而言,都是替换掉低优先级的值)
strict严格的意思,就是不同的清单文件,相同属性的值应该一样,否则编译失败。(一般而言,就是不同的清单文件同一个属性其值要一样)
remove删除某个属性。
removeAll删除某个属性及其嵌套的子属性。(相当于remove,不过是有些时候删除很多子属性时,方便一些)
merge-only-attribute只合并属性,不合并嵌套的属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值