我正在使用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
中使用packagingOptions
和exclude
,我和你有同样的问题。
你可以用这个来修复它。
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或任何其他文件夹中删除该库
添加-dontwarn
到proguard.cfg以忽略警告