У меня есть несколько (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.3.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» в конце каталога имени пакета, и может ли проблема быть связана с этим? Я сомневаюсь, что проблема заключается в моем коде, так как просто скажите системе запланировать резервное копирование моих общих настроек. Затем система Android запускает действие резервного копирования в подходящее время в будущем — и здесь происходит сбой. Глядя на трассировку стека, мой код даже не упоминается. Это все системные процедуры, которые заканчивают поиском моего резервного класса в apk и могут по какой-то неизвестной причине не найти его.
Я не установил атрибут android: name в теге приложения в манифесте, который, как я читал, может вызвать аналогичную ошибку.
Кто-нибудь знает, что может быть причиной этого? Или еще лучше, как этого избежать.