为什么 Gson 在发布后更改 属性?

why Gson change property after release?

我的 class 是:

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}]

为什么 ??

在发布模式下,正如您在评论中所说,您有 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;
}

正如用户 @Marcin Koziński 所说,您还可以对 class/fields 使用 @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;
}