启用ProGuard规则后,Gson解析不起作用

时间:2017-03-14 12:57:01

标签: android-volley android-proguard android gson

[![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.** { *; }
  

解析方法

 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();
            }
        }
    }

3 个答案:

答案 0 :(得分:2)

您错过了ResponseStatus的规则:

-keep class com.yourapp.yourpackage.ResponseStatus { *; }

可能发生的事情是,ProGuard正在混淆ResponseStatus的方法和字段,当Gson试图设置它们的名称不再匹配时。请记住,对于与Gson一起使用的每个模型类,都需要-keep class规则。

答案 1 :(得分:0)

在Android Sutdio的 proguard-rules.pro 文件中添加以下Proguard规则。

Gson

-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }

保持模型不受Proguard的约束

-keepclassmembers class com.yourpackage.models** { <fields>; }
-keep class com.yourpackage.models{ *; }

答案 2 :(得分:0)

使用-keep是一种不好的做法,您永远都不要这样做。您几乎永远不想使用-keep;。如果您确实需要ProGuard规则,通常需要更具体的变体之一

-keepclassmembers-这仅保护类的成员免于收缩和混淆。

-keepnames-这允许缩小类和成员,但不能混淆。也就是说,任何未使用的代码都将被删除。但是保留的代码将保留其原始名称。

-keepclassmembernames-删除未使用的类,重命名剩余的类,删除那些类的未使用成员,但随后其余成员保留其原始名称。

有关更多信息,请阅读this

PS-这就是我为Gson所做的

-keepclassmembernames class rscom.pojo.** { <fields>; }