Android 安卓数据备份服务

Android 安卓数据备份服务,android,sharedpreferences,android-backup-service,Android,Sharedpreferences,Android Backup Service,我正在尝试使用数据备份服务,以保存用户共享的首选项,如前所述。然而,当我尝试在不同的Android版本中测试它时,我遇到了以下问题 Android 2.3.4:在扩展备份代理程序后,在我的摩托罗拉Atrix with Android 2.3.4中,我尝试使用bmgr工具(通过以下步骤)测试服务时,看到以下消息: W/BackupTransportService(1618): Unknown package in backup request: @pm@ W/BackupTransportSer

我正在尝试使用数据备份服务,以保存用户共享的首选项,如前所述。然而,当我尝试在不同的Android版本中测试它时,我遇到了以下问题

Android 2.3.4:在扩展备份代理程序后,在我的摩托罗拉Atrix with Android 2.3.4中,我尝试使用bmgr工具(通过以下步骤)测试服务时,看到以下消息:

W/BackupTransportService(1618): Unknown package in backup request: @pm@ 
W/BackupTransportService(1618): Not ready for backup request right now: [OperationScheduler: enabledState=false lastSuccess=2013-03-11/20:50:36 moratoriumSet=2013-03-16/22:50:00 moratorium=1970-01-01/02:00:00 trigger=1970-01-01/02:00:00]
W/PerformBackupThread(1618): Backup pass unsuccessful, restaging
D/DataBackUpActivity(1114): onCreate()
D/DataBackUpActivity(1114): DB path = /data/data/xxx.yyy.zzz/databases/MyDB.db
V/BackupServiceBinder(1114): doRestore() invoked
D/DataBackUpActivity(1114): onRestore()
V/ActivityThread(1114): handleDestroyBackupAgent: CreateBackupAgentData{appInfo=ApplicationInfo{XXXXXXXX xxx.yyy.zzz} backupAgent=xxx.yyy.zzz.DataBackUpActivity mode=0}
W/dalvikvm(1114): Unable to resolve superclass of Lcom/yyy/zzz/MyMapActivity1; (1165)
W/dalvikvm(1114): Link of class 'Lcom/yyy/zzz/MyMapActivity1;' failed
E/dalvikvm(1114): Could not find class 'xxx.yyy.zzz.MyMapActivity1', referenced from method xxx.yyy.zzz.MyMainActivity$6.onClick
W/dalvikvm(1114): VFY: unable to resolve const-class 1927 (Lcom/yyy/zzz/MyMapActivity1;) in Lcom/yyy/zzz/MyMainActivity$6;
W/dalvikvm(1114): Unable to resolve superclass of Lcom/yyy/zzz/MyMapActivity2; (1165)
W/dalvikvm(1114): Link of class 'Lcom/yyy/zzz/MyMapActivity2;' failed
E/dalvikvm(1114): Could not find class 'xxx.yyy.zzz.MyMapActivity2', referenced from method xxx.yyy.zzz.MyMainActivity$7.onClick
W/dalvikvm(1114): VFY: unable to resolve const-class 1835 (Lcom/yyy/zzz/MyMapActivity2;) in Lcom/yyy/zzz/MyMainActivity$7;
当然,没有创建备份,并且在卸载和重新安装我的应用程序后,没有调用onRestore

安卓4.0:我还尝试在带有API14的模拟器上测试该服务。再次按照相同的步骤使用bmgr工具测试服务,而不是显示上述消息,实际调用了onBackup()(xxx.yyy.zzz是我的包,XXXXXXXX是ApplicationInfo):

在emulator上卸载并重新安装我的应用程序后,会调用onRestore(),但是找不到我的应用程序的MainActivity,因此会引发ClassNotFoundException:

V/ActivityThread(2246): Initializing agent class xxx.yyy.zzz.DataBackUpActivity
D/DataBackUpActivity(2246): onCreate()
V/BackupServiceBinder(2246): doRestore() invoked
D/DataBackUpActivity(2246): onRestore()
D/backup_data(2246): SKIP_PADDING FAILED at line 331
V/ActivityThread(2246): handleDestroyBackupAgent: CreateBackupAgentData{appInfo=ApplicationInfo{XXXXXXXX xxx.yyy.zzz} backupAgent=xxx.yyy.zzz.DataBackUpActivity mode=0}
W/dalvikvm(2246): Unable to resolve superclass of Lcom/yyy/zzz/MainActivity; (1164)
W/dalvikvm(2246): Link of class 'Lcom/yyy/zzz/MainActivity;' failed
D/AndroidRuntime(2246): Shutting down VM
W/dalvikvm(2246): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
E/AndroidRuntime(2246): FATAL EXCEPTION: main
E/AndroidRuntime(2246): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{xxx.yyy.zzz/xxx.yyy.zzz.MainActivity}: java.lang.ClassNotFoundException: xxx.yyy.zzz.MainActivity
E/AndroidRuntime(2246):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1879)
E/AndroidRuntime(2246):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
E/AndroidRuntime(2246):     at android.app.ActivityThread.access$600(ActivityThread.java:122)
E/AndroidRuntime(2246):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
E/AndroidRuntime(2246):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(2246):     at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(2246):     at android.app.ActivityThread.main(ActivityThread.java:4340)
E/AndroidRuntime(2246):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(2246):     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(2246):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(2246):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(2246):     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(2246): Caused by: java.lang.ClassNotFoundException: xxx.yyy.zzz.MainActivity
E/AndroidRuntime(2246):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
E/AndroidRuntime(2246):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/AndroidRuntime(2246):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/AndroidRuntime(2246):     at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
E/AndroidRuntime(2246):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1870)
E/AndroidRuntime(2246):     ... 11 more
有趣的是,如果我在ClassNotFoundException之后重新启动我的应用程序,它可以正常工作,包括恢复的共享首选项

我在SO中也遇到过类似的问题(例如),但它们不属于我的问题范畴。我认为我的应用程序在清单文件或其他地方的设置没有问题,因为在API14中调用了onBackup和onRestore方法,并且在ClassNotFoundException之后恢复了备份。最后,我想指出,我正在使用API17(谷歌公司)构建Eclipse项目

很抱歉我的帖子太长,但我想尽可能清楚地说明这个问题。如果有人对为什么在这些不同的Android版本中会发生这种情况有反馈,请告诉我们

编辑:阅读文章后,我还尝试使用bmgr工具中的以下命令将备份传输更改为所谓的LocalTransport:

adb shell bmgr transport android/com.android.internal.backup.LocalTransport
结果,我的Android 2.3.4 Atrix手机成功恢复了用户共享的偏好。但是,在Android 4.0 emulator中,行为与之前相同,即调用onRestore(),抛出相同的ClassNotFoundException,在重新启动应用程序后,我的应用程序工作正常,并包含用户共享的首选项。因此,在前面的问题之上,一个新的问题是为什么“LocalTransport”在Android 2.3.4上工作,而在4.0上抛出一个异常(至少在本例中是这样)。如果有人能分享意见,请继续

EDIT2:好的,这很奇怪。ClassNotFoundException仅针对我应用程序中的MapActivities引发。更准确地说,我的应用程序是以MapActivity启动的,因此在第一次启动时抛出了ClassNotFoundException。我所做的是创建一个虚拟活动,其中有两个按钮作为启动器活动,每个按钮都可以启动我的MapActivities(在我的应用程序中,我总共有2个)。现在,在本例中出现了“找不到类”错误,如以下消息所示:

W/BackupTransportService(1618): Unknown package in backup request: @pm@ 
W/BackupTransportService(1618): Not ready for backup request right now: [OperationScheduler: enabledState=false lastSuccess=2013-03-11/20:50:36 moratoriumSet=2013-03-16/22:50:00 moratorium=1970-01-01/02:00:00 trigger=1970-01-01/02:00:00]
W/PerformBackupThread(1618): Backup pass unsuccessful, restaging
D/DataBackUpActivity(1114): onCreate()
D/DataBackUpActivity(1114): DB path = /data/data/xxx.yyy.zzz/databases/MyDB.db
V/BackupServiceBinder(1114): doRestore() invoked
D/DataBackUpActivity(1114): onRestore()
V/ActivityThread(1114): handleDestroyBackupAgent: CreateBackupAgentData{appInfo=ApplicationInfo{XXXXXXXX xxx.yyy.zzz} backupAgent=xxx.yyy.zzz.DataBackUpActivity mode=0}
W/dalvikvm(1114): Unable to resolve superclass of Lcom/yyy/zzz/MyMapActivity1; (1165)
W/dalvikvm(1114): Link of class 'Lcom/yyy/zzz/MyMapActivity1;' failed
E/dalvikvm(1114): Could not find class 'xxx.yyy.zzz.MyMapActivity1', referenced from method xxx.yyy.zzz.MyMainActivity$6.onClick
W/dalvikvm(1114): VFY: unable to resolve const-class 1927 (Lcom/yyy/zzz/MyMapActivity1;) in Lcom/yyy/zzz/MyMainActivity$6;
W/dalvikvm(1114): Unable to resolve superclass of Lcom/yyy/zzz/MyMapActivity2; (1165)
W/dalvikvm(1114): Link of class 'Lcom/yyy/zzz/MyMapActivity2;' failed
E/dalvikvm(1114): Could not find class 'xxx.yyy.zzz.MyMapActivity2', referenced from method xxx.yyy.zzz.MyMainActivity$7.onClick
W/dalvikvm(1114): VFY: unable to resolve const-class 1835 (Lcom/yyy/zzz/MyMapActivity2;) in Lcom/yyy/zzz/MyMainActivity$7;
如您所见,这些错误仅适用于my MapActivities,并且仅在还原过程之后出现。如果我直接重新启动我的应用程序,一切正常,包括恢复的数据。那么,有人知道为什么仅在还原过程之后为MapActivity抛出“找不到类”吗?我应该注意到,这只发生在Android 4上。在我的安卓2.3.4 Atrix手机中,数据恢复工作正常(使用LocalTransport)。这真的很奇怪…:-|

EDIT3:我创建了一个小型Eclipse项目,用于在启动器活动是MapActivity时测试备份/恢复服务。它是用谷歌API17构建的。你可以从下载。我用GoogleAPI10在模拟器中测试了这个项目,效果很好。但是,在使用Google API14的仿真器中,一旦恢复完成,就会抛出ClassNotFoundException。该项目有一个按钮,用于将您在EditText上写入的任何文本保存到用户首选项。因此,要测试它:

  • 在编辑文本中输入文本
  • 按下按钮保存并退出应用程序
  • 使用bmgr工具强制备份
  • 卸载应用程序,然后从Eclipse重新安装
  • 调用onRestore后,将抛出ClassNotFoundException。最后,我应该注意,如果用简单的活动替换MapActivity,那么恢复就成功了

    如果有人尝试,请告诉我。顺便说一句,同样的问题已经发布了,到目前为止还没有答案。这是虫子吗?应该报告吗


    EDIT4:作为EDIT2的延续,我添加了一个初始虚拟活动,在深入研究问题的过程中,我发现:如果在恢复后,我只是从虚拟活动启动MapActivity,则会抛出NoClassDefFoundError,应用程序崩溃,但在下一次应用程序启动时工作正常(如前所述)。但是,如果我捕获到NoClassDefFoundError(因此不允许应用程序崩溃),那么即使我重新启动应用程序,NoClassDefFoundError也会继续抛出!怎么可能呢?我在Android项目中打开了一个问题,您可能会发现。

    您是否能够解决此问题?看起来您的活动的超类没有被索引,或者是因为(映射?)库没有“导出”,或者可能是Proguard正在删除它。AndroidManifest可能没有正确指向它。不幸的是,我还没有设法解决它,最终我被迫删除备份服务,直到这个问题得到解决。关键是,当我在安卓2.3.4中运行应用程序时,一切正常。但当我在Android 4.0+上运行同一个应用程序时,它崩溃了,没有任何其他修改。。