【问题标题】:why Gson change property after release?为什么Gson在发布后会改变财产?
【发布时间】:2016-06-05 18:14:38
【问题描述】:

我的班级是:

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

为什么??

【问题讨论】:

  • 你在用proguard吗?
  • 是的。我使用了 proguard 和 minifyEnablaed 。

标签: java android debugging release gson


【解决方案1】:

在发布模式下,正如你在 cmets 中所说,你有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 所说,您还可以在类/字段中使用 @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;
}

【讨论】:

  • 在 Android 中,您也可以在 CameraSize 类中添加 @Keep 注释。
  • @MarcinKoziński 没错!顺便说一句,我仍然更喜欢将我的“保留”全部保存在 proguard 文件中,以避免忘记一些东西。
  • 我想这是个人喜好。我总是忘记添加到 ProGuard 文件中,添加 @Keeps 对我来说更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
相关资源
最近更新 更多