38

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

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

4

5 回答 5

49

可能是“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 或 -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:

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

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

选项 #4: Android Proguard 重复定义

通过将第 3 方库移动到另一个目录(在我的情况下为“lib”)来解决此问题。然后添加

-injars lib/jmdns.jar 

到 proguard.cfg 文件。

选项 #5: Android - Proguard 重复 zip 输入错误

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

-injars bin/classes

选项 #6: 使用 proguard 的 Android 混淆应用程序会不断混淆库 jar - 是吗?

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

-keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; }

选项 #7:

一个奇怪的解决方案(删除 src 文件夹中的 META-INF 文件夹)类似于此处的内容。

于 2013-05-16T11:54:18.117 回答
4

我用packagingOptionsin excludebuild.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'
}

替换pickFirstexclude

于 2014-07-24T06:53:56.333 回答
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 中。

于 2013-11-20T10:34:58.213 回答
0

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

dependencies { compile 'com.android.support:support-v13:XXX' } 其中 XXX 是基于您正在编译的 API 的正确版本号。如果您通过 UI 在 Project Structure > (your module) > Dependencies > + Button > Library 依赖项中包含此依赖项,它将帮助您选择正确的版本号。

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

确保从 libs 或其中存在的任何其他文件夹中删除此库

于 2016-01-09T10:03:57.490 回答
-5

添加-dontwarnproguard.cfg以忽略警告

于 2013-06-17T09:35:44.383 回答