Таинственный ClassNotFoundException, когда система Android включает BackupAgent - PullRequest
4 голосов
/ 04 октября 2011

У меня есть несколько (4) отчетов об ошибках в моем приложении, когда система Android решила сделать резервную копию в облаке Google с помощью BackupAgent.Я использую SharedPreferencesBackupHelper.Трассировка стека выглядит следующим образом (мое настоящее имя пакета заменено на com.xxx.yyy):

java.lang.RuntimeException: Unable to create BackupAgent com.xxx.yyy.MyBackupAgent: java.lang.ClassNotFoundException: com.xxx.yyy.MyBackupAgent in loader dalvik.system.PathClassLoader[/mnt/asec/com.xxx.yyy-1/pkg.apk]
at android.app.ActivityThread.handleCreateBackupAgent(ActivityThread.java:2114)
at android.app.ActivityThread.access$3200(ActivityThread.java:132)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1138)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4196)
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.xxx.yyy.MyBackupAgent in loader dalvik.system.PathClassLoader[/mnt/asec/com.xxx.yyy-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.ActivityThread.handleCreateBackupAgent(ActivityThread.java:2064)
... 10 more

У меня даже однажды случился сбой программы на моем собственном телефоне с Android 2.30,3.Меня сбивает с толку этот сбой программы: я точно знаю, что в пакете присутствует класс «MyBackupAgent».Я также точно знаю, что резервное копирование в облако работает на том же телефоне, где я однажды получил сбой.

Я довольно много искал в сети, чтобы найти решение, в чем причина этой проблемы.,Все случаи, которые я обнаружил при похожих проблемах, то есть исключение ClassNotFoundException, выбрасываемое из PathClassLoader, хотя класс присутствует в apk, имеют одну общую черту.Все они имеют завершающий «-1» или «-2» и конец каталога с именем пакета, в котором установлен apk.

В моих отчетах об ошибках это разные имена, где dalvik.system.PathClassLoader ищет мой резервный класс:

/ mnt / asec / com.xxx.yyy-1 / pkg.apk

/ data / app / com.xxx.yyy-1.apk

/ mnt / asec / com.xxx.yyy-2 / pkg.apk

Возможно, я ловлю рыбу не в том озере, но что означают эти слова "-1" и "-2"msgstr "в конце каталога имя пакета означает, и может ли проблема быть связана с этим?Я сомневаюсь, что проблема заключается в моем коде, поскольку просто скажите системе запланировать резервное копирование моих общих настроек.Затем система Android начинает резервное копирование в подходящее время в будущем, и именно здесь происходит сбой.Глядя на трассировку стека, мой код даже не упоминается.Это все системные процедуры, которые заканчиваются поиском моего класса резервной копии в apk и могут по неизвестной причине не найти его.

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

Кто-нибудь знает, что может вызвать это?Или еще лучше, как этого избежать.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012
Префикс

"/ mnt / asec" означает, что телефон подключен к компьютеру, и в то время, когда приложение пытается запустить приложение или агент резервного копирования пытается его запустить (приложение еще не используется), происходит сбой.Ожидается, так как телефон установлен.

0 голосов
/ 25 октября 2011

Я испытываю тот же сбой. Меня интересует одна теория: имеет ли значение относительное или абсолютное имя пакета.

В моем случае я использовал «android: name =», потому что мое приложение расширяет Application. Итак, я использовал: android.name = "com.foo.bar.myapp" вместо: android.name = "MyApp"

Похоже, это не должно иметь никакого значения, но мне интересно, использует ли загрузчик другое имя пакета, например, с суффиксами "-1" или "-2".

...