Сбои classnotfound не отображаются в crashlytics, а в консоли Google Play

Мы пытаемся отладить сбой, который случается у некоторых пользователей, но не можем точно определить, что это такое.

В консоли Google Play мы видим это:

java.lang.RuntimeException:  
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3331)
  at android.app.ActivityThread.-wrap20 (ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1734) 
  at android.os.Handler.dispatchMessage (Handler.java:102) 
  at android.os.Looper.loop (Looper.java:154)
  at android.app.ActivityThread.main (ActivityThread.java:6688)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:380)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3326)

У нас в проекте настроен Crashlytics, и он загружается в первую очередь при запуске приложения. Я подозреваю, что, возможно, один из классов отсутствует в манифесте, но мы посмотрели на него (даже отключили APK, чтобы убедиться), и все они есть.

Мы подозреваем, что, возможно, это класс, который используется одним из действий во время инициализации, но некоторые из них являются сторонними SDK, поэтому у нас нет доступа к их источнику.

Есть ли способ увидеть имя класса, которое не было найдено? Ошибки не отображаются в крашлитиках, и мы не можем воспроизвести их ни на одном из имеющихся у нас устройств / эмуляторов.

Спасибо!

Обновлено: частичное разрешение

Проблема закончилась тем, что мы использовали пакет уведомлений, для которого требуются записи, зависящие от поставщика (которых у нас нет на наших тестовых устройствах) в AndroidManifest.xml. После реинтеграции почти всех сторонних сервисов мы в конечном итоге увидели, что отчет о сбое исчез.

Нам не удалось достичь нашей общей цели (получить текст исключения, а не только трассировку стека исключений из исключений, зарегистрированных в консоли разработчика Google Play), поэтому нет "хорошего" способа (насколько нам известно) найти какой класс пропал. Довольно разочаровывающий TBH.

привет, не могли бы вы указать, в какой версии ОС Android происходит сбой? Вы запускали lint в своем приложении, чтобы оно могло определить, есть ли какой-либо вызов api времени выполнения, который недоступен в предыдущих версиях Android?

user6327816 23.03.2018 13:04

Это происходит практически на всех версиях Android. Мы не можем запустить lint, поскольку APK создается Adobe Air.

Noam 26.03.2018 11:42

Возможно, когда вы добавили Crashlytics, он начал вылетать, поэтому Crashlytics является корнем проблемы

Wrobel 28.03.2018 09:53

См. Это сообщение SO: stackoverflow.com/questions/36881299/…

Sandeep R Venkatesh 28.03.2018 10:38
10
4
487
3

Ответы 3

Таким образом, не все пользователи сталкиваются с этим исключением. Очевидно, что во время выполнения для этих пользователей такой класс не известен загрузчику. Я считаю, что вы используете библиотеку (например, lib.so, либо собственный собственный код, либо стороннюю библиотеку), собственный код которой не поддерживает определенную архитектуру (например, MIPS или Intel), и поэтому такие устройства получают исключение. . Просто нужно кое-что исследовать. Существуют эмуляторы для разных архитектур, поэтому вам может даже не понадобиться реальное оборудование для проверки, является ли это основной причиной.

Crashlytics обновится не сразу.

Об этом сбое будет сообщено в Crashlytics, когда пользователь снова откроет приложение после сбоя.

Возможные случаи

  1. Ваше разбитое устройство может не открыть приложение после сбоя
  2. Может быть удален после сбоя

Попробуйте это в build.gradle:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 26
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

и в классе заявление:

public class MyApplication extends Application {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

Другие вопросы по теме

Статистика консоли Google Play при разработке приложения
Бесплатное приложение запрашивает диалог вариантов покупки в открытом бета-тестировании Google Play Store
Приложение Google Play отклонено из-за ограничения страны
Выпуск приложения Flutter не соответствует требованиям 64-разрядной версии Google Play?
«Необходимо обновить декларацию разрешения на определение местоположения в фоновом режиме». В Play Console ЕЩЕ говорится: «Ваше приложение не требует конфиденциальных разрешений»
PlayStore Deleted App: заставьте всех пользователей удалить его
Google Play удалите уязвимости безопасности моего приложения
Что означает включение последней предыдущей версии в Google Play?
Тестирование кнопки Google IAP
После публикации моих приложений в магазине Google Play мои приложения не могут получать данные из хранилища данных для повторного использования представления разбивки на страницы