为什么Gson在发布后会改变财产?

时间:2016-06-05 18:14:38

标签: java android debugging release gson

我的课程是:

private static class CameraSize {
    public CameraSize(int h, int w) {
        this.h = h;
        this.w = w;
    }

    public int h;
    public int w;
}


List<CameraSize> lstCS=new LinkedList<>();
Gson gson = new GsonBuilder().create();
for (int l = 0; l < listSize.size(); l++) {
    int height = listSize.get(l).height;
    int width = listSize.get(l).width;
    CameraSize cs = new CameraSize(height, width);
    lstCS.add(cs);
}
gson.toJson(lstCS);

调试输出:

[{"h":1944,"w":2592},{"h":1458,"w":2592}]

发布中的输出:

[{"a":1944,"b":2592},{"a":1458,"b":2592}]

为什么??

1 个答案:

答案 0 :(得分:4)

在发布模式中,正如您在评论中所说,您有minifyEnabled

混淆过程后,您的字段名称会发生​​变化。如果你想在没有混淆的情况下保留它们,你必须告诉Proguard保留它们。

您可以保留所有嵌套的CameraSize类:

-keep class **$CameraSize { *; }

或只是特定的一个:

-keep class your.package.to.outer.class.OuterName$CameraSize { *; }

您可以更多地指定字段进行优化:

-keepclassmembers class your.package.to.outer.class.OuterName$CameraSize {
    public int h;    
    public int w;
}

用户@MarcinKoziński表示,您还可以在类/字段中使用@Keep注释,以避免混淆过程。

在这种情况下:

private static class CameraSize {
    public CameraSize(int h, int w) {
        this.h = h;
        this.w = w;
    }

    @Keep
    public int h;
    @Keep
    public int w;
}