2013-05-03 51 views
33

我使用IntelliJ並在調試模式下運行Proguard,但我似乎無法擺脫警告,如:Proguard警告「不能寫資源[META-INF/MANIFEST.MF](重複的zip條目)」

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文件夾中移除了該庫,將其添加爲項目庫,並將依賴關係添加到兩個模塊中。這並沒有解決任何問題,警告仍然存在,我不明白爲什麼。

我知道這些警告不會影響任何東西,但乾淨的構建是一個快樂的構建!

+2

刪除該庫看起來像'被列入Android的支持,v13.jar'不止一次。另請參閱[警告:無法寫入資源...重複的zip條目](http://proguard.sourceforge.net/manual/troubleshooting.html#duplicatezipentry)。 – devnull 2013-05-03 11:39:46

+0

我不明白這是怎麼回事。就像我所說的那樣,我將庫添加爲項目庫並在兩個模塊中引用它。我需要這樣做,否則應用程序將無法編譯。 – 2013-05-06 08:27:24

+0

可能是'proguard.cfg'問題。你可以發佈嗎?它似乎包含在其中的一些呃,可以被對待兩次。 – 2013-05-16 10:18:41

回答

44

可能是'proguard.cfg'問題。它是否包含任何'-injars'?如果您的項目包含另一個項目作爲庫,則可以處理兩次罐子。你可以發佈你的'proguard.cfg'嗎?從http://proguard.sourceforge.net/index.html#manual/troubleshooting.html

提取物:

你輸入罐包含具有相同名稱的多個資源文件。 ProGuard繼續像往常一樣複製資源文件,跳過具有以前使用名稱的任何 文件。再一次,警告可能是 表示某些問題,所以建議刪除 重複項。一個方便的方法是在 輸入罐上指定過濾器。沒有選擇關閉這些警告。

選項1:

正如你不能發表你的「-injars」,檢查它們是否包含任何「Android的支持,v13.jar」或庫包含在您的項目,該項目本身也包括'android-support-v13.jar'。

假設您在IntelliJ IDEA中使用Ant構建,您不得添加-injars,-outjars或-libraryjars選項; Ant腳本已經爲你做了。

選項#2:

雖然警告是無害的,乾淨的構建是一個快樂的構建,所以嘗試:

http://www.dancartoon.com/2012/01/14/fixing-proguard-warning-cant-write-resource-meta-infmanifest-mf/

https://gist.github.com/paulpv/4439012

選項#3:

每個 '-injars' 命令

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

OPTION#4之後包括(!META-INF/MANIFEST.MF)Android Proguard Duplicate Definition

通過移動第三方庫到另一個目錄固定這,在 我的情況'lib'。然後將

-injars lib/jmdns.jar 

添加到proguard.cfg文件中。

選項#5:Android - Proguard duplicate zip entry error

如果您的ProGuard配置文件中包含以下行,刪除它:

-injars bin/classes 

OPTION#6:Android obfuscate app using proguard keeps obfuscating library jars - or is it?

我找到了另一種製作Progua的方法rd離開庫罐單獨是要 要求它保留它們的軟件包名稱,例如:

-keep class javax。** {*; } -keep class org。** {*; } -keep class twitter4j。​​* {*; }

OPTION#7:

甲怪異溶液(刪除在src文件夾META-INF文件夾),以類似的東西here

+0

是的,它包含一個帶有「-injars」的部分。我無法發佈文件,它包含我無法透露的敏感數據。 – 2013-05-19 16:22:09

+0

android-support-v13.jar只是一個例子,主模塊的libs文件夾內的所有其他庫也會生成該警告。 – 2013-05-23 20:43:28

+0

嘗試從-injars – 2013-05-23 21:20:32

-4

添加-dontwarnproguard.cfg忽略警告

+2

這不是一個好的選擇,因爲無論如何你都只是無視所有警告。其中有些人可能真的幫助你! – Richard 2015-07-09 15:51:22

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中。

1

我用與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' 
} 

pickFirst替換爲exclude

+4

使用'pickFirst'或'exclude'時,運行發佈版本時仍然會輸出警告。你能證實這一點嗎? – JJD 2014-11-02 23:02:59

+0

@JJD它仍然輸出警告。 – 2015-08-02 20:44:31

+0

pickFirst不會阻止警告發生。 – 2015-08-02 20:45:08

0

不要通過直接包含jar來引用支持庫;當你這樣做時,構建系統不能在它的多個版本之間消除歧義,並且你會得到這種類型的錯誤。通過引用它的Maven包括它的座標:

依賴{ 編譯「com.android.support:support-v13:X.X.X」 } 其中X.X.X是根據你編譯反對什麼API正確的版本號。如果您通過UI在Project Structure>(您的模塊)> Dependencies> + Button> Library dependency中包含此依賴項,它將幫助您選擇正確的版本號。

您可能還發現通過Maven座標包含其他依賴關係非常方便,而不是使用它們的jar包;相同的庫依賴關係UI具有搜索功能來幫助您查找庫。

務必從庫或任何其他文件夾是目前內