启用 ProGuard 规则时 Gson 解析不起作用
Gson parsing is not working when ProGuard rule enabled
[![Proguard规则][gson解析版本2.8.0]][android官方凌空版本1.0.0]
启用 ProGuard 规则后,Gson 解析不工作。我用过官方版的Volley 1.0.0和Gson 2.8.0版。因此,每当我启用 ProGuard 规则时,Gson 解析都不起作用。我还在 proguard-rules.pro
文件中添加了必需的规则,但它仍然不起作用。
依赖性
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.android.volley:volley:1.0.0'
ProGuard 规则:
-ignorewarnings
-keep class org.joda.** { *; }
-dontwarn org.joda.convert.FromString
-dontwarn org.joda.convert.ToString
-dontwarn org.joda.convert.**
-dontwarn org.joda.time.**
-keep class org.joda.time.** { *; }
-keep interface org.joda.time.** { *; }
-dontwarn org.mockito.**
-dontwarn sun.reflect.**
-dontwarn android.test.**
-dontwarn java.lang.management.**
-keepattributes Signature
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.**{ *; }
-dontwarn com.fasterxml.jackson.**
-keep class com.fasterxml.jackson.** { *; }
Parsing method
private static void verifyResponse(final String response, final RequestCode requestCode, final IListener listener) throws IOException, ClassNotFoundException {
if (listener != null) {
ResponseStatus responseStatus;
try {
JSONObject jResult = new JSONObject(response);
if (jResult.has("d")) {
String strResult = jResult.getString("d");
jResult = new JSONObject(strResult);
Debug.trace("ResponseStatusA " + jResult.toString());
}
responseStatus = gson.fromJson(new JSONObject(jResult.toString()).toString(), ResponseStatus.class);
Debug.trace("ResponseStatusB " + responseStatus.getStatus());
processSuccess(jResult.toString(), responseStatus, requestCode, listener);
/* if (responseStatus.isFail()) {
processError(responseStatus, listener);
} else {
if (responseStatus.isSuccess()) {
listener.onHideProgressDialog();
processSuccess(jResult.toString(), responseStatus, requestCode, listener);
}
}*/
} catch (JsonSyntaxException | JSONException e) {
e.printStackTrace();
}
}
}
您缺少 ResponseStatus
的规则:
-keep class com.yourapp.yourpackage.ResponseStatus { *; }
可能发生的情况是 ProGuard 混淆了 ResponseStatus
的方法和字段,当 Gson 尝试设置它们时,它们的名称不再匹配。请记住,对于与 Gson 一起使用的每个模型 class,您都需要一个 -keep class
规则。
在 proguard-rules.pro 文件中添加以下 Proguard 规则 Android Sutdio.
Gson
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
让您的模型从 Proguard 中排除
-keepclassmembers class com.yourpackage.models** { <fields>; }
-keep class com.yourpackage.models{ *; }
使用 -keep
是一种不好的做法,您永远不应该这样做。您几乎不想使用 -keep;如果您确实需要 ProGuard 规则,您通常需要更具体的变体之一
-keepclassmembers
- 这仅保护 class 的成员免于收缩和混淆。
-keepnames
- 这允许缩小 classes 和成员,但不是混淆。也就是说,任何未使用的代码都将被删除。但保留的代码将保留其原始名称。
-keepclassmembernames
- 未使用的 classes 被删除,剩余的 classes 被重命名,那些 classes 中未使用的成员被删除,但随后剩余的成员保留他们原来的名字。
更多信息请阅读this
PS - 这就是我为 Gson 所做的
-keepclassmembernames class rscom.pojo.** { <fields>; }
[![Proguard规则][gson解析版本2.8.0]][android官方凌空版本1.0.0]
启用 ProGuard 规则后,Gson 解析不工作。我用过官方版的Volley 1.0.0和Gson 2.8.0版。因此,每当我启用 ProGuard 规则时,Gson 解析都不起作用。我还在 proguard-rules.pro
文件中添加了必需的规则,但它仍然不起作用。
依赖性
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.android.volley:volley:1.0.0'
ProGuard 规则:
-ignorewarnings
-keep class org.joda.** { *; }
-dontwarn org.joda.convert.FromString
-dontwarn org.joda.convert.ToString
-dontwarn org.joda.convert.**
-dontwarn org.joda.time.**
-keep class org.joda.time.** { *; }
-keep interface org.joda.time.** { *; }
-dontwarn org.mockito.**
-dontwarn sun.reflect.**
-dontwarn android.test.**
-dontwarn java.lang.management.**
-keepattributes Signature
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.**{ *; }
-dontwarn com.fasterxml.jackson.**
-keep class com.fasterxml.jackson.** { *; }
Parsing method
private static void verifyResponse(final String response, final RequestCode requestCode, final IListener listener) throws IOException, ClassNotFoundException {
if (listener != null) {
ResponseStatus responseStatus;
try {
JSONObject jResult = new JSONObject(response);
if (jResult.has("d")) {
String strResult = jResult.getString("d");
jResult = new JSONObject(strResult);
Debug.trace("ResponseStatusA " + jResult.toString());
}
responseStatus = gson.fromJson(new JSONObject(jResult.toString()).toString(), ResponseStatus.class);
Debug.trace("ResponseStatusB " + responseStatus.getStatus());
processSuccess(jResult.toString(), responseStatus, requestCode, listener);
/* if (responseStatus.isFail()) {
processError(responseStatus, listener);
} else {
if (responseStatus.isSuccess()) {
listener.onHideProgressDialog();
processSuccess(jResult.toString(), responseStatus, requestCode, listener);
}
}*/
} catch (JsonSyntaxException | JSONException e) {
e.printStackTrace();
}
}
}
您缺少 ResponseStatus
的规则:
-keep class com.yourapp.yourpackage.ResponseStatus { *; }
可能发生的情况是 ProGuard 混淆了 ResponseStatus
的方法和字段,当 Gson 尝试设置它们时,它们的名称不再匹配。请记住,对于与 Gson 一起使用的每个模型 class,您都需要一个 -keep class
规则。
在 proguard-rules.pro 文件中添加以下 Proguard 规则 Android Sutdio.
Gson
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
让您的模型从 Proguard 中排除
-keepclassmembers class com.yourpackage.models** { <fields>; }
-keep class com.yourpackage.models{ *; }
使用 -keep
是一种不好的做法,您永远不应该这样做。您几乎不想使用 -keep;如果您确实需要 ProGuard 规则,您通常需要更具体的变体之一
-keepclassmembers
- 这仅保护 class 的成员免于收缩和混淆。
-keepnames
- 这允许缩小 classes 和成员,但不是混淆。也就是说,任何未使用的代码都将被删除。但保留的代码将保留其原始名称。
-keepclassmembernames
- 未使用的 classes 被删除,剩余的 classes 被重命名,那些 classes 中未使用的成员被删除,但随后剩余的成员保留他们原来的名字。
更多信息请阅读this
PS - 这就是我为 Gson 所做的
-keepclassmembernames class rscom.pojo.** { <fields>; }