文章目录
1. Recovery介绍
1.进入方式:reset + vol-, 或者根据各个平台而定
2.用途:
2.1恢复系统到出厂模式,即擦除用户数据和缓存数据
2.2系统升级
系统升级大体来说包含两种方式:1.在线升级,利用网络,系统自动连接服务区下载ota升级包;2.离线升级,将下载到的ota包放在指定位置,然后进入升级模式。每次启动,flash_image程序会检查recovery分区中的image的header。如果与备份的recovery.img不符就会把备份写道recovery分区。出于安全方面的考虑,ota是有签名的,recovery对签名是有要求的。如果想要破解的话就是更换一个不检查签名的recovery的程序
3.结构
从架构上面来说recovery分为三个部分
1.main system:用boot.img驱动linux系统,这种属于android启动的正常工作模式。
2.recovery:用recovery.img启动的linux系统,主要是运行recovery程序
3.bootloader:除了加载/启动系统,还会通过读取flash的misc分区来获得main system和recover的消息,根据读取结果觉得何种操作。
2. Framework recovery 分析
Framework层中的Recovery做的事情比较少,主要作用就是写命令,然后重启。
2.1 Framework Recovery流程
2.2 Framework Recovery 分析
android/framework/base/core/java/android/os/RecoverySystem.java通过浏览的方式选择好升级包之后就会调用下面的函数:
public static void installPackage(Context context, File packageFile)
throws IOException {
String filename = packageFile.getCanonicalPath(); //获取升级包的路径及名称。这里面在升级时,如果升级包是放在sd卡中,获取到的地址是/storage。会导致后面异常提示找不到文件
FileWriter uncryptFile = new FileWriter(UNCRYPT_FILE);
try {
uncryptFile.write(filename + "\n");
} finally {
uncryptFile.close();
}
Log.w(TAG, "devin !!! REBOOTING TO INSTALL " + "sdcard" + " !!!");
// If the package is on the /data partition, write the block map file
// into COMMAND_FILE instead.
if (filename.startsWith("/data/")) {
//如果升级包是放在data目录下面,则将文件地址转化为下面的值,也可能导致文件找不到异常
filename = "@/cache/recovery/block.map";
}
//填写参数
final String filenameArg = "--update_package=" + filename;
final String localeArg = "--locale=" + Locale.getDefault().toString();
//这个函数比较重要下面分析一下
bootCommand(context, filenameArg, localeArg);
}
将上述的参数写入到文件中/cache/recovery/command,然后调用powermanager重启系统
private static void bootCommand(Context context, String... args) throws IOException {
RECOVERY_DIR.mkdirs(); //创建文件目录/cache/recovery
COMMAND_FILE.delete(); // 删除之前的/cache/recovery/command文件。这个文件中包含了recovery需要的参数
LOG_FILE.dele