欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-14 08:19:14
...

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

分析问题:
1.首先根据报错日记:这是由于相同命名的资源文件重复,所以系统编译的时候无法识别到底需要加载哪一个文件;
2.接着,顺着这个思路,去全局搜索,看看自己的资源文件或者导引用的jar、aar或者资源文件是否有多个日记报错的资源文件;
3.通过搜索发现,导入的aar包中确实存在多个相同命名的文件:
Android:More than one file was found with OS independent path 'res/values/values.xml
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会不会引起其他什么问题,也欢迎大神指教。谢谢。

相关标签: Android Flutter