保护警告"can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry)"



我正在使用IntelliJ并在调试模式下运行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正在其中2个模块上使用。我认为这是问题所在,所以我从libs文件夹中删除了该库,将其添加为项目库,并将依赖项添加到两个模块。这并没有解决任何问题,警告仍然存在,我不明白为什么。

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

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

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

输入jar包含多个具有相同名称的资源文件。ProGuard继续像往常一样复制资源文件,跳过任何使用以前使用过的名称的文件。再一次,警告可能是错误的这表明有些问题,所以建议去掉重复。控件上指定过滤器是一种方便的方法输入jar。没有选项可以关闭这些警告。

选项# 1:

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

假设你在IntelliJ IDEA中使用Ant构建,你不能添加-injars, -outjars或-libraryjar选项;

选项# 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)

OPTION #4: Android Proguard Duplicate Definition

通过将第三方库移动到另一个目录中来修复此问题我的箱子是"lib"。然后添加

-injars lib/jmdns.jar 

到proguard.cfg文件。

OPTION #5: Android - Proguard duplicate zip entry error

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

-injars bin/classes

选项#6: Android混淆应用程序使用proguard保持混淆库jar -或者是吗?

我发现另一种让Proguard离开库jar的方法是要求它保留它们的包名,例如:

-keep class javax。** {*;}保持班级组织。** {*;}保持类twitter4j。** {*;}

选项# 7:

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

我在build.gradle中使用packagingOptionsexclude,我和你有同样的问题。

你可以用这个来修复它。

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

我发现最好的解决方案是将-obfuscate target从/tools/ant/build.xml复制到项目的custom_rules.xml中。那么唯一需要修改的代码块是:

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

唯一增加的位是(!META-INF/MANIFEST.MF)。这将排除所有的manifest文件,这些文件无论如何都不会被复制到最终的APK中。

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

{的依赖关系编译"com.android.support: support-v13: . X.X.X"}其中X.X.X是基于您正在编译的API的正确版本号。如果你通过项目结构>(你的模块)>依赖> +按钮>库依赖,它将帮助你选择正确的版本号。

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

确保从lib或任何其他文件夹中删除该库

添加-dontwarnproguard.cfg以忽略警告

最新更新