Почему в моем приложении есть ClassNotFoundException?
Фон
Не так давно Google изменил консоль Google Play, так что о сбоях автоматически сообщается, как только они происходят, и является частью того, что они называют "Android Vital".
С этого дня я получил много сообщений о сбоях, которые я решил исправить для своего приложения.
Эта проблема
Среди некоторых ошибок, которые я исправил (и одной, которых у меня нет, здесь), есть еще одна довольно распространенная ошибка, с этим журналом аварий или аналогичным:
java.lang.RuntimeException:
at android.app.LoadedApk.makeApplication(LoadedApk.java:572)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4768)
at android.app.ActivityThread.access$1500(ActivityThread.java:176)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1498)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Native Method:0)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
Caused by: java.lang.ClassNotFoundException:
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newApplication(Instrumentation.java:984)
at android.app.LoadedApk.makeApplication(LoadedApk.java:567)
Похоже, что эта авария затрагивает различные версии Android и устройства, но пока нет особых подсказок о том, как это исправить:
Что я пробовал
Единственное, что я нашел, чтобы решить такой сбой, это использовать multi-dex, как написано здесь.
Видя, что, хотя мое приложение очень маленькое и почти не использует сторонние библиотеки (следовательно, даже не достигает количества методов 64 КБ), и что мультидекс даже не нужен в Android 5.x и выше, мне все равно было любопытно если это поможет, но всего за один день попытки, это фактически приведет к более частому падению:
Поэтому я быстро перестал его использовать и вернулся без него.
Вопросы
- Почему это происходит?
- Есть ли способ избежать этого? Поможет ли избежать расширения класса приложения?
- Насколько распространено это для других приложений?
- Почему мультидексинг на самом деле вызывает больше проблем?
- С точки зрения пользователей, есть ли у пользователей, которые имеют эту проблему - всегда есть? У определенных устройств или версий Android есть эта проблема? Помогает ли перезапуск приложения или переустановка? Какой именно опыт пользователи получают от этого?
2 ответа
Мне удалось уменьшить его количество, добавив эти строки в мой файл Proguard:
-keep class android.app.Application
-keep class <<MyPackage>>.MyApplication
это может быть сокращено до:
-keep class * extends android.app.Application
В соответствии с исходным кодом Android я предполагаю, что это исправило первую проблему.
Я также обновил все свои библиотеки до последних версий (Google Play Services 11.0.2, поддержка lib 25.4.0), которые должны были исправить вторую.
ОБНОВЛЕНИЕ: это не решает проблему полностью. Я получил гораздо меньше случаев, но есть еще.
Если у вас есть gradle minify enabled
у вас также есть файл с именем app\build\outputs\mapping\release\usage.txt
,
Внутри этого файла вы увидите список всего раздетого кода из вашего apk. Проверьте там, если какой-либо код, который вам действительно нужен, был удален proguard.
Если вы найдете там необходимый код, вы должны добавить инструкции в файл конфигурации Proguard, чтобы сохранить его.