我跟随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
看来由于某种原因,我的应用程序有一个实例,但它不是清单中指定的自定义应用程序类的实例。
第二次运行应用程序正常,我可以验证所有数据都已正确恢复。
我在调试版本上测试它,并希望在将最新更改推送到生产之前尝试解决此错误。
答案 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 的数据集是那里给出的十六进制字符串。