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

问题描述:

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

活动中,我经历的顺序是

  1. 运行应用程序时,一定要打开主窗口的活动。
  2. 输入

    亚行外壳BMGR fullbackup net.anei.cadpage

  3. 使用应用程序管理器强行关闭应用程序,并清除所有的应用程序和缓存数据强制应用程序数据的备份
  4. 恢复应用信息与

    亚行外壳BMGR恢复

  5. 手动启动应用程序

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

有什么明显的我失踪?

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

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

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

您还别说您使用的是执行测试还原到底是什么命令,但我怀疑你使用这个语法BMGR命令:

adb shell bmgr restore PACKAGE 

这不会做什么你的期望。特别是,它会调用应用程序调用BackupManager.requestRestore(观察者)时发生的代码路径。在这个特定的代码路径中,应用程序是而不是在还原操作之后关闭,因为应用程序要求观察操作本身。这意味着你剩下的应用程序仍在运行,但有一个基类应用程序。这是一个电力用户API,当应用程序使用原始键/值备份API时,它几乎是安全的。你需要测试,而不是使用其他BMGR语法:

adb shell bmgr restore TOKEN PACKAGE 

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

这一切都需要更好的记录,并没有让人吃惊。

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

+0

使用“自动恢复”安装应用程序时的预期行为是什么?从一些粗略的测试看来,Android 7上的行为如上所述 - 应用程序将使用基类应用程序启动,然后在恢复完成后,该进程将被销毁并重新启动。但是,在Android 6.0上,该进程并未关闭,使应用程序与基类Application一起运行。 – user3615737

+1

有可能是Android 6中存在一个错误,使得它在执行还原后无法终止基本应用程序进程实例?当然,这也可能是一个特定于OEM的错误;一般情况下尽可能在Nexus/Pixel设备以及其他OEM设备上重现。 – ctate

+0

我看到这发生在运行Android 6.0的Nexus 5上。它可以在运行Android 7.0的Pixel C上正常工作 – user3615737