该网站已经迁移到:blog.xwdoor.net

论 Android 恢复出厂设置无效与系统更新升级(ROM 安装)失败的解决方案

android xwdoor 232℃ 0评论

论 Android 恢复出厂设置无效与系统更新升级(ROM 安装)失败的解决方案

1.背景

公司产品需要实现恢复出厂设置的功能,我将此功能的代码写在了 rebootWipeCache 方法中,代码如下:

原理:发送一个特定的(恢复出厂设置)广播,剩下的交给系统处理。

这里简单介绍一下出厂设置时的系统流程:

  • 1️⃣系统收到(恢复出厂设置)广播 ->
  • 2️⃣创建 /cache/recovery/command 文件,并写入配置参数
  • 3️⃣重启,进入 recovery 模式 ->
  • 4️⃣读取 /cache/recovery/command 文件获取 recovery 的配置参数 ->
  • 5️⃣开始恢复出厂设置 ->
  • 6️⃣重启完成,清除 /cache/recovery/command 文件

Android 系统升级(ROM 安装)也基本上是这个流程,区别是第4️⃣步中读取的参数不一样。

2.出厂设置无效

OK,一切进展的很顺利,自测时,在按键(按钮)点击事件中调用了 rebootWipeCache 方法,然后系统也成功恢复出厂设置了。

功能测试通过后,就是按照真正的产品需求,将调用的地方挪到了 ApplicationonCreate 中,然后意外发生了:rebootWipeCache 方法调用了,设备也的确重启了,但是恢复出厂设置无效,这就尴尬了。

3.问题原因

经过一个下午的 log 遍历与寻找,终于找到了问题所在。

首先说说开机完成广播:BOOT_COMPLETED,顾名思义,该广播是在开机完成后发送的全局广播。

那什么算开机完成呢?在硬件同学的帮助下翻看源码,发现是在 launcher 启动后,才会发送这个广播,发送这个广播的同时,系统也会清除 command 文件。

巧合的是,公司的 App 也是作为了一个 launcher 身份而存在,且咱们在 ApplicationonCreate 中(launcher 启动前)调用了恢复出厂设置方法,而这个时候我们的 BOOT_COMPLETED 广播还没有来得及发送。

简单来讲就是,我们在 BOOT_COMPLETED 广播发出之前创建了 command 文件,然后 BOOT_COMPLETED 广播来了,又把 command 文件给删了,,对,就是这么悲剧。

4.解决方法

知道了原因,怎么解决,就是仁者见仁,智者见智了。我采用的方法是利用 command 文件的删除机制:只要将 command 文件名改成 last_command,就不会被系统删除。

最后的最后,ROM的安装失败的原因相同,原因相同,原因相同。

转载请注明:xwdoor » 论 Android 恢复出厂设置无效与系统更新升级(ROM 安装)失败的解决方案

喜欢 (2)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址