Android 6自动恢复未初始化应用

一直在测试新的
Android 6自动备份/恢复功能,并在我的应用程序恢复后立即崩溃时遇到问题.进一步调查显示Application.onCreate()初始化方法未在主Activity.onCreate()方法之前调用.这让我觉得这可能是新autorestore逻辑中的错误.但我认为在将其报告为官方错误之前,我会先征求意见.

我经历的一系列事件是

>运行应用程序,始终打开主活动窗口.
>通过输入强制备份应用数据

adb shell bmgr fullbackup net.anei.cadpage

>使用应用管理器强制关闭应用并清除所有应用和缓存数据
>恢复应用信息

adb shell bmgr restore

>手动启动应用程序

生成的日志显示在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备份的输出中看到当前和祖先的数据集标记.

这一切都需要更好地记录,并且不那么令人惊讶.

通常不鼓励使用子类应用程序;这是一个原因.尝试使用自己的lazy-init静态而不是子类化Application.

点赞