Android Proguard重复定义

时间:2012-01-10 15:24:42

标签: android proguard

我正在尝试将第三方库(JmDNS)添加到我的Android项目中。

我在基础项目目录下创建了一个文件夹'libs',并将jar文件放在目录中。

当我尝试使用Ant(ant release)构建项目时,我收到了一个“重复定义”通知,其中包含JmDNS jar文件中每个类的内容。

....
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.Canceler]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.DNSStateTask]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.Prober]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.Renewer]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.package-info]
[proguard] Note: duplicate definition of library class [javax.jmdns.package-info]
[proguard] Note: there were 357 duplicate class definitions.

构建也失败,并出现以下错误:

BUILD FAILED
/path/Tools/ant-android-scala/build-scala.xml:183: Can't write [/path/bin/projectname-debug-shrinked.jar] (Can't read [/path/projectname/libs/jmdns.jar(;;;;!META-INF/MANIFEST.MF,!library.properties)] (Duplicate zip entry [jmdns.jar:javax/jmdns/JmDNS$Delegate.class]))

我已经确定jar文件只包含一次,而且我没有其他方法可以在项目的任何地方包含重复的源文件。

为什么Proguard会抱怨重复定义?

2 个答案:

答案 0 :(得分:12)

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

-injars lib/jmdns.jar 

到proguard.cfg文件。

如果第三方lbs包含在'libs'文件夹中,则它们将被处理两次。

答案 1 :(得分:1)

在目前的progaurd版本中,没有必要指定伤害。它默认处理。这可能是由于以下原因 -

1)在一些引用的库中复制jar文件。

解决方案 - 从应用程序中删除它并将其作为参考库

2)可能是由于应用程序gradle文件和引用的库gradle文件之间存在不同的gradle版本。使它一样。

解决方案 - 将gradle文件编辑到引用的库/ Project的gradle文件之一。请参阅两个项目的类路径相同。

dependencies { classpath 'com.android.tools.build:gradle:1.3.0' }

我遇到了这两个问题,纠正了它并且有效。