Posted at

リリースビルドだけGsonでパースできない

More than 1 year has passed since last update.


事象

今までのコードが手作業でJsonをパースしてたので、APIのレスポンスに値が追加されるたびに自前のparserも書き足す運用だった。毎回修正箇所も多くなるのでGsonで一発Parse!スマートやん!てやろうとしてた


Gsonの導入

    protected static final Gson GSON = new GsonBuilder().serializeNulls().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();

これでをいろんなAPIで使いまわすつもりでstatic宣言。

FieldNamingPolicyをセットするとJSONが何ケースで返ってくるかを指定していい感じにDtoにパースしてくれる

この場合はjsonでCodeをdtoのcodeに代入してくれる

http://qiita.com/yysk/items/e549ba40bc2accfdff35


デバッグまでは何も問題なし。

デバッグまでは何も問題なく通っていたがリリースビルドにした瞬間うまくいかず。

本番APIが変わったのか、色々試したけど問題なさそう。


結局Proguardだった

今まで@SerializeNameのアノテーションを使ってパースをしていたのでリリースビルドしても問題なかったが、

リリースビルドにすると難読化され、クラス名が変わってしまうのでGsonがうまくパースできないそう。

パース後のDtoがnullなので焦った。


proguard-rules.pro

-keep class jp.co.hoge.parser.response.** { *;}


proguardでレスポンスをパースする対象のDtoの難読化をしないように設定するとこれは解決される。

http://stackoverflow.com/questions/30001674/gson-deserialize-null-pointer-in-released-apk

お陰で全然触ってこなかったproguardのことも勉強しなきゃなと思いました…。

完全にこの記事と同じ。結構時間かかっちゃったけどここまでたどり着くのに時間がかかってしまった

http://qiita.com/petitviolet/items/1b709f3f0db2659a271a