Firebase Crashlytics сообщает о поддельном cra sh проекте Android с Retrofit и сопрограммами - PullRequest
0 голосов
/ 22 апреля 2020

Crashlytics сообщает о cra sh в моем проекте, когда определенный сетевой запрос возвращает 400. Мне удалось воспроизвести эту проблему, и приложение отображает всплывающее окно с ошибкой, как и ожидалось, но оно не дает сбоя. Я довольно уверен, что приложение не падает с указанной скоростью в Crashlytics, однако, я обеспокоен этими цифрами, и я хотел бы, чтобы они были точными.

Кроме того, Crashlytics показывает, что это sh происходит в очень старых версиях приложения, когда этого не происходило (до того, как kotlin или сопрограммы были добавлены в проект).

Вот трассировка стека:

Fatal Exception: retrofit2.HttpException: HTTP 400 Bad Request
   at retrofit2.KotlinExtensions$await$2$2.onResponse + 49(KotlinExtensions.java:49)
   at retrofit2.OkHttpCall$1.onResponse + 129(OkHttpCall.java:129)
   at okhttp3.RealCall$AsyncCall.execute + 174(RealCall.java:174)
   at okhttp3.internal.NamedRunnable.run + 32(NamedRunnable.java:32)
   at java.util.concurrent.ThreadPoolExecutor.runWorker + 1113(ThreadPoolExecutor.java:1113)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run + 588(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run + 818(Thread.java:818)

Кто-нибудь сталкивался с подобной проблемой или может иметь представление о том, что здесь происходит?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

У меня такая же проблема. Это началось после переписывания всех запросов от Rx к сопрограммам. Отчеты отображаются в Play Console и Crashlytics с разными исключениями.

Вот пример моего кода:

@Singleton
@Provides
fun providesApi(client: OkHttpClient, gsonConverterFactory: GsonConverterFactory): Api {
    return Retrofit.Builder()
            .baseUrl("https://url")
            .client(client.newBuilder().addInterceptor { chain ->
                val request = chain.request().newBuilder()
                        .addHeader("Header1", ...)
                        .addHeader("Header2", ...)
                        .build()
                chain.proceed(request)   
            }.build())
            .addConverterFactory(gsonConverterFactory)
            .build()
            .create(Api::class.java)
}

viewModelScope.launch {
    try {
        val response = api.request()
    } catch (e: Exception) {
        Log.e("TAG", "Error", e)
    }
}

Отчеты показывают, что он падает на chain.proceed(request). Но когда я пытаюсь воспроизвести его, установив тайм-аут на 1 секунду или даже вручную выдав исключение внутри перехватчика, все исключения попадают внутрь блока try, и он вообще не обрабатывает sh. Примеры исключений:

java.net.SocketTimeoutException: 
  at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException (Http2Stream.java:4)
  at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut (Http2Stream.java:8)
  at okhttp3.internal.http2.Http2Stream.takeHeaders (Http2Stream.java:24)
  at okhttp3.internal.http2.Http2Codec.openResponseBody (Http2Codec.java:2)
  at okhttp3.internal.http.CallServerInterceptor.intercept (CallServerInterceptor.java:27)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:2)
  at okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:4)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:2)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:69)
  at okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:69)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:2)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:27)
  at okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:27)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:2)
  at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:70)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:2)
  at okhttp3.internal.http.RealInterceptorChain.a (RealInterceptorChain.java:6)
  at myproject.dagger.Module$providesApi$1.intercept (Module.java:4) <------------------ HERE
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:2)
  at okhttp3.internal.http.RealInterceptorChain.a (RealInterceptorChain.java:6)
  at okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:12)
  at okhttp3.RealCall$AsyncCall.execute (RealCall.java:9)
  at okhttp3.internal.NamedRunnable.run (NamedRunnable.java:17)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
  at java.lang.Thread.run (Thread.java:764)

Или

retrofit2.HttpException: 
  at retrofit2.KotlinExtensions$await$2$2.onResponse (KotlinExtensions.java:2)
  at retrofit2.OkHttpCall$1.onResponse (OkHttpCall.java)
  at okhttp3.RealCall$AsyncCall.a (RealCall.java)
  at okhttp3.internal.NamedRunnable.run (NamedRunnable.java)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
  at java.lang.Thread.run (Thread.java:841)

Действительно расстраивает, когда я получаю тысячи отчетов каждый день.

0 голосов
/ 23 апреля 2020

Well Firebase не будет сообщать Crash, если только приложение, запущенное на устройстве конечного пользователя, не вызывает ошибку ANR(Application Not Responding).

Я бы предложил для тестирования приложения на других физических устройствах, если это возможно, или на нескольких различных эмуляторах android с кодом версии, в котором не работают отчеты Firebase.

...