2017-04-05 12 views
1

を使用して私たちはproguard-rules.proに我々は、シリアライズデータオブジェクトを保持Androidのは、ProGuardのとシリアライズ

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

ラインを、欠落していたことに気づきました。これは、未使用のセッター/ゲッターを削除して(フィールドを削除しないで)変更したシリアル化されたUserオブジェクトを解析する際に、アプリケーションがクラッシュする原因となりました。私たちはこれで大丈夫だと理解しているhttp://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html#6678

私たちはproguard-rules.proに-keep行を追加し、まだ分かりにくいフィールド(a、b、cなど)でserializedUser文字列をデバッグした後も、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?