我正在使用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文件夹中删除了该库,将其添加为项目库并将依赖项添加到两个模块中。这没有解决任何问题,警告仍然存在,我不明白为什么。
我知道这些警告不会影响任何事情,但干净的构建是一个快乐的构建!
答案 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:
虽然警告是无害的,但是干净的构建是一个快乐的构建,所以请尝试:
和
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 以忽略警告