一种电子设备的升级包制作方法和升级方法、升级包
技术领域
本发明涉及一种电子设备的升级包制作方法及其软件升级方法、升级包,本发明属于通信领域。
背景技术
在一个完整的电子设备中,软件的升级功能是必不可少的重要组成部分。现有的升级方案一般是将升级模块编译成目标文件,并链接到整个系统工程中,这种方案存在的问题有以下几点:
对于多种不同类型的设备,需要给每套设备实现一套升级代码,不利于代码模块化和复用,维护成本高。
升级方法固定,无法做到功能扩展,需要在前期设计升级方案时考虑十分周全,在后续如果存在新的需求,无法做到平滑扩展。
每次升级都需要使用完整升级包对整个软件进行升级,升级包过大,升级时间过长。
若升级包内某分区过大,会造成升级失败且无法提前预防。
发明内容
本发明克服现有技术的困难,提出一种电子设备的升级包制作方法及其软件升级方法、升级包,本方法涉及一整套升级方案,包括升级包结构的定义、完整升级包和差分升级包的制作方法和升级方法,本发明升级方法具有通用性和可扩展性,可以方便快捷实现软件升级。
本发明的技术方案是:
一种电子设备软件的升级包制作方法,包括如下步骤:步骤1.1:编译各模块生成能识别的目标文件,同时提取各模块的模块版本信息;步骤1.2:检查各模块是否符合生成升级包的规则,当模块匹配升级包规则,制作升级包版本文件;步骤1.3:进入升级包制作,具体步骤如下:步骤1.3.1:将升级包第一行写入包头标记;步骤1.3.2:计算模块目标文件数和对应模块升级脚本数量,再加上升级总脚本,写入升级包第二行;步骤1.3.3:以“模块1(升级包版本文件 )、模块升级脚本1(升级包版本文件操作脚本),模块2(目标文件)、模块升级脚本2、……、模块n(目标文件)、模块升级脚本n、升级总脚本”排列方式将对应文件的长度进行排列;步骤1.3.4:将所述步骤1.3.3排列文件打包成升级包;
所述步骤1.2包括如下步骤:步骤1.2.1:检查各模块包文件大小,对每个模块的大小都设置两个门限值,如果突破较小门限值,上报告警信息通知开发人员;如果突破较大门限值,直接停止操作,上报错误信息;步骤1.2.2:根据从各模块中提取模块版本信息判断个模块是否匹配,不匹配则报错,匹配则继续下后续步骤。所述步骤1.3后续步骤进一步包括在包尾加入md5值。
所述步骤1.3后续步骤进一步包括在包尾加入版本信息验证或者模块大小限制信息。
所述包头标记设置为完整升级包区分标记或者差分升级包区分标记。
所述升级包采用二进制文件形式将排列文件制作。
所述升级包版本文件可加入符合规则的其它信息。
一种电子设备软件的升级包制作方法进行升级的方法,包括如下步骤:步骤1.4.1、获得制作差分升级包所需的两个完整升级包;步骤1.4.2、根据新旧两个升级包的版本信息判断是否能制作差分包;步骤1.4.3、利用升级包中计入的模块数量和长度将两个完整升级包分别切割成目标文件和脚本;步骤1.4.4、通过二进制比较的方法比较新老两种升级包里各模块的目标文件,对于新旧两个升级包中一致的模块不做处理,而对于新旧两个升级包中不一致的模块做如下处理:解压这些模块并对解压后文件进行二进制比较,对于旧包有而新包没有的文件,制作删除该文件的脚本;对于新包有而旧包没有的文件或者新旧包中都有的文件,则只保留新包中的文件;步骤1.4.5、将步骤1.4.4保留的文件及对应的新包的升级脚本按所述步骤1.2至步骤1.3的升级包打包方式做成差分升级包文件。
所述升级方法通过升级命令的参数,指定采用在线升级或者离线升级。
一种电子设备软件的升级包制作方法的升级包,包括如下四个部分:第一部分为包头标识;第二部分为待升级模块目标文件数和对应模块升级脚本以及升级总脚本的数量;第三部分为以“模块1(升级包版本文件)的长度、模块1模块脚本(升级包版本文件操作脚本)的长度、模块2(目标文件)的长度、模块2模块升级脚本的长度、……、模块n(目标文件)的长度、模块n模块升级脚本的长度、升级总脚本的长度”排列;第四部分为物理拼接一体的所述第三部分排列文件。
本发明方法的优点是:
采用本发明方法,如果将来对某个模块(例如n)的升级操作有改动,可以直接修改对应的模块升级脚本(n.sh),不需要修改C代码,也就不需要重新编译工程。如果将来需要增加或减少模块,也只需要增加对应的模块升级脚本或在升级包中不打入减少模块的目标文件和模块升级脚本,工程整体框架不需要改动。
附图说明
图1为本发明中升级包结构示意图;
图2为本发明中升级总流程示意图;
图3为本发明中完整升级包打包流程示意图;
图4为本发明中差分升级包打包流程示意图;
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及具体实施方式对本发明作进一步的详细描述。
本发明提出了一整套电子设备的软件升级方法,包括升级包的制作方法和使用升级包升级的功能实现方法。
首先是制作升级包的过程,升级包的结构如图1所示,
升级包主要包括4个部分。第一部分即第一行,是一个包头标识,主要用来区分本升级包是完整升级包还是差分升级包。第二部分为第二行,是一个标记升级包是由多少个文件拼接而成的数字,假设包括版本信息在内共有n个模块待升级,此行数字为2n+1,每个模块包括两个文件,分别为一个待升级文件和一个模块升级脚本,模块1固定为版本信息,最后一个文件为升级总脚本。第三部分为接下来的2n+1行,每一行都是一个表示文件长度的数字,分别为“模块1的长度、模块1模块升级脚本的长度、模块2的长度、模块2模块升级脚本的长度、……、模块n的长度、模块n模块升级脚本的长度、升级总脚本的长度”。第四部分是紧接着的一整块内容,是上述n+1个文件直接物理拼接在一起。
升级包结构定义成上述模式是为了方便解包和扩展功能。对于解包来说,在知道了升级包一共由多少个文件组成,及每个文件的大小,可以很简单的将每个文件分割出来。当模块升级方式有变化或模块有变化(例如增加或减少)时,可以通过改变升级包里面的组成文件,例如修改或增加或减少相应的模块文件的模块升级脚本文件来实现,而不需要重新实现整个升级功能。
制作升级包全套过程使用打包脚本和差分包制作脚本完成,包括以下步骤,
制作完整升级包包括以下步骤,如图3所示:
步骤1.1,逐个编译待升级的各个模块成机器能识别的语言形成目标文件,将各模块编译出来的目标文件拷贝到指定目录,并将各模块的目标文件按二进制的方式直接连接成一个文件进行打包,各模块依次进行编译,直至整个工程完全编译结束,在编译过程中如遇到编译失败问题,立即停止并上报错误信息。在每个模块编译完成的同时提取该模块的版本信息。本步骤目标文件就是通过编译系统将开发人员写的代码转化为机器可以执行的文件。
步骤1.2:检查各模块是否符合生成升级包的规则,当模块匹配升级包规则,制作升级包版本文件;本步骤检查各模块是否符合生成升级包的规则包括如下分步骤:
步骤1.2.1:检查各模块包文件大小,对每个模块的大小都设置两个门限值,如果突破较小门限值,上报告警信息,通知开发人员,模块大小已经较大,后续开发中要注意大小问题,操作继续,如果突破较大门限值,直接停止操作,上报错误信息。
步骤1.2.2:根据从各模块中提取模块版本信息判断个模块是否匹配,不匹配则报错,匹配则继续。采用打包脚本根据规则生成升级包版本文件,里面包含升级包版本信息和各模块版本信息以及打包时间、工程信息等各种有用信息。
本发明升级包版本文件就是将提取出来的个模块版本信息综合起来按一定规则记录到一个文件中,该文件中还需要包括一个副项目规定的升级包版本号和打包时间,此外,根据不同项目的需求,还可以在升级包版本文件中增加需要记录的其它信息,这些信息可以是为了标记升级包的,也可以是为了给升级过程中使用的,还可以是为了给升级后的设备使用的,总而言之,任何希望记录下来的信息都可以制作进升级包版本文件中,只需要符合项目制定的规则就行。
步骤1.3:制作完整升级包,将升级包各组成部分按二进制文件方式连接成一个文件。
步骤1.3.1:第一行写入包头标记,包头标记用来区分升级包是完整升级包还是差分升级包。包头标记可以自由定义,例如A表示完成升级包,B表示差分升级包,如果还有其他类型的升级包可以用C、D、E……来表示。
步骤1.3.2:计算模块目标文件数和对应模块升级脚本数量,再加上1(升级总脚本),写入升级包第二行。举例:第二行写入升级包包含的文件个数,假设共有n个模块需要升级,此处填入2n+1,代表共有2n+1个文件需要连接,分别为n个模块及其模块对应的模块升级脚本和升级总脚本。
步骤1.3.3:从第3行到第2n+3行分别为n个模块及其对应的模块升级脚本和升级总脚本这2n+1个文件的大小,排列方式为:模块1(升级包版本文件)、模块升级脚本1(升级包版本文件操作脚本)、模块2(目标文件)、模块升级脚本2、……、模块n(目标文件)、模块升级脚本n、升级总脚本。即后续各行依次写入各目标文件和脚本的大小。此步骤中升级包版本文件是步骤1.2.2形成,升级脚本是实现按照升级要求写的文件放置于指定目录中。
步骤1.3.4:将步骤1.1形成的目标文件和脚本按二进制方法拚接至升级包中:然后按照“模块1(升级包版本文件)、模块升级脚本1(升级包版本文件操作脚本)、模块2、模块升级脚本2、……、模块n、模块升级脚本n、升级总脚本”的顺序将所有文件按二进制方式无缝连接到升级包里。文件可以命名为“0, 0.sh;1, 1.sh;2, 2.sh;……;(n-1)/2, (n-1)/2.sh;upgrade.sh”。其中文件0为版本文件,0.sh为版本文件操作脚本。
步骤1.3.5:在包尾加入md5值。
本发明打包步骤有两步,第一步是把上述文件“模块1(升级包版本文件 )、模块升级脚本1(升级包版本文件操作脚本),模块2(目标文件)、模块升级脚本2、……、模块n(目标文件)、模块升级脚本n、升级总脚本”的长度按列打进去,在步骤1.3.3中体现出来。第二步是通过步骤1.3.4把上述文件的实体打包进去。
为了防止错误升级,可以加入版本信息验证或者MD5值验证,同时在打包时加入大小限制,防止因模块过大导致升级失败。
制作差分升级包包括以下步骤,如图4所示:
制作差分升级包,差分升级包的目录结构和完整升级包的目录结构保持一致,制作方法由差分包制作脚本实现。升级前版本的升级包为旧包,升级后版本的升级包为新包。获取制作差分升级包所需的两个完整升级包,根据两个升级包的版本信息判断是否能制作差分包;利用升级包中计入的模块数量和长度将两个完整升级包分别切割成目标文件和脚本,对新旧模块目标文件做二进制比较。对于新旧两个升级包中一致的模块不做处理,对于新旧两个升级包中不一致的模块做下步处理。具体步骤如下:
步骤1.4.1:将需要进行差分升级对应的升级前完整升级包和升级后完整升级包解压成单个模块包。
步骤1.4.2:根据版本文件信息,判断这两个版本间是否能进行差分升级,如果不能,停止操作,并上报错误信息,如果可以,根据原有版本信息生成新的差分包版本信息,然后继续操作。利用升级包中计入的模块数量和长度将两个完整升级包分别切割成目标文件和脚本。
步骤1.4.3:利用升级包中计入的模块数量和长度将两个完整升级包分别切割成目标文件和脚本。具体步骤为:通过二进制比较的方法比较新老升级包里的模块,对于完全一样的模块不做操作。对于老包中没有而新包中有的模块,直接将新包中的模块文件放入待生成的差分包目录中,目录结构和新包目录结构保持一致。对于老版本中有而新版本中没有的模块以及两个版本不一样的模块,继续进一步处理将其解压成编译生成的目标文件。
步骤1.4.4:通过二进制比较的方法比较新老两种升级包里各模块的目标文件,对于新旧两个升级包中一致的模块不做处理,而对于新旧两个升级包中不一致的模块做如下处理:解压这些模块并对解压后文件进行二进制比较,对于旧包有而新包没有的文件,制作删除该文件的脚本;对于新包有而旧包没有的文件或者新旧包中都有的文件,则只保留新包中的文件。
步骤1.4.5:按以上步骤处理不同情况,将这些保留的文件及对应的新包的升级脚本按新包的目录结构,按完整升级包的打包方式做成差分升级包文件。步骤1.4.4制作的删除脚本放入差分升级包中,在升级时调用删除脚本就会自动删除掉设备中的这些目标文件。差分包中的版本信息文件和升级总脚本使用新包中的版本信息文件和升级总脚本。
使用升级包升级的过程包括C语言实现的部分和脚本实现的部分,完整升级包和差分升级包的升级流程执行方式没有区别。如图2所示,升级时执行升级命令upgrade,执行文件upgrade完成获取、验证、解包等操作,然后调用upgrade.sh升级总脚本。upgrade.sh升级总脚本会完成升级前的初始化工作,然后调用所有的模块升级脚本n.sh,最后完成通用的结束工作。模块升级脚本n.sh实现个模块升级特有的升级操作。
本发明软件升级方法过程具体如下:
步骤2.1:对于和获取升级包和解包这些通用功能部分,由C语言实现功能,可执行文件由系统工程编译完成。
步骤2.1.1:通过升级命令的不同参数,指定采用在线升级还是离线升级。在线升级,通过ftp协议,从指定的远程服务器获取升级包。离线升级,直接找到本地指定目录中的升级包。
步骤2.1.2:先校验升级包的md5值,校验失败直接停止升级并上报错误,成功则继续后面操作。
步骤2.1.3:通过升级包第一行的包头标志确定获取的升级包是完整升级包还是差分升级包,为后续选择升级方式做准备。
步骤2.1.4:通过第二行的数字n和后面第3至n+2行的数字确定n+3行开始的文件需要分割成的n个文件和每个文件的大小。分割文件时同时给文件命名为“0, 0.sh;1,1.sh;2, 2.sh;……;(n-1)/2, (n-1)/2.sh;upgrade.sh”。其中文件0为版本文件。
步骤2.1.5:调用升级总脚本文件upgrade.sh。
步骤2.2:具体的升级操作用升级总脚本来实现,以便于升级模块的通用化和后续升级功能的扩展和定制。
步骤2.2.1:upgrade.sh升级总脚本实现升级的流程控制功能。首先,对当前设备的版本文件和升级包的版本文件(即前面分割出来的文件0)进行规则匹配校验,如果符合规则,继续下列操作,如果不符合规则,操作停止,上报错误信息。
步骤2.2.2:接下来,由upgrade.sh依次调用前面分割出来的模块升级脚本文件(即n.sh),由模块升级脚本完成对应模块的升级功能,例如0.sh模块升级脚本对应模块0,n.sh对应模块n。
步骤2.2.3:进入单个模块升级阶段,由前面2.1.3步骤确定的是差分包升级还是完整包升级来分别进入模块升级脚本n.sh的不同分支,执行不同的操作流程。
步骤2.2.4:如果是完整包升级,由n.sh模块升级脚本将完整升级包中对应的n文件进行相应处理后拷贝到指定区域。
步骤2.2.5:如果是差分升级,由n.sh模块升级脚本将差分升级包对应的n文件和设备中对应模块的文件解压,用差分包中的编译目标文件文件替换掉设备中解压出来的文件(存在同名文件时直接覆盖),然后运行差分包中的删除多余包的删除脚本(在制作差分升级包时生成),将原来需要现在不需要的多余文件删除,最后将模块文件打包还原拷贝到指定区域。
当upgrade.sh调用完所有的模块升级脚本文件(0.sh-n.sh),过程中无错误,则升级成功。
如果将来对某个模块(例如n)的升级操作有改动,可以直接修改对应的模块升级脚本(n.sh),不需要修改C代码,也就不需要重新编译工程。如果将来需要增加或减少模块,也只需要增加对应的模块升级脚本,工程整体框架不需要改动。
本发明如果需要增加一个模块叫n+1,那么只需要编译出n+1目标文件,再编写一个(n+1).Sh的模块升级脚本,在打包时一起打入升级包,整体升级程序不需要做任何改动,就可以直接升级。如果要删除n-1这个模块,只需要在在打包时不打入n-1的目标文件和脚本就行。如果要改变n这个模块的升级方式,只需要改变n的目标文件和n.sh。
本发明之所以在解包时将解出来的目标文件和模块升级脚本命名为数字,也是为了方便扩展,因为不同项目需要升级的模块的数目是不同的,模块名也肯定不一样,所以直接以数字命名,依次加一,只需要模块目标文件和对应的模块升级脚本能正确对应就不会升级错误,在升级时只要遍历执行完所有的模块升级脚本就不会造成遗漏。
需要强调的是,本发明所述的实施例是说明性的,而不是限定性的,因此本发明并不限于具体实施方式中所述的实施例,凡是由本领域技术人员这样根据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。