我正在尝试使用数据备份服务,以便保存用户共享首选项,如here所述。但是,尝试在不同的Android版本中测试时,我遇到了以下问题。
Android 2.3.4:在扩展BackupAgentHelper之后,尝试使用bmgr工具测试服务(按照here的步骤),在我的Motorola Atrix with Android 2.3中。 4,我看到以下消息:
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
当然,没有创建备份,卸载并重新安装我的应用程序后,没有调用onRestore。
Android 4.0:我还试图在API14的模拟器上测试该服务。再次执行使用bmgr工具测试服务的相同步骤,而不是显示上述消息,实际上调用了onBackup()(xxx.yyy.zzz是我的包,XXXXXXXX是ApplicationInfo):
03-19 18:33:10.932: V/ActivityThread(808): handleCreateBackupAgent: CreateBackupAgentData{appInfo=ApplicationInfo{XXXXXXXX xxx.yyy.zzz} backupAgent=xxx.yyy.zzz.DataBackUpActivity mode=0}
03-19 18:33:10.932: V/ActivityThread(808): Initializing agent class xxx.yyy.zzz.DataBackUpActivity
03-19 18:33:10.943: D/DataBackUpActivity(808): onCreate()
03-19 18:33:10.952: V/BackupServiceBinder(808): doBackup() invoked
03-19 18:33:10.952: D/DataBackUpActivity(808): onBackup()
03-19 18:33:10.952: D/BackupHelperDispatcher(808): handling existing helper 'prefs' android.app.backup.SharedPreferencesBackupHelper@YYYYYYYY
03-19 18:33:10.972: V/ActivityThread(808): handleDestroyBackupAgent: CreateBackupAgentData{appInfo=ApplicationInfo{XXXXXXXX xxx.yyy.zzz} backupAgent=xxx.yyy.zzz.DataBackUpActivity mode=0}
在模拟器上卸载并重新安装我的应用程序后,会调用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中经历过类似的问题(例如here,here),但是他们并不属于我的问题范畴。我不认为在Manifest文件或其他地方我的应用程序设置存在问题,因为在API14中调用onBackup和onRestore方法,并且在ClassNotFoundException之后恢复备份。最后,我想指出我正在使用API17(Google Inc)构建Eclipse项目。
很抱歉我的帖子很长,但我想尽可能清楚地说明问题。如果有人对这些不同Android版本中出现这种情况的原因有任何反馈,请告诉我们。
编辑:阅读this帖后,我还尝试在bmgr工具中使用此命令命令将备份传输更改为所谓的LocalTransport:
adb shell bmgr transport android/com.android.internal.backup.LocalTransport
结果是我的Android 2.3.4 Atrix手机成功恢复了用户共享首选项。但是,在Android 4.0模拟器中,行为与以前相同,即调用onRestore(),抛出相同的ClassNotFoundException,并在应用程序重新启动后,我的应用程序正常工作并包含用户共享首选项。因此,除了上一个问题之外,一个新的问题就是为什么" LocalTransport"适用于Android 2.3.4,并且4.0会引发异常(至少在这种情况下)。如果有人可以分享意见,请继续。
EDIT2:好的,这很奇怪。仅针对我的应用程序中的MapActivities抛出ClassNotFoundException。更准确地说,我的应用程序是从MapActivity开始的,因此在第一次启动时抛出了ClassNotFoundException。我做的是创建一个带有两个按钮作为启动器Activity的虚拟Activity,其中每个按钮都可以启动我的MapActivities(在我的应用程序中,我总共有2个)。现在在这种情况下,有一个"找不到课程"错误,如以下消息所示:
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;
正如您所看到的,这些错误仅适用于我的MapActivities,仅适用于还原过程。如果我直接重新启动我的应用程序,一切正常,包括恢复的数据。所以有人都知道为什么一个"找不到课程"仅针对MapActivity抛出并且仅在恢复过程后抛出?我应该注意到这只发生在Android 4上。在我的带有Android 2.3.4的Atrix手机中,数据恢复工作正常(使用LocalTransport)。这真的很奇怪......: - |
EDIT3:当启动器活动是MapActivity时,我创建了一个小型Eclipse项目来测试备份/恢复服务。它是使用Google API17构建的。您可以从here下载。我已经在使用Google API10的模拟器中测试了这个项目,该工作正常。但是,在使用Google API14的模拟器中,只要还原完成,就会抛出ClassNotFoundException。该项目有一个按钮,可以将您在EditText上编写的任何文本保存到用户首选项。所以要测试它:
调用onRestore后,将抛出ClassNotFoundException。最后,我应该注意,如果用简单的Acitivy替换MapActivity,那么恢复就会成功完成。
如果有人尝试,请告诉我。顺便说一句,完全相同的问题已经发布here,到目前为止还没有答案。这是一个错误吗?应该报告吗?
EDIT4:作为EDIT2的延续,我添加了一个初始的虚拟Activity,同时深入研究问题,我发现:如果在恢复之后,我只是从我的虚拟对象启动我的MapActivity Activity,然后抛出NoClassDefFoundError并且应用程序崩溃,但在下一个应用程序启动时工作正常(如前所述)。但是,如果我捕获NoClassDefFoundError(因此不允许应用程序崩溃),即使我重新启动应用程序,也会继续抛出NoClassDefFoundError!怎么可能?我在Android项目中打开了一个问题,您可能会发现它here。