Android:排球请求在已发布的 APK 中不起作用,而在调试中有效

Android: Volley request is not working in released APK while works in debug

我已经为 POST

创建了一个简单的截击请求
//post request handler
    public void PostRequest(final int queryType, String url, final String jsonData) {
        StringRequest req = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                for (ApiRequestHandler commHandler : responseListeners) {
                    commHandler.responseHandler(response);
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                for (ApiRequestHandler commHandler : errorListeners) {
                    commHandler.errorHandler(error);
                }
            }
        }) {
            @Override
            public byte[] getBody() {
                return jsonData.getBytes();
            }

            @Override
            public String getBodyContentType() {
                return "application/json";
            }

            @Override
            public Map<String, String> getHeaders() {

                HashMap<String, String> headers = new HashMap<>();
                headers.put("Content-Type", "application/json; charset=utf-8");
                return headers;
            }
        };
        getVolleyQueue().add(req);
    }

当我在调试模式下发送请求(Android 设备连接到 Android Studio 时,此方法有效,而当我发布应用程序并收到 400 错误时,此方法无效。 我已经添加了互联网权限。

应用发布时很难调试,收到错误时我只是尝试敬酒。堆栈跟踪就是这样,但对我没有帮助。

com.android.volley.toolbox.BasicNetwork.a(Unknown Source:255),
com.android.volley.NetworkDispatcher.b(Unknown Source:37),
com.android.volley.NetworkDispatcher.run(Unknown Source:5)

我花了一天的时间来解决这个问题,我的一些建议:

我还需要一些有关调试已发布 apk 的更好方法的指南。谢谢!

再深入挖掘之后,我找到了根本原因:

问题是因为我为 minifyEnabled true 的发布构建类型启用了 ProGuard。它通过各种方式压缩和混淆代码,例如更改 class 名称、变量、常量等

Gson,使用动态键命名,使键更短。

为了解决这个问题,我使用了 @SerializedName("keyName") 注释来让 Gson 知道应该将什么作为键。

例如:

public class UserInfo {
    @SerializedName("user_name")
    public String userName;
    @SerializedName("mobile")
    public String mobile;
}

希望这可以节省一些人的一天!