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

问题描述 投票:5回答:1

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

我经历的一系列事件是

  1. 运行应用程序,始终打开主活动窗口。
  2. 通过输入强制备份应用数据 adb shell bmgr fullbackup net.anei.cadpage
  3. 使用应用管理器强制关闭应用并清除所有应用和缓存数据
  4. 使用恢复应用信息 adb shell bmgr恢复
  5. 手动启动应用程序

生成的日志显示在Application.onCreate()之前调用Activity.onCreate()方法。应用程序崩溃是因为Application.onCreate()方法未执行某些关键初始化。

有什么明显的东西让我失踪吗?

FWIW,在崩溃完成后第二次启动应用程序。

android restore android-6.0-marshmallow
1个回答
3
投票

它实际上是故意的,但是是侵入性的。

对于完整数据备份和还原操作,使用基类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。

© www.soinside.com 2019 - 2024. All rights reserved.