java.lang.ClassNotFoundException при запуске

У нас есть очень странное исключение java.lang.ClassNotFoundException при запуске приложения, которое происходит с очень небольшим количеством клиентов (< 1%). Мы никогда не видели этого в dev env, и мы не можем понять источник этой проблемы. Вот трассировка стека из отчетов о сбоях в Google Play.

java.lang.RuntimeException: Unable to instantiate application com.mycompany.myapplication.MyApplication: java.lang.ClassNotFoundException: com.mycompany.myapplication.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.myapplication-1/pkg.apk]
at android.app.LoadedApk.makeApplication(LoadedApk.java:490)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3784)
at android.app.ActivityThread.access$2200(ActivityThread.java:132)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1082)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4268)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.mycompany.myapplication.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.myapplication-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at android.app.Instrumentation.newApplication(Instrumentation.java:972)
at android.app.LoadedApk.makeApplication(LoadedApk.java:481)
... 11 more

3 ответа

Недавно я развернул обновление в своем приложении, и на следующий день пользователь сообщил о сбое с помощью средства отчетов Google Play. Дамп стека был для LoadApk(), и ошибка была в загрузке моего класса Application. Вот эта свалка:

java.lang.RuntimeException: Невозможно создать экземпляр приложения com.goalstate.WordGames.FullBoard.library.FullBoardApplication: java.lang.ClassNotFoundException: не нашел класс "com.goalstate.WordGames.FullBoard.library.FullBath путь на платформе [[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] в android.app.LoadedApk.makeApplication(LoadedApk.java:516) в android.app.ActivityThread.handleBindApplication(ActivityThread.java:4703) в Android.app.ActivityThread.access$1600(ActivityThread.java:175) на android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) на android.os.Handler.dispatchMessage(Handler.java:102) на android.os.Looper.loop(Looper.java:146) на android.app.ActivityThread.main(ActivityThread.java:5602) на java.lang.reflect.Method.invokeNative(собственный метод) на java.lang.reflect.Method.invoke(Method.java:515) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(собственный метод) Причина: java.lang.ClassNotFoundException: не найден класс "com.goalstate.WordGames.FullBoard.library.FullBoardApplication" по пути: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] в dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67) в java.lang.ClassLoader.loadClass(ClassLoader.java:497) в Java.lang.ClassLoader.loadClass(ClassLoader.java:457) в android.app.Instrumentation.newApplication(Instrumentation.java:981) в android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... и еще 11

У меня есть библиотека, и мой класс приложения был определен в этой библиотеке. Манифест для моего приложения (в котором использовалась библиотека) ссылался на класс в этой библиотеке по его полному пути. У него не было собственного класса приложения.

Все мои внутренние тесты не воспроизвели эту проблему, и даже когда я тестировал (используя Samsung Remote Test Lab) на одном устройстве (фактически два разных устройства, одно с 4.3 и одно с 4.4.4), как сообщалось о сбое (Galaxy Note II под управлением Android 4.4) проблем не было.

В поисках информации об этом я обнаружил упоминание о том, что разные устройства могут иметь несколько разные подходы к разрешению ссылок на классы, и, вероятно, поэтому большинство устройств не испытывали проблем с моим APK, но с этим конкретным устройством (которое, в отличие от моих тестовых устройств), был предоставлен со своим вкусом Android Sprint) сделал. И точно так же, возможно, именно поэтому проблема возникла у одного процента ваших клиентов, а у большинства - нет.

Я решил, что лучшим подходом было бы сделать так, чтобы даже неискушенное устройство было как можно проще найти классы, на которые есть ссылки из моего файла манифеста. Итак, я определил новый класс приложения в пакете самого приложения (а не в библиотеке), и у меня был этот класс, наследуемый от класса приложения в моей библиотеке. В противном случае новый класс был пустым.

Затем я заменил ссылку на полный путь к классу приложения в библиотеке относительной ссылкой на новый класс, который я создал в самом приложении. Итак, вместо того, чтобы:

<application android:name="com.goalstate.WordGames.FullBoard.library.FullBoardApplication"

в моем манифесте я имел:

<application android:name=".FullBoardWordChumsApplication"

Это (согласно фольклору на эту тему) должно облегчить процесс менее сложного разрешения.

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

Дополнительный фольклор, обнаруженный в Интернете, указывает, что может помочь отключить "Автоматически создавать" для проекта в Eclipse, затем выйти из Eclipse, повторно войти в Eclipse, а затем, после его восстановления, перейти непосредственно в Инструменты Android, чтобы экспортировать подписанный APK (без когда-либо включается сборка автоматически). Поэтому, бросая соль через левое плечо и произнося молитву богам раздробленной паранойи, я учел это суеверие при подготовке своего АПК к выпуску.

Что-нибудь из этого действительно помогает? Время покажет, но пока мой обновленный выпуск не вызвал никаких дополнительных сбоев.

Если проблема возникает только с подписанными APK и вы используете Eclipse для экспорта подписанного APK ...

Перед тем, как "Экспортировать и подписать APK" в Eclipse, отключите следующую настройку в меню [Проект> Автоматическая сборка] (затем вы сможете снова включить ее, когда продолжите разработку).

Эта ошибка возникает, когда в вашем файле манифеста в теге приложения какое-либо имя класса, которое вы указали, не совпадает с вашим Java-файлом кодирования.

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