Мы пытаемся отладить сбой, который случается у некоторых пользователей, но не можем точно определить, что это такое.
В консоли 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, поскольку APK создается Adobe Air.
Возможно, когда вы добавили Crashlytics, он начал вылетать, поэтому Crashlytics является корнем проблемы
См. Это сообщение SO: stackoverflow.com/questions/36881299/…
Таким образом, не все пользователи сталкиваются с этим исключением. Очевидно, что во время выполнения для этих пользователей такой класс не известен загрузчику. Я считаю, что вы используете библиотеку (например, lib.so, либо собственный собственный код, либо стороннюю библиотеку), собственный код которой не поддерживает определенную архитектуру (например, MIPS или Intel), и поэтому такие устройства получают исключение. . Просто нужно кое-что исследовать. Существуют эмуляторы для разных архитектур, поэтому вам может даже не понадобиться реальное оборудование для проверки, является ли это основной причиной.
Crashlytics обновится не сразу.
Об этом сбое будет сообщено в Crashlytics, когда пользователь снова откроет приложение после сбоя.
Возможные случаи
Попробуйте это в 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);
}
}
привет, не могли бы вы указать, в какой версии ОС Android происходит сбой? Вы запускали lint в своем приложении, чтобы оно могло определить, есть ли какой-либо вызов api времени выполнения, который недоступен в предыдущих версиях Android?