一直在测试新的Android 6自动备份/恢复功能,并在我的应用程序恢复后立即崩溃时遇到问题。进一步调查显示Application.onCreate()初始化方法未在主Activity.onCreate()方法之前调用。这让我觉得这可能是新autorestore逻辑中的错误。但我认为在将其报告为官方错误之前,我会先征求意见。
我经历的一系列事件是
生成的日志显示在Application.onCreate()之前调用Activity.onCreate()方法。应用程序崩溃是因为Application.onCreate()方法未执行某些关键初始化。
有什么明显的东西让我失踪吗?
FWIW,在崩溃完成后第二次启动应用程序。
它实际上是故意的,但是是侵入性的。
对于完整数据备份和还原操作,使用基类Application实例启动包,而不是使用manifest声明的子类。这是因为,很遗憾,许多应用程序通过Application子类打开文件或数据库,这阻碍了备份机制正确读取/写入底层文件的能力。同样,您的应用程序的内容提供程序不会自动实例化以进行完整数据备份/还原操作。然后,在操作之后销毁应用程序进程,因为如果没有预期的应用程序子类或内容提供程序,您的应用程序当然无法继续正常运行。
您也没有确切地说出您正在使用什么命令来执行测试还原,但我怀疑您正在使用具有以下语法的bmgr命令:
adb shell bmgr restore PACKAGE
这不符合您的期望。特别是,它会调用应用程序调用BackupManager.requestRestore(observer)时发生的代码路径。在此特定代码路径中,应用程序在还原操作后不会关闭,因为应用程序已要求观察操作本身。这意味着您仍然可以继续运行应用程序进程,但使用基类Application。当应用程序使用原始密钥/值备份API时,它是一个非常安全的高级用户API。您需要使用其他bmgr语法进行测试:
adb shell bmgr restore TOKEN PACKAGE
其中TOKEN
是应使用其数据集的标识符。至少在操作系统的最新版本中,您可以在adb shell dumpsys backup
的输出中看到当前和祖先的数据集标记。
这一切都需要更好地记录,并且不那么令人惊讶。
通常不鼓励使用子类应用程序;这是一个原因。尝试使用自己的lazy-init静态而不是子类化Application。