使用ProGuard后,Volley总是抛出错误

时间:2019-03-18 05:28:29

标签: android android-volley proguard

我在项目中使用Volley和Gson。该项目是一个Lib项目。当我在演示项目中使用我的Lib时,Volley总是抛出错误消息,并显示以下消息:“ org.json.JSONException:字符0处的输入结束”,并且从未获得成功响应。我猜这是由ProGuard引起的。奇怪的是,当我在Lib或Demo项目中设置“ minifyEnabled”时,一切正常。但是,当我在Lib和Demo中都设置“ minifyEnabled”时,凌空总是会失败。现在有人为什么会这样吗?

很抱歉缺少内容...

这是排球错误:

org.json.JSONException: End of input at character 0

这是我的凌空和Gson的ProGuard:

## ----------------------------------
##     Gson
## ----------------------------------
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { *; }
-keep class com.google.gson.stream.** { *; }


## ----------------------------------
##     Glide
## ----------------------------------
-keep class com.bumptech.glide.** {*;}

## -------------------------------------------
##     volley
## -------------------------------------------
-keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.NetworkDispatcher {
    void processRequest();
}
-keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.CacheDispatcher {
    void processRequest();
}
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.Volley
-keepclassmembers class com.android.volley.toolbox.Volley { *; }
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }
-keep class org.apache.http.** {*;}

重要的是,仅当Lib和Demo同时被混淆时才会发生此错误。使用Lib或Demo进行混淆不会出现此问题。

有人帮忙吗?我100%确定我将所有模型类都保存在ProGuard文件中。

2019-03-18 14:38:15.635 11276-11276 W/System.err: com.a.a.m: org.json.JSONException: End of input at character 0 of 
2019-03-18 14:38:15.635 11276-11276 W/System.err:     at com.a.a.a.k.a(Unknown Source:32)

While the com.a.a.a.k is "com.android.volley.toolbox.JsonObjectRequest"

3 个答案:

答案 0 :(得分:0)

将此规则放在proguard中,

afterEach(function () {
    if (this.currentTest.state === 'failed') {    
      var test = this.currentTest

      Cypress.on('test:after:run', (test) => {

        addContext({ test }, {
          title: 'Failing Screenshot: ' + '>> screenshots/' + Cypress.spec.name + '/' + test_name + ' -- ' + test.title + ' (failed)' + '.png <<',
          value: 'screenshots/' + Cypress.spec.name + '/' + test_name + ' -- ' + test.title + ' (failed)' + '.png'
          //value: 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAABkCAYAAAAVORraAAACH0lEQVR'
        })
      });
    } 
  })

答案 1 :(得分:0)

在您的proguard-rules.pro中添加以下行,您可以在Gradle脚本下找到该行

-keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.NetworkDispatcher {
    void processRequest();
}
-keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.CacheDispatcher {
    void processRequest();
}

您也可以参考此link

更新

然后,您应该在图书馆项目的proguard-rules.pro中添加这些规则。如果您在proguard-rules.pro附近看到iamge,则说明该文件用于应用程序模块,那么对于您的库模块添加规则,也应该有另一个proguard-rules.pro。 enter image description here

答案 2 :(得分:0)

尝试在build.gradle中使用以下配置。

android {
...
   useLibrary 'org.apache.http.legacy'
}

我在排球上遇到了类似的问题,但是错误有所不同,以上配置解决了我的问题。根本原因是Gradle插件默认不再包含所有可选库。