Proguard警告“不能写入资源(复制zip条目)”

我正在使用IntelliJ并在debugging模式下运行Proguard,但我似乎无法摆脱警告,如:

ProGuard: [MyApplication] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [android-support-v13.jar:META-INF/MANIFEST.MF]) 

这个项目有两个模块,其中两个使用android-support-v13.jar 。 我认为这是问题,所以我从libs文件夹中删除该库,将其添加为项目库,并将依赖项添加到这两个模块。 这并没有解决任何问题,警告仍然存在,我不明白为什么。

我知道这些警告不会影响任何东西,但干净的构build是一个快乐的构build!

Solutions Collecting From Web of "Proguard警告“不能写入资源(复制zip条目)”"

可能是一个'proguard.cfg'的问题。 它是否包含任何“-injars”? 如果您的项目包含另一个项目作为库,jar子可以被处理两次。 你能发布你的'proguard.cfg'吗?

摘自http://proguard.sourceforge.net/index.html#manual/troubleshooting.html

您的inputjar包含多个具有相同名称的资源文件。 ProGuard像往常一样继续复制资源文件,跳过以前使用的名称的任何文件。 再一次,警告可能是一些问题的迹象,所以build议删除重复。 一个方便的方法是通过在inputjar上指定filter。 没有selectclosures这些警告。

选项1:

因为你不能发布'-injars',请检查它们是否包含'android-support-v13.jar'或者包含在你的项目中的库,它本身也包含'android-support-v13.jar'。

假设你在IntelliJ IDEA中使用Ant构build,你不能添加-injars,-outjars或-libraryjars选项; Ant脚本已经为你做了。

选项2:

虽然警告是无害的,但干净的构build是一个快乐的构build,所以请尝试:

http://www.dancartoon.com/2012/01/14/fixing-proguard-warning-cant-write-resource-meta-infmanifest-mf/

https://gist.github.com/paulpv/4439012

选项3:

在每个“-injars”命令后包含(!META-INF/MANIFEST.MF)

 -injars library.jar(!META-INF/MANIFEST.MF) 

选项4: Android Proguard重复定义

通过将第三方库移到另一个目录解决这个问题,在我的情况下'lib'。 然后添加

 -injars lib/jmdns.jar 

到proguard.cfg文件。

选项5: Android – Proguard复制zipinput错误

如果您的Proguardconfiguration文件包含以下行,请将其删除:

 -injars bin/classes 

选项#6: 使用proguard的Android混淆应用程序保持混淆图书馆jar – 是吗?

我发现另一种使Proguard离开图书馆jar子的方法是要求它保留它们的包名,例如:

-keep class javax。** {*; – 维护类组织。** {*; } -keep class twitter4j。​​* {*; }

选项#7:

一个奇怪的解决scheme(删除src文件夹中的META-INF文件夹)在这里类似的东西 。

我在build.gradle使用了包含excludebuild.gradle ,而且我也build.gradle同样的问题。

你可以使用这个修复它。

 packagingOptions { pickFirst 'META-INF/services/javax.annotation.processing.Processor' pickFirst 'META-INF/DEPENDENCIES.txt' pickFirst 'META-INF/DEPENDENCIES' pickFirst 'META-INF/LICENSE.txt' pickFirst 'META-INF/LICENSE' pickFirst 'META-INF/NOTICE.txt' pickFirst 'META-INF/NOTICE' pickFirst 'META-INF/LGPL2.1' } 

pickFirstreplace为exclude

我find的最佳解决scheme是将-obfuscate目标从/tools/ant/build.xml复制到您的项目的custom_rules.xml中。 然后,唯一需要更改的块是:

 <pathconvert property="project.all.classes.value" refid="project.all.classes.path"> <firstmatchmapper> <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"(!META-INF/MANIFEST.MF)'/> <identitymapper/> </firstmatchmapper> </pathconvert> 

唯一添加的位是(!META-INF/MANIFEST.MF) 。 这将排除所有的清单文件,不会被复制到最终的APK。

不要通过直接包含jar来引用支持库; 当你这样做的时候,构build系统不能在它的多个版本之间消歧,而且你会得到这种types的错误。 通过引用其Maven坐标包含它:

依赖关系{compile'c​​om.android.support:support-v13:XXX'}}其中XXX是基于您正在编译的API的正确版本号。 如果你通过UI在Project Structure>(你的模块)> Dependencies> + Button> Library dependency中包含这个依赖项,它将帮助你select正确的版本号。

你也可能发现通过Maven坐标来包含其他的依赖关系是很方便的,而不是把它们的jar包装起来; 相同的库依赖关系UI具有searchfunction来帮助您查找库。

一定要从libs或其他文件夹里面删除这个库

-dontwarn添加到proguard.cfg以忽略警告