swupdate 之 readback handler
背景
使用 swupdate
作为 OTA
方案 ,有项目要求在写入数据到分区之后需要再次读出校验。
初步实现:readout-verify attribute
初步分析有两种方式
- 方案一
在每一笔数据写入后,立刻读出校验。此时原始数据还在 buffer
中,读出的数据直接跟原始 buffer
做比较即可
- 方案二
在将分区数据完全写入后,再读出校验。
注意在流式升级的情况下,源数据是分片传输写入的,用完即弃,因此写完整个分区之后已经没有原始数据可以比较了。
此时要么重新从数据源获取(不可取,相当于下载两次 OTA
包),要么需要在 OTA
包中额外配置好校验值,对读出数据计算得到的校验值进行比较。
出于简单考虑,选择了方案一进行实现,为 image
增加了一个 readout-verify
属性,配置后在每笔数据写入后均会读出校验,校验的方式是直接跟源 buffer
比较。
功能很简单,但由于源码中并未考虑这种情况,因此用于校验的 buffer
无法传递,只能反复申请和释放,问题不大只是看着有点别扭。
尝试把 patch
发出来,想听听作者的意见,结果作者回复已经有一个 readback handler
用于支持读出分区数据进行校验了。
社区实现: readback handler
这个 reabback handler
采用 scripts
的形式,在所有 image
写入完成后,再对 image
进行读出校验,sha256
校验值需要在 sw-description
中预先配置好。
举个例子:
scripts: (
{
device = "/dev/mmcblk2p1";
type = "readback";
properties: {
sha256 = "e7afc9bd98afd4eb7d8325196d21f1ecc0c8864d6342bfc6b6b6c84eac86eb42";
size = "184728576";
offset = "0";
};
}
);
功能顾名思义,就是读出指定 device
的指定范围的数据,算出 sha256
值,验证与配置中的 sha256
值是否一致。
具体的配置描述如下表。
字段 | 类型 | 描述 |
---|---|---|
device | string | 要校验的分区节点 |
type | string | 标注handler |
sha256 | string | 分区的sha256值 |
size | string | 要校验的数据大小(单位:字节)。如果未设置或设置为0,则会自动获取分区大小 |
offset | string | 要校验的数据偏移(单位:字节)。如果未设置,默认为0 |
总结
稍微比较下两种实现(以下列出的缺点是相对另一个而言,所以优点就不赘述了)
readback handler
的缺点在于
- 实现较为复杂,使用也较为复杂,需要配置
sha256
(当然一般是通过脚本自动化生成) - 先完全写入再校验,即出问题时不会立刻报错保留现场,而是在所有
image
均写入完成后,才进行校验 - 对某些定制不方便实现,例如要求在出错时重试该笔数据的写入
readout-verify attribute
的缺点在于
- 在某些情况下不适用,例如配合
ubi handler
,配合rdiff handler
- 只能保证该笔数据写入正确,无法保证完整数据未被篡改。例如写入
A
数据后读出校验成功,再写入B
时影响到了A
,则无法被检测到
综上,优先选择社区默认的 readback handler
,实在有无法满足的定制化需求时,再考虑自行实现特殊属性和行为。
blog: https://www.cnblogs.com/zqb-all/p/12827506.html
公众号:https://sourl.cn/T4Skam
swupdate 之 readback handler的更多相关文章
- 【swupdate文档 四】SWUpdate:使用默认解析器的语法和标记
SWUpdate:使用默认解析器的语法和标记 介绍 SWUpdate使用库"libconfig"作为镜像描述的默认解析器. 但是,可以扩展SWUpdate并添加一个自己的解析器, ...
- android Handler介绍
Handler使用介绍: Handler根据接收的消息,处理UI更新.Thread线程发出消息,通知Handler更新UI. Handler mHandler = new Handler() { p ...
- Handler
1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...
- Android笔记——Handler Runnable与Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
- Handler系列之内存泄漏
本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public clas ...
- Handler系列之创建子线程Handler
上一篇我介绍了Handler机制的工作原理,默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handl ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
随机推荐
- python 判断一个字符串是否是小数
"""练习判断一个小数1.判断是否合法2.合法需要有一个小数点3.小数点左边必须是个整数,右边必须是个正整数 """ def xiaoshu ...
- 选择排序(C++,Java,Python实现)
排序算法之选择排序,选择排序,选择排序的基本思想描述为:每一趟在n-i+1(i=1,2,-,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.具体来说,假设长度为n的数组arr,要按照从小 ...
- mappedBy和JoinColumn,onetomany。
无论是onetomany,还是manytoone.都要设置级联关系(cascade),否则不会储存关联的数据. @Entity public class Clazzss { @Id @Generate ...
- Java并发之显式锁和隐式锁的区别
Java并发之显式锁和隐式锁的区别 在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchr ...
- SpringBoot 2.x 开发案例之前后端分离鉴权
前言 阅读本文需要一定的前后端开发基础,前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx代理+Tomcat的方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微 ...
- lr集合点
集合点:rendezvous point =====>>loadrunner的虚拟用户中,并发concurrent\ 同时simultaneous的区别: concurrent并发:指虚拟 ...
- Docker命名空间
命名空间 命名空间( namespace )是 Linux 内核的一个强大特性,为容器虚拟化的实现带来极大便利,利用这 特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系 ...
- shell 数组遍历加引号和不加引号的区别?
前言 shell 是一个比较神奇的国度,里面有太多的坑需要填,今天需要填的坑就是,数组遍历在使用时加了引号和不加引号的区别. 案例 解析: 不加引号,数组中元素间的“空格”就会编程换行符 加引号, ...
- elementUI踩坑
1.滚动条消失,body中莫名出现行内样式overflow: hidden; 在做某个图片上传,显示功能出现的问题.控制台并没有报错,代码也并无相关操作 必须重新刷新页面之后滚动条才会显示出来 几天后 ...
- 忍不住还是手写了一遍博客的css
F12边调边改,的一点一点撸出来这个效果.感觉已经可以了.日历感觉没什么用直接隐藏了.