应用程序崩溃并出现 ClassCastException on Application class testing M backup
App crashes with ClassCastException on Application class testing M backup
我正在按照 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
由于某种原因,似乎有一个我的应用程序的实例,但它不是清单中指定的自定义应用程序 class 的实例。
运行 应用程序第二次运行正常,我可以验证所有数据是否已正确恢复。
我正在调试版本中对此进行测试,并希望在将最新更改推送到生产环境之前尝试解决此错误。
这通常是导致手动恢复的原因 "the wrong way." 恐怕这没有很好的记录,但是有不同的调用方法 "bmgr restore",其中一种会导致您描述的问题。
(问题,具体来说,全数据 backup/restore 操作目前要求应用程序在启动时既没有内容提供者 也没有 任何应用程序定义的应用程序subclass 实例化;相反,你 运行 有一个 base-class Application 实例。试图转换回你声明的 subclass 会像你想象的那样抛出 ClassCastException。)
在正常情况下,您的应用会在恢复后被终止。但是,如果您像这样触发恢复:
adb shell bmgr restore PACKAGE
这不会发生。该特定调用语法 运行 是一个 "my app wants to restore its data 'live' right now; do not kill me before or after" 代码路径,您通过 BackupManager.requestRestore()
获得的代码路径。在此代码路径中,应用程序在恢复后有意不被终止。它是 key/value 是唯一 backup/restore 范式的时代产物,在那个范式中没有这样的应用程序子 class 问题等
您需要确保当您通过 bmgr 触发恢复时,您使用的是完整语法:
adb shell bmgr restore TOKEN PACKAGE
此语法调用完整的安装时还原代码路径,该路径将在还原后拆除您的应用程序,专门避免尝试使用基本 class 应用程序进行后续执行。
'TOKEN' 是包含您要恢复的数据的数据集的标识符。如果您使用的是本地调试传输,则 TOKEN 是 always "1"。如果您使用的是云备份,那么它将是设备自己的当前备份数据集标识符(如果有的话),或者如果设备没有自己生成一个祖先数据集。您可以在
的输出中看到这些
adb shell dumpsys backup | egrep 'Current:|Ancestral:'
数据集的标识 TOKEN 是那里给出的十六进制字符串。
我正在按照 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
由于某种原因,似乎有一个我的应用程序的实例,但它不是清单中指定的自定义应用程序 class 的实例。
运行 应用程序第二次运行正常,我可以验证所有数据是否已正确恢复。
我正在调试版本中对此进行测试,并希望在将最新更改推送到生产环境之前尝试解决此错误。
这通常是导致手动恢复的原因 "the wrong way." 恐怕这没有很好的记录,但是有不同的调用方法 "bmgr restore",其中一种会导致您描述的问题。
(问题,具体来说,全数据 backup/restore 操作目前要求应用程序在启动时既没有内容提供者 也没有 任何应用程序定义的应用程序subclass 实例化;相反,你 运行 有一个 base-class Application 实例。试图转换回你声明的 subclass 会像你想象的那样抛出 ClassCastException。)
在正常情况下,您的应用会在恢复后被终止。但是,如果您像这样触发恢复:
adb shell bmgr restore PACKAGE
这不会发生。该特定调用语法 运行 是一个 "my app wants to restore its data 'live' right now; do not kill me before or after" 代码路径,您通过 BackupManager.requestRestore()
获得的代码路径。在此代码路径中,应用程序在恢复后有意不被终止。它是 key/value 是唯一 backup/restore 范式的时代产物,在那个范式中没有这样的应用程序子 class 问题等
您需要确保当您通过 bmgr 触发恢复时,您使用的是完整语法:
adb shell bmgr restore TOKEN PACKAGE
此语法调用完整的安装时还原代码路径,该路径将在还原后拆除您的应用程序,专门避免尝试使用基本 class 应用程序进行后续执行。
'TOKEN' 是包含您要恢复的数据的数据集的标识符。如果您使用的是本地调试传输,则 TOKEN 是 always "1"。如果您使用的是云备份,那么它将是设备自己的当前备份数据集标识符(如果有的话),或者如果设备没有自己生成一个祖先数据集。您可以在
的输出中看到这些adb shell dumpsys backup | egrep 'Current:|Ancestral:'
数据集的标识 TOKEN 是那里给出的十六进制字符串。