为什么 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;
}
我的 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;
}