下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

简单分析Android RecoverSystem 类

作者:课课家教育     来源: http://www.kokojia.com点击数:1015发布时间: 2016-04-18 16:59:11

标签: Android RecoverSystemAndroidAndroid System

     Android系统出了名的常刷机,说起刷机就不能不谈Recovery模式,这项操作在刷机过程中是重要的一道步骤。Recovery一般称为刷机模式或工程模式,也可以理解为电脑的GHOST。在这个模式下你可以直接用sd 卡上的zip 的rom 升级或者备份你的系统,老版本的recovery 只有三个选项,无法备份系统,只能用update.zip这个文件名的文件升级,不能用任何文件名的zip文件升级。新版本已经多出很多选项可以供你操作。

简单分析Android RecoverSystem 类_Android RecoverSystem_Android System_课课家

  讨论IP网络升级时,需要一个后台服务做升级检测及下载数据,最后在定义下载的数据存放位置及如何做开机标志时,突然发现一个很好用的上层java类对象。

  frameworks\\base\\core\\java\\android\\os\\RecoverySystem.java

  那么这个类做了什么事情呢?又是如何做到的。

  RecoverySystem类,可以帮助我们调用系统还原等操作

  android.os.RecoverySystem,提供了如下静态方法

  static void installPackage(Context context, File packageFile) //重启设备,安装一个更新包

  static void rebootWipeUserData(Context context) //重启设备,清除用户数据分区类似恢复出厂设置

  static String handleAftermath() 提供清除recover中相关文件,在开机广播中被调用

  static void verifyPackage(File packageFile, RecoverySystem.ProgressListener listener, File deviceCertsZipFile) //验证加密签名的系统更新包在安装前,其中第二个数接口的具体定义为 android.os.RecoverySystem.ProgressListener 其中只有一个回调方法 abstract void onProgress(int progress) 来显示效验的进度。

  下面具体看一下代码中是如何实现:

  1、安装更新包:

  2、出厂恢复

  3、验证签名

  public static void verifyPackage(File packageFile,

  ProgressListener listener,

  File deviceCertsZipFile) 请自行阅读源码

  后面说一下重启 reboot 命令如何执行的:

  无论是 factory reset 工厂恢复还是 安装更新包都会调用到reboot函数,调用 pm.reboot("recovery");

  通到jni就是: android_os_Power.cpp

  shutdown 调用 android_reboot(ANDROID_RB_POWEROFF, 0, 0);

  reboot 调用 android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars);

  最终都是调用到下面函数:

  int reboot (int mode)

  {

  return __reboot( Linux_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode, NULL );

  }

  linux kernel 内核流程

  /bionic/libc/arch-arm/syscalls/__reboot.S

  这个文件由gensyscalls.py自动产生,调用系统调用 __NR_reboot

  bionic/libc/include/sys/linux-syscalls.h

  #define __NR_reboot (__NR_SYSCALL_BASE+88)

  /arch/arm/kernel/calls.S

  __NR_reboot?就是系统函数sys_reboot

  sys_reboot定义在./include/linux/syscalls.h,实现在./kernel/sys.c?sys_reboot会调用kernel_restart

  最终kernel_restart调用每一个架构特定的machine_restart,即machine_restart执行每个架构特定的函数。

     RecoverySystem类可以调用系统还原等操作,其通过了安装更新包、出厂恢复和验证签名来实现这个类,执行时需要重启 reboot 命令以及调用函数。

赞(21)
踩(3)
分享到:
华为认证网络工程师 HCIE直播课视频教程