2016-03-28 58 views
2

我正在关注guide以指定从完整备份中排除但在尝试和测试时遇到崩溃。应用程序崩溃ClassCastException对应用程序类测试M备份

$ 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

需要发布您的清单 –

+0

它在清单中定义,正如我在问题中指出的那样,这不是问题(否则应用程序将无法运行) – Philio

+1

我注意到了一个类似的问题:我的自定义Application.onCreate ()在被恢复后第一次运行应用程序时不会被调用。当第一个活动启动时,这会导致崩溃。你有没有找到解决方案? –

回答

3

这通常会导致手动恢复“错误的方式”。这恐怕是非常糟糕的,但恐怕有不同的方法来调用“bmgr restore”,其中之一会导致您描述的问题。 (具体问题是,全数据备份/恢复操作当前需要启动该应用程序,而其内容提供商都未实例化任何应用程序定义的应用程序子类;相反,您使用基本 - 类应用程序实例试图回到你声明的子类抛出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 DataSet的是给那里的十六进制字符串。