2017-04-05 78 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?