3

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

Android 2.3.4:扩展 BackupAgentHelper 后,尝试使用 bmgr 工具测试服务(按照此处的步骤),在我的带有 Android 2.3.4 的 Motorola Atrix 中,我看到以下消息:

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 中遇到过类似的问题(例如这里这里),但是它们不属于我的问题的范畴。我认为 Manifest 文件或其他地方的应用程序设置没有问题,因为在 API14 中调用了 onBackup 和 onRestore 方法,并且在 ClassNotFoundException 之后恢复了备份。最后,我想指出我正在使用 API17 (Google Inc) 构建 Eclipse 项目。

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

编辑:阅读这篇文章后,我还尝试使用 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:好的,这很奇怪。ClassNotFoundException 仅针对我的应用程序中的 MapActivities 引发。更准确地说,我的应用程序从 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 项目来测试备份/恢复服务。它是用谷歌 API17 构建的。你可以从这里下载。我已经在带有 Google API10 的模拟器中测试了这个项目,效果很好。但是,在具有 Google API14 的模拟器中,一旦完成恢复,就会引发 ClassNotFoundException。该项目有一个按钮,可以将您在 EditText 上编写的任何文本保存到用户首选项。所以要测试它:

  1. 在 EditText 中输入文本
  2. 按下按钮保存并退出应用程序
  3. 使用 bmgr 工具强制备份
  4. 卸载应用程序,然后从 Eclipse 重新安装。

调用 onRestore 后,会抛出 ClassNotFoundException。最后,我应该注意,如果您将 MapActivity 替换为简单的 Activivy,则恢复成功。

让我知道是否有人尝试过。顺便说一句,完全相同的问题已经发布在这里,到目前为止还没有答案。这是一个错误吗?是否应该被举报?

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

4

0 回答 0