2017-04-05 75 views
1

我們注意到,在我們的proguard-rules.pro我們缺少的的Android,使用ProGuard和系列化

-keep class com.thecompany.theapp.datamodel.** { *; } 

線,這使我們的序列化的數據對象。這導致應用程序在解析序列化的User對象時崩潰,這些對象通過刪除未使用的setter/getters(未刪除字段)而更改。據我們瞭解,這可以根據http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html#6678

在我們將-keep行添加到proguard-rules.pro並調試serializedUser字符串並且字段仍然被模糊處理(a,b,c等)後,Gson解析器仍然設法解析序列化的字符串(yay!)。但爲什麼?! Gson解析器不希望這些字段是否被模糊處理?

當我們從混淆的數據轉到非混淆數據時,這是否意味着後面的問題?任何人都可以提供一些有關proguard和Gson解析序列化對象之間的交互如何工作的清晰度?

這是我們如何使用解析的GSON數據對象:

String serializedUser = EncPrefUtil.decryptStringPref(context, R.string.pref_key_user); 
User user = !TextUtils.isEmpty(serializedUser) ? new Gson().fromJson(serializedUser, User.class) : new User(); 

回答

1

的GSON解析器期望領域是非混淆但不會使其崩潰。它會解析對象並找不到相應的字段,然後將字段初始化爲默認值。

如果在模糊字段名稱和原始字段名稱(對於不同類型的字段)之間存在匹配,它可能會崩潰。例如,如果你得到了名爲'x'和'y'的變量,那麼這可能會發生,因爲這是一個混淆可能出現的名稱。

因此,您不能簡單地從混淆模式切換到非混淆模式,您可以實現自己的解析器並執行轉換步驟,將舊的'錯誤'混淆序列化轉換爲新的未混淆的對象,然後將其序列化。

,這會很有幫助 How do I write a custom JSON deserializer for Gson?