2011-07-21 69 views
4

我在使用Proguard和一些庫的Android項目上遇到了一些麻煩。具體來說,我有一個XmlPullParser碰撞,無論我似乎做什麼,我似乎無法解決它。下面是我使用的庫:問題與Proguard和XmlPullParser

JacksonParser,包括:

  • 傑克遜all.1.6.4.jar
  • 喬達-time.1.6.2.jar
  • jsr311- API-1.0.jar
  • stax2-API-3.0.0.jar

XStream的,其包括

  • xpp3_min-1.1.4c.jar
  • XStream的換Android的1.0.0.jar

也有其他人,但他們是一個不是問題的問題。這些似乎是我們問題的罪魁禍首。

具體來說,問題是:

優化

,如果我做了一個優化,我得到 「轉換爲Dalvik的失敗,1」。在"Conversion to Dalvik format failed with error 1" on external JAR有一個特別的帖子,它指出我有一個重複的XmlPullParser類的方向。這是有意義的,因爲使用的XStream app3_min-1.1.4c.jar,其包括具有比包括在所述的android.jar所述一個更好的/附加的功能性的XmlPullParser。正因爲如此,我已經嘗試了通配符xmlpull **去除的android.jar:

-libraryjars <java.home>/lib/rt.jar;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/**) 

,我也已經嘗試明確刪除它們:

-libraryjars <java.home>/lib/rt.jar;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!org/xmlpull/v1/XmlPullParserFactory,!org/xmlpull/mxp1/MXParser) 

但既不修復提供了幫助。

別急,還有更多(圍繞同一個問題都集中了,所以我想如果我解決這個問題之一,其他走開)。

混淆

如果我試圖混淆,我得到以下運行時錯誤:

java.lang.NoSuchMethodError: android.content.res.XmlResourceParser.s 
looking this up in the mapping, i get: .s = abstract int next() 

所以它缺少next()方法。那爲什麼這種方法失蹤?我不明白。我甚至嘗試這樣做:

-keep class android.content.res.XmlResourceParser { int next(); } 

確保該方法得到保留,但仍然我得到同樣的問題。

收縮

也在不斷縮小似乎失敗。該應用程序啓動,但從來沒有得到任何地方,它只是不斷嘗試反覆推出第一個活動,給我一個無用的錯誤。儘管如此,我並不那麼擔心,但如果我可以使混淆和優化工作,我可以不縮小地生活。

更多信息

作爲參考點,我試圖引用我的庫兩種方式,一是採用injars:

-injars ReferencedAssemblies/XStream/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF) 
-injars ReferencedAssemblies/JacksonParser/jackson-all-1.6.4.jar(!META-INF/MANIFEST.MF,!META-INF/ASL2.0,!META-INF/LICENSE,!META-INF/NOTICE) 
-injars ReferencedAssemblies/JacksonParser/joda-time-1.6.2.jar(!META-INF/MANIFEST.MF) 
-injars ReferencedAssemblies/JacksonParser/jsr311-api-1.0.jar(!META-INF/MANIFEST.MF) 
-injars ReferencedAssemblies/JacksonParser/stax2-api-3.0.0.jar(!META-INF/MANIFEST.MF) 
-injars ReferencedAssemblies/XStream/xstream-for-android-1.0.0.jar(!META-INF/MANIFEST.MF) 

這甚至不會建立。

我也做到了這一點:

-libraryjars <java.home>/lib/rt.jar 
    ;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/**) 
    #;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!org/xmlpull/v1/XmlPullParserFactory,!org/xmlpull/mxp1/MXParser) 
    ;ReferencedAssemblies/JacksonParser/jackson-all-1.6.4.jar(!META-INF/MANIFEST.MF,!META-INF/ASL2.0,!META-INF/LICENSE,!META-INF/NOTICE) 
    ;ReferencedAssemblies/JacksonParser/joda-time-1.6.2.jar(!META-INF/MANIFEST.MF) 
    ;ReferencedAssemblies/JacksonParser/jsr311-api-1.0.jar(!META-INF/MANIFEST.MF) 
    ;ReferencedAssemblies/JacksonParser/stax2-api-3.0.0.jar(!META-INF/MANIFEST.MF) 
    ;ReferencedAssemblies/XStream/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF) 

這讓我最遠的,我能夠導出APK,如果我不優化。

我也做到了這一點:

-dontwarn org.xmlpull.v1.** 

,因爲這似乎是一個已知的問題(參見前面的鏈接)

任何人有怎麼在這裏上的任何想法或如何解決呢?我有一種感覺,這與我使用XStream和JacksonParser這兩個事實有關,也許其中一個JacksonParser庫也有一個XmlPullParser?事情是,這將解釋優化錯誤,但不是模糊錯誤。我不知道那個。爲什麼不找到這種方法,甚至如果我明確保留它?

謝謝大家。

回答

1

您的ProGuard配置和構建過程似乎混合了程序罐和庫罐。

對於ProGuard,您可以將所有列出的瓶子指定爲輸入罐(帶有罐子)。他們的處理版本將在輸出jar(-outjars)中結束。

確實可以通過從android.jar中篩選出來來避免有關重複xmlpull類的警告。如果輸入瓶中有任何重複,ProGuard也會打印出警告。然後,您可以過濾掉這些重複項。

你不應該指定<java.home>/lib/rt.jar作爲庫jar,因爲這個jar不作爲Android設備上的庫存在。有些列出的jar雖然依賴於它,但至少有一部分與Android運行時並不完全兼容。避免警告有關違規類的最乾淨的解決方案是將其從相應的輸入罐中濾除(例如,過濾器!com/thoughtworks/xstream/converters/extended/ColorConverter.class)。或者,您可以直接關閉這些警告(例如-dontwarn com.thoughtworks.xstream.converters.extended.ColorConverter)。

對於Dalvik編譯器,您只應該指定處理過的輸出jar,而不是指定進入它的任何程序jar。否則,你會得到重複的類:一些未處理的副本和一些部分混淆的副本。它們不會混合並導致Error1和NoSuchMethodErrors。

0

XML解析可以在Android的一個真正的痛苦。我最近在嘗試在Android上使用Jackson XML數據綁定時遇到了類似的問題。

我結束了使用工具瓶瓶鏈接,進入衝突的階級,我試圖用一個不與Android平臺類衝突的新包名的庫:

http://code.google.com/p/jarjar/

您可以告訴Jar Jar Links在我們提供的與Android衝突的XML庫JAR文件(即javax.xml.stream.*)中查找名稱空間,並讓JarJar將它們重命名爲不衝突的內容(即edu.usf.cutr.javax.xml.stream.*)。然後Android會接受沒有Conversion to Dalvik format failed with error 1而不衝突的庫。

這裏有一個zip file,包括我以前做的,我需要的XML庫,這是一個批量轉換文件:

包含generate_android_jarsv21.bat批處理文件以自動執行使用JarJar一次處理多個XML庫JAR的轉換過程。

JarJar使用一系列規則來更改JAR文件中的名稱空間。下面是一個重命名的javax.xml.stream.*edu.usf.cutr.javax.xml.stream.*所有出現我rules.txt文件的內容:

rule javax.xml.stream.** [email protected]

你應該能夠遵循類似的過程,您正在使用的XML庫。通過將庫類移動到新的包中解決包中的衝突問題後,Proguard的其他下游問題應該自行解決。

我這裏寫的完全手冊,包括 「修改XML庫爲Android」 更詳細:

https://github.com/CUTR-at-USF/SiriRestClient/wiki/Modifying-XML-libraries-for-Android

8

這個工作對我來說:

-dontwarn org.xmlpull.v1.** 
-dontnote org.xmlpull.v1.** 
-keep class org.xmlpull.** { *; } 
+0

這實際上爲我工作。至少目前看來我沒有問題。在將我的應用中的部分Google Play服務更新爲最新版本並運行proguard之後,我遇到了此問題。 – Armando