3

我正在按照指南指定完整备份的排除项,但在尝试测试它时遇到了崩溃。

$ 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

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

再次运行该应用程序可以正常工作,我可以验证所有数据是否已正确恢复。

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

4

1 回答 1

4

造成这种情况的通常原因是导致手动恢复“错误的方式”。恐怕这是非常糟糕的记录,但是有不同的方法可以调用“bmgr restore”,其中一种会导致您所描述的问题。

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

在正常情况下,您的应用程序会在恢复后被终止。但是,如果您像这样触发还原:

adb shell bmgr restore PACKAGE

这不会发生。该特定调用语法运行“我的应用程序想要立即恢复其数据;不要在之前或之后杀死我”代码路径,您可以通过BackupManager.requestRestore(). 在此代码路径中,应用程序在还原后不会被故意终止。这是键/值是唯一备份/恢复范式的时代产物,在那个范式中没有这样的应用程序子类问题等。

您需要确保当您通过 bmgr 触发还原时,您使用的是完整语法:

adb shell bmgr restore TOKEN PACKAGE

此语法调用完整的 restore-at-install 代码路径,该路径将在还原后关闭您的应用程序,以避免尝试使用基类应用程序进行后续执行。

TOKEN ”是包含您要恢复的数据的数据集的标识符。如果您使用本地调试传输,则TOKEN始终为" 1"。如果您正在使用云备份,那么如果有一个,它将是设备自己的当前备份数据集标识符,如果设备本身没有生成一个,则它将是祖先数据集。你可以在输出中看到这些

adb shell dumpsys backup | egrep 'Current:|Ancestral:'

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

于 2016-05-20T21:38:06.020 回答