最近在做recovery模式下的升级,简单的总结一下。

先说说recovery模式,他是个升级小系统,有单独的kernel,通过特定的系统命令就可以进入到此系统中,选择进入正常系统的kernel还是recovery系统的kernel,

决定在于bootloader中,recovery中的boot与正常系统的boot烧写的是相同的kernel,不同点在于,recovery模式有一个单独的rootfs,这个是一个非常小的系统,

系统的很多功能也是不启动的, 主要目的就是留给升级流出足够的内存,主系统与recovery系统通信的桥梁就是/cache分区,此分区在正常系统启动与recovery

模式都是要被挂载mount。在主系统写命令到cache中,在recovery中读取,升级后,升级结果及日志也是在cache中。

recovery系统中大致流程,有些觉得不重要就省略了

1、执行find_recovery_partition.sh脚本它的工作就是生成/res/recovery_volume_detected文件,很重要的,挂载分区,attach类型为ubi的分区,如system modem。

2、rc启动脚本主要是启动了调用recovery进程的脚本,此脚本中运行recovery进程,升级的所有功能就在recovery进程中完成,recovery进程中涉及到的load_volume_table()

函数,读取的文件就是由find_recovery_partition.sh脚本生成的。

3、读取升级命令,升级命令位于/cache/recovery/command中,格式可以看函数注释。在此过程中会写misc分区一个msg,主要是防止升级过程中掉电,在lk中会

读取misc中的msg,如果升级中异常掉电,系统加载起来之后就继续进入recovery模式进程升级。

4、接下来就是从升级包重获取可执行程序,读取到/tmp中,升级包签名校验,本项目没涉及到不多说,然后就是创建管道,创建子进程,子进程中执行updater进

程。将进度,结果等通知到主进程,直到升级结束。

5、updater进程的执行过程,有太多的文件讲了及就不讲了。

6、升级结束后,finish_recovery做收尾工作,拷贝日志,写升级结果,然后系统reboot。

7、重启后,主系统正常启动后,就可以从cache中获取到当前升级的结果,日志,升级包等。

遇到的一些问题:

1、对nand来说,存在flash层的操作与mtd层的操作,lk中是对flash的操作可以按照页,页大小有2048/4096,mtd层对block操作的,一般都是好多个页组成,如64*2048,

作为一个block。有个分区比较特殊,不能多写flash,因为就是recovery中是mtd层的操作,想要精确,只能在lk中去做,比较特殊。

2、使用的打包工具,高人写了脚本,可以将modem分区按照ubi的方式打包,很是厉害啊,对比了下文件展开方式,升级包比较小,升级还快,真实佩服啊。

3、整个recovery模式升级功能其实高通已经完成了很多关键,主要的功能,我们也是简单的使用了下。

10-24 新增流程图

简单说明

1、流程图中省略也很多细节,其实好多细节都是可以拿出来大写特写,比如差分文件是如何计算生成的(涉及imgdiff 与bsddiff),对于有文件系统的文件权限的处理

(full package时更关心一点)  updater-script脚本用于执行的脚本解析器的运行,等等

2、标注红色的部分是我认为比较关键和重要的部分,包括为说明的updater-script每条命令对应的回调函数。

3、可能不同的应用场景不一样,当前没有将ui部分的逻辑,还有升级前的条件检查处理,升级异常等等。

4、recovery进程执行结束之后会执行收尾工作,保存日志,写升级结果等等,然后就是syse_reboot,图中带recovery 的块其实就是在recovery进程中执行的, 按照函数

调用顺序写的。

长按二维码关注【嵌入式C部落】,获取更多编程资料及精华文章

recovery模式差分(增量)升级小结的更多相关文章

  1. Android App增量升级

    移动互联网主打的就是用户体验和产品的快速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力.说的接地气点就是,你频繁的升级更新,有时只是修复了几个bug或者微调了下界面, ...

  2. 浅析android应用增量升级(转)

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 很久没有更新博客了,真是堕落啊,几次想提起笔,却总是被各种琐事耽搁,以后会多写文章记录点滴. 背景         ...

  3. 【转】Android Recovery模式

    原文网址:http://leox.iteye.com/blog/975303 (muddogxp 原创,转载请注明) Recovery简介 Android利用Recovery模式,进行恢复出厂设置,O ...

  4. Android Recovery模式学习体会

        最近在学习Android的Recovery模式,感觉它和Windows的安全模式很相似.两者的工作原理都是只加载少量的系统组件(内核是必须的),使系统运行在最小模式,这样就可以在不影响当前系统 ...

  5. FastBoot BootLoader Recovery 模式解释

    理论上,所有的Android设备都存在着Fastboot/Bootloader模式,不过,由于Android操作系统的开源特性,各厂商的对 自家的相关Android设备都有着各自不同的Fastboot ...

  6. Android系统Recovery模式的工作原理【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464987  在使用update.zip包升级时怎样从主系统(main system)重启进 ...

  7. Recovery模式【转】

    本文转载自:http://tieba.baidu.com/p/2299027486 Recovery模式是手机系统的一个工程模式,作用是恢复和清除.用户进入这个模式之后,可以对当前系统的一些数据进行清 ...

  8. 手把手实现andriod应用增量升级

    近期研究了android应用增量升级的应用.当中用到了android NDK编程,先说下为什么要使用增量升级.当我们的应用达到一定大小的时候,比方眼下有30M.假设新版本号35M仅仅是添加了几个功能, ...

  9. 安卓Recovery模式该怎么用?【转】

    本文转载自:http://android.baike.com/article-109914.html 安卓系统出了名的刷机刷机再刷机,说起刷机就不能不谈Recovery模式,这项刷机过程中最重要的一到 ...

随机推荐

  1. Python 爬虫监控女神的QQ空间新的说说,实现邮箱发送

    主要实现的功能就是:监控女神的 QQ空间,一旦女神发布新的说说,你的邮箱马上就会收到说说内容,是不是想了解一下 先看看代码运行效果图: PS:只有你有一台云服务器你就可以把程序24h运行起来 直接上代 ...

  2. POJ 3069——Saruman's Army(贪心)

    链接:http://poj.org/problem?id=3069 题解 #include<iostream> #include<algorithm> using namesp ...

  3. 记一次linux Docker网络故障排除经历

    背景: 之前做了一个项目,需要在容器内访问宿主机提供的Redis 服务(这是一个比较常见的应用场景哈), 常规方案: ①   主机网络(docker run --network=host): 完全应用 ...

  4. C#调用OpenCV开发简易版美图工具

    前言 在C#调用OpenCV其实非常简单,因为C#中有很多OPenCV的开源类库. 本文主要介绍在WPF项目中使用OpenCVSharp3-AnyCPU开源类库处理图片,下面我们先来做开发前的准备工作 ...

  5. jq 加载的几种方法

    jQuery加载的几种方式 //①页面加载完之前执行,与嵌入的js加载方式一样 (function ($) {     alert('start'); })(jquery); //②页面加载后执行 $ ...

  6. Fcitx使用搜狗词库与皮肤

    在 \(\text{Linux}\) 环境下,\(\text{Fcitx}\) 确实是最好用的开源输入法之一.然而 \(\text{Windows}\) 下的巨头输入法 -- 搜狗,对 \(\text ...

  7. 02-13 Softmax回归

    目录 Softmax回归 一.Softmax回归详解 1.1 让步比 1.2 不同类之间的概率分布 1.3 目标函数 1.4 目标函数最大化 二.Softmax回归优缺点 2.1 优点 2.2 缺点 ...

  8. cocos2d-x 系统学习cocos(1)

    简析HelloWorld场景 以前使用cocos2d-x 3.14的时候,HelloWorld并不是一个场景类,而是一个图层类,当时的HelloWorld::createScene()是长这样的 Sc ...

  9. Springboot2.x + ShardingSphere 实现分库分表

    之前一篇文章中我们讲了基于Mysql8的读写分离(文末有链接),这次来说说分库分表的实现过程. 概念解析 垂直分片 按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用. 在拆分之前 ...

  10. 解决:Specifying a namespace in include() without providing an app_name和XXX is not a registered namespace问题

    python3 Django 环境下,如果你遇到namespace没有注册以及在根目录下urls.py中的include方法的第二个参数namespace添加之后就出错的问题. 出错问题: 'Spec ...