应用程序类测试M备份时App崩溃与ClassCastException

时间:2016-03-28 12:41:00

标签: android android-6.0-marshmallow backupmanager

我跟随guide指定完全备份的排除项,但在我尝试测试时遇到崩溃。

$ adb shell bmgr fullbackup <PACKAGE>

正常工作 - 按预期排除文件。

我清除数据然后运行:

$ adb shell bmgr restore <PACKAGE>

还原工作正常,但下次尝试运行应用时我得到的是ClassCastException

Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to com.domain.app.MyCustomApplicationClass

看来由于某种原因,我的应用程序有一个实例,但它不是清单中指定的自定义应用程序类的实例。

第二次运行应用程序正常,我可以验证所有数据都已正确恢复。

我在调试版本上测试它,并希望在将最新更改推送到生产之前尝试解决此错误。

1 个答案:

答案 0 :(得分:3)

通常的原因是导致手动恢复“错误的方式”。我很害怕,这是非常糟糕的文档,但是有不同的方法可以调用“bmgr restore”,其中一种方法会引起你描述的问题。

(具体问题是,全数据备份/恢复操作目前要求启动应用程序时,其内容提供者任何应用程序定义的应用程序子类都不会实例化;相反,您运行使用基类Application实例。尝试强制转换为已声明的子类会抛出ClassCastException,如您所想。)

在正常情况下,您的应用会在恢复后被杀死。但是,如果你触发这样的恢复:

adb shell bmgr restore PACKAGE

这不会发生。该特定的调用语法运行“我的应用程序现在想要立即恢复其数据;不要在”代码路径之前或之后杀死我,这是您通过BackupManager.requestRestore()获得的代码路径。在此代码路径中,应用程序在恢复后故意不会被杀死。它是关键/值是唯一备份/恢复范例的时间的工件,并且在该范例中没有此类应用程序子类问题等。

您需要确保在通过bmgr触发恢复时,您使用的是完整语法:

adb shell bmgr restore TOKEN PACKAGE

此语法调用完整的安装时还原代码路径,该路径将在还原后专门拆除应用程序,以避免尝试使用基类应用程序执行后续执行。

' TOKEN '是包含您要恢复的数据的数据集的标识符。如果您使用的是本地调试传输,则 TOKEN 始终 “1”。如果您正在使用云备份,那么它将是设备自己的当前备份数据集标识符(如果有),或祖先数据集(如果设备尚未生成一个)。您可以在

的输出中看到这些
adb shell dumpsys backup | egrep 'Current:|Ancestral:'

识别 TOKEN 的数据集是那里给出的十六进制字符串。