petitviolet blog

    GsonとProguard

    2014-12-11

    QiitaAndroid

    Android で Json を扱うライブラリとして有名な Gson ですが、 Proguard を有効にしたビルドだと問題が発生します

    問題

    普通だと

    new Gson().fromJson(jsonString, Hoge.class);
    

    jsonStringHogeクラスに変換出来るはずです しかし Proguard を有効にしてあると、Hogeクラスのフィールド名が難読化されて例えばアルファベット 1 文字に変更されているため、 jsonStringにおける json のキー名とHogeクラスのフィールド名が一致しなくなりfromJsonによる json のパースに失敗し、 結果として全てnullが入ったHogeクラスのインスタンスが得られることとなります

    解決策

    解決策は 2 つあります

    Proguard でリネームしない

    例えば

    -keepnames class com.example.android.Model.** { *; }
    

    のように、実装したModelパッケージ内の全てのクラスについてクラスとクラスメンバをリネームしないように 設定しておけば解決します リネームさえ防げばいいので、-keepではなく-keepnamesで十分です

    @SerializedNameを使う

    Gson の機能として、クラスのフィールド名と Json のキー名を一致させなくても @SerializedNameを使ってフィールド名とキー名を対応させることが出来ます

    class Hoge {
    	@SerializedName("field_name")
    	private String fieldName;
    }
    

    とすればフィールド名はfieldNameで Json のfield_nameとしてパース出来るようになります

    proguard 難しい...

    from: https://qiita.com/petitviolet/items/1b709f3f0db2659a271a