Proguard警告“无法写入资源[META-INF / MANIFEST.MF](重复的zip条目)”

时间:2013-05-03 11:33:13

标签: android warnings proguard android-support-library

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

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

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

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

5 个答案:

答案 0 :(得分:46)

可能是'proguard.cfg'问题。它包括任何'-injars'吗?如果您的项目包含另一个项目作为库,则可以对jar进行两次处理。你能发贴'proguard.cfg'吗?

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

  

您的输入jar包含多个具有相同名称的资源文件。   ProGuard继续像往常一样复制资源文件,跳过任何文件   以前使用过的名称的文件。再一次,警告可能是一个   虽然有一些问题的指示,所以建议删除   重复。一种方便的方法是在上面指定过滤器   输入罐子。没有选项可以关闭这些警告。

选项#1:

由于您无法发布'-injars',请检查它们是否包含'android-support-v13.jar'或项目中包含的库,其中包含'android-support-v13.jar'。

假设您在IntelliJ IDEA中使用Ant构建,则不得添加-injars,-outjars或-libraryjars选项; Ant脚本已经为您完成了这项工作。

选项#2:

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

http://web.archive.org/web/20160206204259/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 Duplicate Definition

  

通过将第三方库移动到另一个目录中来解决此问题   我的案子'lib'。然后添加

-injars lib/jmdns.jar 
     

到proguard.cfg文件。

选项#5: Android - Proguard duplicate zip entry error

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

-injars bin/classes

选项#6: Android obfuscate app using proguard keeps obfuscating library jars - or is it?

  

我找到另一种让Proguard独自离开图书馆罐子的方法   要求它保留他们的包裹名称,例如:

     

-keep class javax。** {*; }   -keep class org。** {*; }   -keep class twitter4j。​​* {*; }

选项#7:

一个奇怪的解决方案(删除src文件夹中的META-INF文件夹)到类似的here

答案 1 :(得分:3)

我在packagingOptions使用了exclude 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'
}

pickFirst替换为exclude

答案 2 :(得分:0)

我找到的最佳解决方案是将-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中。

答案 3 :(得分:0)

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

依赖{     编译'com.android.support:support-v13:X.X.X' } 其中X.X.X是基于您正在编译的API的正确版本号。如果您通过项目结构中的UI包含此依赖项&gt; (您的模块)&gt;依赖性&gt; +按钮&gt;库依赖它将帮助您选择正确的版本号。

您可能还会发现通过Maven坐标包含其他依赖项而不是争吵它们很方便;相同的库依赖UI具有搜索功能,可帮助您查找库。

请务必从libs或其中的任何其他文件夹中删除此库

答案 4 :(得分:-4)

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