2012-12-13 350 views
2

我是新來的整個混淆與Android的東西,但我已經開始嘗試Proguard最後的日子。無論如何,我被困在所謂的Proguard地獄中。Android模糊混淆與Proguard問題

我的應用程序的結構是我有3個不同的項目。一個庫和兩個應用程序項目。這兩個應用程序項目都基於包含應用程序的所有邏輯和庫的庫項目。應用程序項目中幾乎沒有放置任何東西。

但是,當我嘗試導出其中一個應用程序啓用Proguard時,我得到傑克遜JSON解析庫的一些錯誤。我已經嘗試了很多不同的東西,甚至試圖忽略這些錯誤,但這只是使解析部分失敗。所以忽略這些錯誤並不是正確的做法。

這是我的ProGuard-project.txt文件

-assumenosideeffects class android.util.Log { 
    public static *** d(...); 
    public static *** v(...); 
} 
-keep public class com.google.android.vending.licensing.ILicensingService 
-keep class org.codehaus.** { *; } 

而這些都是我得到的錯誤。

Warning: org.codehaus.jackson.map.ext.JodaSerializers$LocalDateTimeSerializer: 
    can't find referenced class org.joda.time.LocalDateTime 
     You should check if you need to specify additional program jars. 
Warning: there were 99 unresolved references to classes or interfaces. 
     You may need to specify additional library jars (using '-libraryjars'). 

回答

2

嘗試添加-keep選項喬達時間類:

-keep public class org.joda.time.** {public private protected *;} 
-dontwarn org.joda.time.** 
+0

偉大的傢伙,這解決了95%的警告,但有4個更多,他們都是這樣的。警告:org.codehaus.jackson.map.ext.DOMSerializer:找不到引用的類org.w3c.dom.bootstrap.DOMImplementationRegistry – parek

+2

嘗試爲org.w3c。**和其他外部庫添加-keep和-dontwarn 。在我的項目中,我試圖使用不同的選項,包括-libraryjars和-injars,但我沒有運氣,所以我必須保留所有來自外部庫的包(即使我的應用程序沒有直接使用它們)。此外,如果您設法導出您的應用程序,請注意,由於模糊的DTO類,反射方法調用的方法,它仍然可能會在運行時崩潰。 – Leszek

0

除了ProGuard的本身,有一件事做的是確保你使用的傑克遜2.x的,不是1.X - - 它具有較少的動態(可選)依賴關係。這減少了PG的噪音。

0

「無法找到引用類」意味着包含這些類的JAR文件需要使用-libraryjars來指定,其工作方式與javac的類路徑非常相似。