Android,使用proguard和序列化
Android, using proguard and serialization
我们注意到在我们的 proguard-rules.pro 中我们遗漏了
-keep class com.thecompany.theapp.datamodel.** { *; }
行,它保留了我们的可序列化数据对象。这导致应用程序在解析我们通过删除未使用的 setters/getters(未删除字段)而更改的序列化用户对象时崩溃。据我们了解,根据 http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html#6678
这是可以的
在我们将 -keep 行添加到 proguard-rules.pro 并使用仍然混淆的字段(a、b、c 等)调试 serializedUser 字符串后,Gson 解析器仍然设法解析序列化字符串(是的!)。但为什么?! 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();
Gson 解析器希望字段不会被混淆,但这不会使其崩溃。它会解析对象并找到 none 个相应的字段,然后将这些字段初始化为它们的默认值。
如果混淆字段名称与原始字段名称(对于不同类型的字段)之间存在匹配,它可能会崩溃。例如,如果您有名为 'x' 和 'y' 之类的变量,可能会发生这种情况,因为这是混淆可能产生的名称。
所以您不能简单地从混淆转换为非混淆,您可以实现自己的解析器并有一个转换步骤,将旧的 'bad' 混淆序列化转换为新的未混淆对象,然后对其进行序列化。
这可能会有帮助
How do I write a custom JSON deserializer for Gson?
我们注意到在我们的 proguard-rules.pro 中我们遗漏了
-keep class com.thecompany.theapp.datamodel.** { *; }
行,它保留了我们的可序列化数据对象。这导致应用程序在解析我们通过删除未使用的 setters/getters(未删除字段)而更改的序列化用户对象时崩溃。据我们了解,根据 http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html#6678
这是可以的在我们将 -keep 行添加到 proguard-rules.pro 并使用仍然混淆的字段(a、b、c 等)调试 serializedUser 字符串后,Gson 解析器仍然设法解析序列化字符串(是的!)。但为什么?! 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();
Gson 解析器希望字段不会被混淆,但这不会使其崩溃。它会解析对象并找到 none 个相应的字段,然后将这些字段初始化为它们的默认值。
如果混淆字段名称与原始字段名称(对于不同类型的字段)之间存在匹配,它可能会崩溃。例如,如果您有名为 'x' 和 'y' 之类的变量,可能会发生这种情况,因为这是混淆可能产生的名称。
所以您不能简单地从混淆转换为非混淆,您可以实现自己的解析器并有一个转换步骤,将旧的 'bad' 混淆序列化转换为新的未混淆对象,然后对其进行序列化。
这可能会有帮助 How do I write a custom JSON deserializer for Gson?