ken*_*bin 6 android restore android-6.0-marshmallow
正在测试新的Android 6自动备份/还原功能,并在还原后立即遇到我的应用崩溃的问题。进一步的调查显示,未在主Activity.onCreate()方法之前调用Application.onCreate()初始化方法。这让我震惊,因为它是新的自动恢复逻辑中的一个可能的错误。但是我想我会在将其报告为正式bug之前先征求意见。
我经历的事件顺序是
亚行shell bmgr fullbackup net.anei.cadpage
adb shell bmgr恢复
结果日志显示Activity.onCreate()方法在Application.onCreate()被调用之前被调用。该应用程序崩溃是因为Application.onCreate()方法未执行某些关键的初始化。
有什么明显的我想念的东西吗???
FWIW,当崩溃完全正常后,第二次启动该应用程序。
这实际上是故意的,尽管是侵入性的。
对于完整数据备份和恢复操作,包是使用基类Application 实例启动的,而不是使用清单声明的子类。不幸的是,这是因为许多应用程序通过应用程序子类打开文件或数据库,这会阻止备份机器正确读取/写入底层文件的能力。同样,您的应用程序的内容提供程序不会自动实例化以进行完整数据备份/恢复操作。然后,应用程序进程将在操作后被销毁,因为如果没有预期的应用程序子类或内容提供者,您的应用程序当然无法继续正常运行。
您也没有确切说明您使用什么命令来执行测试恢复,但我怀疑您正在使用具有以下语法的 bmgr 命令:
adb shell bmgr restore PACKAGE
Run Code Online (Sandbox Code Playgroud)
这不会达到您的预期。特别是,它调用当您的应用程序调用 BackupManager.requestRestore(observer) 时发生的代码路径。在此特定代码路径中,应用程序在恢复操作后不会关闭,因为应用程序已要求观察操作本身。这意味着应用程序进程仍在运行,但有一个基类应用程序。它是一个高级用户 API,只有当应用程序使用原始键/值备份 API 时才安全。您需要使用其他 bmgr 语法进行测试:
adb shell bmgr restore TOKEN PACKAGE
Run Code Online (Sandbox Code Playgroud)
其中TOKEN是应使用哪个数据集的标识符。至少在最新版本的操作系统上,您可以在 的输出中看到当前和祖先数据集标记adb shell dumpsys backup。
这一切都需要更好地记录下来,并且不那么令人惊讶。
通常不鼓励对应用程序进行子类化;这是原因之一。尝试使用您自己的惰性初始化静态而不是子类化应用程序。
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |