Неожиданный сбой в BaseDexClassLoader
Этот сбой произошел с 1800 пользователями нашего приложения с 1,2 активными пользователями ежемесячно (согласно Google Developer Console). Довольно редко, но это происходит.
Android 4.1 до 6, но нет Android 7 в отчетах.
Какова может быть природа этого ClassNotFoundException в BaseDexClassLoader. Можем ли мы избежать этого?
java.lang.RuntimeException: в android.app.LoadedApk.makeApplication(LoadedApk.java:572) в android.app.ActivityThread.handleBindApplication(ActivityThread.java:4831) в android.app.ActivityThread.access$1500(ActivityThread.java:178)
на android.app.ActivityThread$H.handleMessage(ActivityThread.java:1531)
на android.os.Handler.dispatchMessage(Handler.java:111) на android.os.Looper.loop(Looper.java:194) на android.app.ActivityThread.main(ActivityThread.java:5637) на java.lang.refle.Method.invoke(Method.java:0) в java.lang.reflect.Method.invoke(Method.java:372) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)Вызывается: java.lang.ClassNotFoundException: в dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) в java.lang.ClassLoader.loadClass(ClassLoader.java:511) в java.lang.ClassLoader.load. Java:469) на android.app.Instrumentation.newApplication(Instrumentation.java:985)
на android.app.LoadedApk.makeApplication(LoadedApk.java:567)
1 ответ
ПРИМЕЧАНИЕ: приведенный ниже ответ может быть неточным и не поддающимся проверке, потому что это исключение практически невозможно симулировать в тестовой среде. Если у кого-то есть больше информации по теме или, возможно, окончательное решение, пожалуйста, опубликуйте ее здесь. Я заранее прошу прощения, если эта информация окажется ложной, но она основана на моем опыте и понимании
Есть несколько вариантов java.lang.ClassNotFoundException
в Android большинство из них вызвано неправильной конфигурацией Proguard, IDE неправильно закрывает предыдущий запущенный экземпляр устройства во время сборки и т. д.
Все это "нормально" ClassNotFoundException
Они различимы, потому что в некоторой части исключения есть нечто, связанное с самим приложением, например:
java.lang.RuntimeException: Unable to instantiate application com.my.package.CustomApplication: java.lang.NullPointerException
или же
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.package/com.my.package.MyClass}: java.lang.ClassNotFoundException: Didn't find class "com.my.package.MyClass" on path: DexPathList[[zip file "/data/app/com.my.package-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.my.package-1, /vendor/lib, /system/lib]]
Хотя тот, с которым вы сталкиваетесь, совершенно не связан с вашим приложением, поскольку ясно, что нет ссылок на компоненты вашего приложения. Это ошибка в том, как система загружает APK и пытается выполнить часть вашего кода (например, Receiver), когда ваше приложение удаляется и переустанавливается из-за обновления.
Я думаю, что это происходит здесь:
- Приложение установлено
- Система хочет запустить один из ваших компонентов (например,
<receiver>
)- Приложение удалено из-за нового обновления (этот шаг должен длиться всего несколько секунд)
- Система больше не может найти ваше приложение и выдать ошибку, которую вы опубликовали
- Обновление установлено, и ваше приложение снова начинает работать
Эта комбинация факторов может объяснить, почему у вас есть только "несколько" сбоев, учитывая общее количество активных пользователей.
Что вы можете сделать по этому поводу? Я ничего не думаю, потому что это ошибка в том, как система обрабатывает этот особый случай. Этот комментарий в одном из нескольких связанных вопросов имеет тот же вывод.
Вы можете попробовать создать кастом ClassLoader
где вы можете обработать Исключение самостоятельно и молча завершить процесс приложения, не прерывая работу приложения. Таким образом, ваши пользователи не должны ничего замечать (я не знаю, замечает ли пользователь это на самом деле, возможно, это внутреннее исключение, обработанное система и пользователь ничего не видит)
Тот факт, что вы не сталкивались с отчетами для Android 7, может быть признаком того, что они устранили проблему в последней версии Android класса LoadedApk
PS: искренне я не думаю, что это связано с мультидексингом, но вы можете выполнить некоторые тесты, чтобы убедиться,