Android:More than one file was found with OS independent path 'res/values/values.xml

概述:
最近在集成一个一键登录的sdk时遇到了这个问题:
More than one file was found with OS independent path 'res/values/values.xml。
在这里插入图片描述

分析问题:
1.首先根据报错日记:这是由于相同命名的资源文件重复,所以系统编译的时候无法识别到底需要加载哪一个文件;
2.接着,顺着这个思路,去全局搜索,看看自己的资源文件或者导引用的jar、aar或者资源文件是否有多个日记报错的资源文件;
3.通过搜索发现,导入的aar包中确实存在多个相同命名的文件:
在这里插入图片描述
4.由此,问题的原因已经找到了,接下来就是如何解决的问题。

解决思路:
根据网上大多数人的建议,主要以下几种:
1.找到对应的资源文件,修改命名(这种方法视项目的大小、冲突文件的数量多少而定,要只是一两个资源文件,找出来修改以下,o了;但是,如果冲突的文件太多,不建议使用这种方法);
2.在gradle配置项packagingOptions中使用exclude,过滤掉某些文件或者目录不添加到APK中,作用于APK,不能过滤aar和jar中的内容:

...
android{
    packagingOptions {
        exclude 'res/values/values.xml'
        exclude 'libs/loginsdk1.0.4-release.aar/res/values/values.xml'
    }
}
...

exclude后面的,就是需要过滤的文件路径。这种方法直接,简单,也是大多数人使用的方法。
3.与方法2相类似:packagingOptions中使用pickFirst,匹配到多个相同文件,只提取第一个。只作用于APK,不能过滤aar和jar中的文件。
比如:

...
android{
    packagingOptions {
//        pickFirst 'res/values/values.xml'
//        pickFirst 'AndroidManifest.xml'
    }
    }
    ...

4.但是,当我们是引用的三方的jar包或者aar资源文件,无法修改重复命名的资源文件,同时,虽然文件名相同、但文件内容不同的情况下,显然几种方法都无法解决问题,因此,这个时候,我们可以大胆的猜测:既然packagingOptions 的配置项可以过滤文件、提取文件等等,那我们是不是还可以通过标识完整的重复命名的资源文件,然后让系统进行提取,或者,我们还可以让重复命名的文件进行合并?而,顺着这个思路,我度娘了一下关于gradle配置项packagingOptions使用说明
gradle配置项packagingOptions使用说明
从这个帖子里面,果然找到了解决方法:
merge,将匹配的文件都添加到APK中,和pickFirst有些相反,会合并所有文件
于是,把重复文件进行了合并:

android{
    packagingOptions {
        merge 'res/values/values.xml'
        merge 'AndroidManifest.xml'
        merge 'res/drawable/login_bg.xml'
        merge 'R.txt'
        merge 'classes.jar'
    }
    }

最后,编译,通过。

总结:
有时候,遇到问题,根据网上大多数人遇到的类似问题以及大家提供的思路,若问题没有解决,可以顺着相同的思路进一步尝试,说不定问题就解决了,比如:从gradle配置项packagingOptions使用的过滤、提取,若问题仍无法解决,则可以顺着这个思路,猜测packagingOptions是否还有其他的使用方法,多尝试,问题则或许有可以解决。当然,我现在也不知道使用这个merg会不会引起其他什么问题,也欢迎大神指教。谢谢。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易小四

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值