Ошибка "Не удалось выполнить операцию"

В одном из моих Android-приложений есть около 100 000 пользователей, и примерно 10 раз в неделю я получаю следующее сообщение об ошибке с помощью инструмента Google на рынке:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.rebm.asp/org.rebm.asp.MainActivity}:
  java.lang.ClassNotFoundException: org.rebm.asp.MainActivity in loader dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753)
at android.app.ActivityThread.access$2500(ActivityThread.java:129)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2107)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: org.rebm.asp.MainActivity in loader dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2651)
... 11 more

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

Кто-нибудь знает, что может быть проблемой или как я могу ее диагностировать?

Ответ 1

Трассировка стека, которую вы задаете в вопросе, содержит доказательство того, что проблема связана с перемещением приложения на SD-карту:

java.lang.RuntimeException: невозможно выполнить инстанцировать активность ComponentInfo {org.rebm.asp/org.rebm.asp.MainActivity}: java.lang.ClassNotFoundException: org.rebm.asp.MainActivity в загрузчике dalvik.system.PathClassLoader [/mnt/asec/org.rebm.asp-1/pkg.apk]

Как вы можете видеть, путь к вашему приложению содержит /mnt/asec, который является точкой подключения безопасного приложения Android.

Чтобы проверить, не возникла ли эта проблема из-за Apps2SD, вы должны проверить, есть ли у всех трассировок стека каталог /mnt/asec в пути к вашему приложению. Если все это так, вы можете быть уверены, что это ошибка Apps2SD.

Как говорили другие, такие проблемы возникают из-за того, что SD-карта недоступна при загрузке приложения или из поврежденного раздела asec на SD-карте.

Ваше приложение каким-либо образом регистрируется для запуска при загрузке или это какой-то виджет, который система попытается загрузить, даже когда SD-карта еще не установлена? Если да, возможно, вам следует отключить возможность перемещения приложения на SD-карту.

Ответ 2

Имея такую ​​же "редкую" проблему во всех опубликованных играх.

Возможно, возникла проблема с установкой на SD-карту или перемещением приложения на SD-карту, а затем с удалением SD-карты.

Другое предположение, что приложение загружается или устанавливается несколько раз.

Я не смог воспроизвести это, чтобы он не смог пригвоздить его.

Ответ 3

Есть несколько предложений, которые могут помочь вам отладить ваше приложение. Надеюсь, они решают вашу проблему. Также опубликуйте XML файл манифеста Android и фрагмент вашего метода MainActivity onCreate, чтобы мы могли также помочь вам отладить его и сузить возможности...

Предложения:

1) В вашем Android XML проверьте, является ли ваша минимальная версия Sdk (android: minSdkVersion = "3" ) равной 3? Если это изменение, оно равно 7+. Я нашел этот трюк полезным иногда, когда справлялся с редкими проблемами.

2) В вашем Android XML проверьте, что вы зарегистрировали свою деятельность там. Если нет, зарегистрируйте его, каждое новое мероприятие должно быть зарегистрировано перед его использованием. Если ваша активность зарегистрирована, проверьте правильность пути, к которому вы его поставляете.

3) Очистите проект и снова его создайте, чтобы обновить R.java и не использовать кешированные файлы.

4) Перенесите свой проект, создайте новый проект и скопируйте туда все свои файлы. Он также решает редкие проблемы.

5) Согласно одному пользователю:

Я получил ту же ошибку (не удалось создать активность...) с Opera Mini. Opera Mini была на SD-карте (перемещена на SD-карту в настройках приложения). Ошибка, похоже, связана с тем фактом, что вчера я поменял SD-карту. Устройство было выключено, я скопировал все данные со старой карты на новую карту (с помощью cp -a), а затем вставил новую карту и снова запустил устройство. Кажется, что все работает так, как ожидалось, но теперь я вижу, что все приложения на SD-карте вылетают с той же ошибкой.

Device: HTC Desire HD (Android 2.2)
Old SDHC card: SanDisk 8GB class 4
New SDHC card: Kingston 16GB class 4

Итак, я бы сказал, что это ошибка Android, а не то, что может быть исправлено разработчиками приложений.

Также смотрите: http://android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html

It has always been the case that when you swap SD cards on an Android device, if you physically copy the contents of the old card to the new one, the system will use the data on the new card as if nothing had changed. This is also true of apps which have been installed on the SD card."

Это кажется неправильным.

Надеюсь, что одна из этих проблем решит вашу проблему.

Ответ 4

У меня была эта проблема, но не с активностью. Исправлено обходное решение:

ClassLoader myClassLoader = TroubleClass.class.getClassLoader();
Thread.currentThread().setContextClassLoader(myClassLoader);

Ответ 6

Может случиться так, что приложение отлично работает на вашем затмении и мобильном, когда вы установите его из eclipse, но можете вылететь на рынок. > (Случилось со мной), если с тобой происходит то же самое, вам нужно 2 вещи, и вы выйдете из этой ситуации.

  • Очистить проект и перестроить. (Использование Project-Clean)
  • Удалить и повторно включить библиотеки, если они есть.