Recovery流程梳理

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流程
Created with Raphaël 2.2.0 RecoverySystem verifyPackage verify result InstallPackage Write recovery commands Reboot System OTA failed yes no
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值