Почему в моем приложении есть 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 и выше, мне все равно было любопытно если это поможет, но всего за один день попытки, это фактически приведет к более частому падению:

Поэтому я быстро перестал его использовать и вернулся без него.

Вопросы

  1. Почему это происходит?
  2. Есть ли способ избежать этого? Поможет ли избежать расширения класса приложения?
  3. Насколько распространено это для других приложений?
  4. Почему мультидексинг на самом деле вызывает больше проблем?
  5. С точки зрения пользователей, есть ли у пользователей, которые имеют эту проблему - всегда есть? У определенных устройств или версий 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, чтобы сохранить его.

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