【问题标题】:Android 6 auto restore not initializing appAndroid 6自动恢复未初始化应用程序
【发布时间】:2016-03-28 05:15:47
【问题描述】:

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

我经历的事件顺序是

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

    adb shell bmgr fullbackup net.anei.cadpage

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

    adb shell bmgr 恢复

  5. 手动启动应用程序

结果日志显示 Activity.onCreate() 方法在 Application.onCreate() 之前被调用。应用程序崩溃是因为 Application.onCreate() 方法没有执行一些关键的初始化。

我有什么明显的遗漏吗???

FWIW,崩溃后第二次启动应用程序完美运行。

【问题讨论】:

标签: android restore android-6.0-marshmallow


【解决方案1】:

这实际上是故意的,虽然是侵入性的。

对于完整数据备份和恢复操作,该包是使用 基类 应用程序实例启动的,而不是清单声明的子类。这是因为,不幸的是,许多应用程序通过应用程序子类打开文件或数据库,这阻碍了备份机器正确读取/写入底层文件的能力。同样,您的应用程序的内容提供程序不会自动实例化以进行完整数据备份/恢复操作。然后在操作之后销毁应用进程,因为如果没有预期的应用程序子类或内容提供程序,您的应用当然无法继续正常运行。

您也没有确切说明您使用什么命令来执行测试还原,但我怀疑您正在使用具有以下语法的 bmgr 命令:

adb shell bmgr restore PACKAGE

这并不符合您的预期。特别是,它调用当您的应用调用 BackupManager.requestRestore(observer) 时发生的代码路径。在这个特定的代码路径中,应用程序在恢复操作后不会关闭,因为应用程序已要求观察操作本身。这意味着您的应用程序进程仍在运行,但具有基类应用程序。这是一个高级用户 API,只有当应用程序使用原始键/值备份 API 时,它才是安全的。您需要使用其他 bmgr 语法进行测试:

adb shell bmgr restore TOKEN PACKAGE

其中TOKEN 是应使用数据集的标识符。至少在最新版本的操作系统上,您可以在adb shell dumpsys backup 的输出中看到当前和祖先数据集令牌。

这一切都需要得到更好的记录,并减少令人惊讶的程度。

通常不鼓励子类化应用程序;这是原因之一。尝试使用您自己的惰性初始化静态而不是子类化应用程序。

【讨论】:

  • 使用“自动恢复”安装应用程序时的预期行为是什么?从一些粗略的测试来看,Android 7 上的行为似乎如上所述 - 应用程序将使用基类 Application 启动,然后在恢复完成后该进程被销毁并正常重新启动。然而,在 Android 6.0 上,该进程并未关闭,而是让应用程序使用基类 Application 运行。
  • Android 6 中可能存在一个错误,导致执行还原后无法终止基本应用程序进程实例?当然,也有可能是 OEM 特有的错误。一般来说,尽可能尝试在 Nexus/Pixel 设备以及其他 OEM 设备上重现内容。
  • 我在运行 Android 6.0 的 Nexus 5 上看到过这种情况。它在运行 Android 7.0 的 Pixel C 上正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2018-12-29
  • 2011-11-17
相关资源
最近更新 更多