2012-01-10 68 views
10

我試圖添加第三方庫(JmDNS)到我的Android項目。Android Proguard重複定義

我在基礎項目目錄下創建了一個文件夾'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會抱怨重複的定義?

+0

一個乾淨的項目設法修復它(在嘗試了一堆建議的答案後)似乎是一個陳舊的版本的lib被保存在生成​​文件夾或東西 – Fonix 2016-01-04 03:19:16

回答

12

通過移動第三方庫到另一個目錄來解決這個問題,在我的例子'lib'中。然後將

-injars lib/jmdns.jar 

添加到proguard.cfg文件中。

如果第三方lbs包含在'libs'文件夾中,那麼它們將被處理兩次。

+0

我遇到了同樣的錯誤,並解決它根據你的答案 - 順便說一句,我使用完整路徑的罐子在線 - 進入... 謝謝你分享你的答案。 – 2012-04-26 04:45:18

+5

或者只是'-injars libs' – shkschneider 2013-12-20 09:54:53

+0

你有兩個文件夾'lib'和'libs'嗎?你有沒有在你的gradle中編譯fileTree(dir:'libs',include:['* .jar'])'? – NickUnuchek 2016-02-25 15:19:51

1

在當前progaurd版本中沒有必要指定傷害。這是默認處理的。這可能是由於以下原因 -

1)在一些引用庫中複製jar文件。

解決方案 - 從應用程序中刪除它,並讓它成爲參考圖書館

2)可能是由於你的應用程序文件的gradle和引用的庫文件的gradle之間的gradle不同版本。讓它一樣。

解決方案 - 將gradle文件編輯到其中一個引用的庫/ Project的gradle文件。看到兩個項目的類路徑是相同的。

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

我有這兩個問題,糾正它和它的工作。