2011-03-17 252 views
9

當我的應用程序使用ProGuard構建時,它會失敗並顯示以下消息。 我使用Android SDK生成的默認proguard.cfg和一些-libraryjars。 我能爲它做些什麼?Android ProGuard error with org.xmlpull.v1.XmlPullParser

[2011-03-17 09:27:04 - MyProject] Proguard returned with error code 1. See console 
[2011-03-17 09:27:04 - MyProject] Note: there were 4247 duplicate class definitions. 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.AnimationDrawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.BitmapDrawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject]  You should check if you need to specify additional program jars. 
[2011-03-17 09:27:04 - MyProject] Warning: there were 9 instances of library classes depending on program classes. 
[2011-03-17 09:27:04 - MyProject]   You must avoid such dependencies, since the program classes will 
[2011-03-17 09:27:04 - MyProject]   be processed, while the library classes will remain unchanged. 
[2011-03-17 09:27:04 - MyProject] java.io.IOException: Please correct the above warnings first. 
[2011-03-17 09:27:04 - MyProject] at proguard.Initializer.execute(Initializer.java:321) 
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.initialize(ProGuard.java:211) 
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.execute(ProGuard.java:86) 
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.main(ProGuard.java:492) 

顯然,org.xmlpull.v1.XmlPullParser不是一個程序類。 我已將ProGuard更新至最新版本(4.6),但具有相同的警告。

回答

1

根據您提供的部分日誌,Android運行時類org.xmlpull.v1.XmlPullParser已結束在您的程序代碼中。你應該確保它不存在於bin/classeslib的某個jar中,因爲它已經存在於jar庫android.jar中。

此外,您有4247個重複的類定義。這可能是由於你提到的「指定一些圖書館」。我猜這些庫jar已經被構建腳本自動包含了,所以你不應該再指定它們。

+0

埃裏克,他(或在任何情況下,我)在一罐XmlPullParser類在他的庫是這樣的原因它會覆蓋Android內置的XmlPullParser類,這是缺乏一些用途。由於我們在Android上制定proguard.cfg的方式,不可能過濾出內置的程序,我們也不想過濾出更好的AFAIK。如果可能的話,推出我們自己的Android JAR也不太明智。我們應該如何處理?謝謝 – pjv 2011-06-13 18:12:54

+2

如果你的程序jar包含更好的實現,你應該嘗試用「-libraryjars android.jar(!org/xmlpull/v1/**)」來過濾庫版本,所以ProGuard得到乾淨的輸入。如果這是不可能的,你可以指定類似「-dontwarn org.xmlpull.v1。**」。它應該在這種情況下工作,因爲ProGuard使程序類優先於庫類。 – 2011-06-15 22:33:21

2

我沒有解決方案還爲proguard的通過Eclipse的Android運行,但如果你在命令行手動運行ProGuard的,你可以把你的proguard.cfg如下:

-basedirectory /home/pjv/workspace/collectionista-repo/collectionista-main 

-injars /tmp/android_4500371803543847111.jar 
-injars libs/joda-time-1.6.jar(!META-INF/MANIFEST.MF) 
-injars libs/FlurryAgent.jar(!META-INF/MANIFEST.MF) 
-injars libs/veecheck-2.0.jar(!META-INF/MANIFEST.MF) 
-injars libs/commons-lang-2.4.jar(!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt) 
-injars libs/OIAbout-lib-temporary.jar(!META-INF/MANIFEST.MF) 
-injars libs/libGoogleAnalytics.jar(!META-INF/MANIFEST.MF) 
-injars libs/xstream-1.3.1.jar(!META-INF/MANIFEST.MF) 
-injars libs/ZQL_custom.jar(!META-INF/MANIFEST.MF) 
-injars libs/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF) 
-injars libs/GoogleAdMobAdsSdk-4.1.0.jar(!META-INF/MANIFEST.MF) 
-injars libs/bugsense-trace.jar(!META-INF/MANIFEST.MF) 
-outjars /tmp/android_1348923171424559204.jar 

-libraryjars /opt/android-sdk/android-sdk-linux_x86-1.6_r1/platforms/android-12/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class) 

注意如何從android API jar中篩選出XmlPullParser.class

不用擔心與XmlPullParser相關的警告。首先修復錯誤和其他警告,如果必須,請在proguard.cfg中使用-ignorewarnings

+0

與此同時,我轉向更優雅的東西。請參閱http://stackoverflow.com/questions/6780902/problem-with-proguard-and-xmlpullparser/7986229 – pjv 2011-11-02 19:34:23

1

我覺得你的jar包包括XmlPullParser類,而android.jar也包含這個。 因此,您可以刪除jar包中的org.xmlpull.*類,然後重新構建。

+0

你能否闡述這意味着什麼?並可能如何做到這一點。 「jar包」是什麼意思? – Mafro34 2013-12-04 13:27:52

12

加入這一行的ProGuard-project.txt

-dontwarn org.xmlpull.v1.** 

這行project.properties

proguard.config=proguard-project.txt 
+0

我無法找到proguard-project.txt和project.properties。我有兩個.properties文件:1. local.properties 2. gradle.properties。 proguard-rules.pro文件在應用程序模塊 – 2016-12-14 06:02:27

+0

內可用。非常感謝答案。在我的情況下,我必須使用您的答案和-keep類org.xmlpull.v1。** {*; } – Hong 2017-09-27 15:43:03

7

我解決了這個在ProGuard的文件中使用此設置:

-dontwarn org.kobjects.** 
-dontwarn org.ksoap2.** 
-dontwarn org.kxml2.** 
-dontwarn org.xmlpull.v1.** 

-keep class org.kobjects.** { *; } 
-keep class org.ksoap2.** { *; } 
-keep class org.kxml2.** { *; } 
-keep class org.xmlpull.** { *; } 

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontoptimize 
-dontpreverify 
+0

請避免從同樣的答案共享鏈接複製粘貼@Ton – Killer 2016-07-12 10:55:02

+0

我必須添加後續2行ro使其工作-dontwarn org.codehaus。**和-keep class org.codehaus。** {*; } – Pecana 2017-09-29 11:30:42

+0

@Ton我應該在哪裏添加? – 2018-01-04 06:39:38

-2

對我來說我可以通過刪除我以前修改的build.gradle來解決它

我刪除:

 minifyEnabled true 

    shrinkResources true 

,並返回到原來的設置

minifyEnabled false 
+0

解決proguard問題的方法是將proguard關閉? – Daverix 2017-11-29 13:10:05