Android: в выпущенном APK не работает запрос залпа, а в отладке - PullRequest
0 голосов
/ 01 мая 2019

Я создал простой запрос залпа для 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

  • Я также пытался jsonData.getBytes("utf-8");, но не работал

  • Я использую implementation 'com.android.volley:volley:1.1.1'

Мне также нужны некоторые рекомендации по улучшению способов отладки выпущенных apks.Спасибо!

1 Ответ

0 голосов
/ 06 мая 2019

После еще нескольких копаний я смог найти основную причину:

Проблема заключалась в том, что у меня ProGuard включен для типа сборки выпуска как minifyEnabled true.Он сжимает и запутывает код различными способами, такими как изменение имен классов, переменных, констант и т. Д.

Gson, использует динамическое именование ключей для сокращения ключей.

Для решения этой проблемы я использовал @SerializedName("keyName") аннотация, чтобы Gson знал, что считать ключом.

Например:

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

Надеюсь, это спасет чей-то день!

...