具体实施方式
鉴于终端设备运行两套系统的成本高且更为复杂,终端设备通常适宜采用一套运行系统。对于只有一套运行系统的终端设备,本发明实施例提供的一种终端设备软件升级方法,在升级自身软件时,如果发生异常,可以实现终端软件的自动恢复,自动还原为升级前的原有软件版本,不会造成因升级失败而导致设备不能再使用的后果。
在本发明提供的一个升级恢复方法,如图1所示,可包括如下步骤:
步骤S101,获取软件的更新数据;
从升级服务器或其他方式获取软件更新需要的更新数据。
步骤S102,根据所述更新数据确定对应的所述软件的需更新的目标数据,根据所述目标数据获得恢复数据,保存所述恢复数据;
利用获取的更新数据对软件对应的目标数据进行更新,为保证升级失败时,可将软件恢复,故保存根据目标数据获得的更新数据。
步骤S103,利用所述更新数据更新所述软件中的所述目标数据;
需指出的是,步骤S102和步骤S103的执行没有严格的次序限制,可先执行步骤S102,在执行步骤S103,反之亦可。
步骤S104,确定所述软件升级失败,则根据所述恢复数据恢复所述软件的所述目标数据。
由于恢复数据是根据目标数据而获得,故,在软件升级失败时,可根据恢复数据恢复目标数据。
在上述实施例中,由于在软件升级的过程中保存了用以恢复目标数据的恢复数据,故可在软件升级失败时,将软件恢复至升级以前的版本,且该实现方法消耗的软件资源少,节约了实现成本。
在本发明提供的软件升级恢复方法的一个实施例中,上述实施例中的恢复数据可以是目标数据本身,故而,在升级失败时,可直接用保存的原目标数据恢复升级过程中被替换了的相应数据,从而实现软件的恢复。
在本发明提供的软件升级恢复方法的一个实施例中,上述实施例中的利用所述更新数据更新所述软件中的所述目标数据的步骤S103可以包括:保存所述目标数据中的第n目标数据块的数据,作为第n目标数据块的备份数据;
软件升级时,可对需升级的目标数据中的目标数据块逐块进行升级,当升级到第n目标数据块时,对第n目标数据块的数据进行备份。
用所述第n目标数据块对应的所述更新数据中的第n更新数据块中的数据更新所述第n目标数据块的数据;其中n为不大于所述目标数据的数据块的数量的自然数;
第n目标数据块中的数据备份之后,用第n更新数据块中的数据去更新第n目标数据块中的数据。
当确定所述软件升级失败,则根据所述目标数据获得恢复数据的步骤S104具体可包括:
若所述第n目标数据块的数据更新不成功,则将所述第n目标数据块的备份数据作为所述恢复数据;
当在对第n目标数据块进行更新时,更新过程发生异常,则可将第n目标数据块的备份数据作为恢复数据。
若所述第n目标数据块的数据更新成功,则获取所述第n更新数据块的数据与所述第n目标数据块的备份数据中不同数据的集合,得到所述第n目标数据块的差异数据集,将所述第n目标数据块的差异数据集作为所述恢复数据;
若第n目标数据块的数据更新成功,则可将第n目标数据块的差异数据集作为恢复数据进行保存。
在本发明的一个实施例中,上述得到所述第n目标数据块的差异数据集具体可以为:
从所述第n目标数据块的备份数据中获取所述第n目标数据块的数据集Aold;
将所述第n更新数据块的数据作为更新数据集Anew;
按如下算法求得所述第n目标数据块的差异数据集:
Adiff=Anew-Aold。
在本发明的一个实施例中,根据所述恢复数据恢复所述软件的所述目标数据可以包括:
判断需恢复的所述第n目标数据块在软件升级时是否更新成功;
若更新不成功,则用所述第n目标数据块的备份数据恢复所述第n目标数据块的数据;
如果更新不成功,则该数据块的对应的第n更新数据块的数据不便获取,故,采取使用第n目标数据块的备份数据恢复所述第n目标数据块的数据较为方便。
若更新成功,则用所述第n目标数据块的差异数据集恢复所述第n目标数据块的数据;
若更新成功,则更新后的该软件中对应数据块的数据就是第n更新数据块的数据,可方便地利用第n更新数据块的数据与第n目标数据块的差异数据集恢复第n目标数据块的数据。
具体而言,用所述第n目标数据块的差异数据集恢复所述第n目标数据块的数据可以为:
用所述Anew减去所述第n目标数据块的差异数据集Adiff,得到所述Aold,用所述Aold恢复所述第n目标数据块的数据。
另外,在对所述恢复数据压缩后进行保存,具体包括:
压缩所述目标数据和/或第n目标数据块的差异数据集,得到所述第n目标数据块的压缩差异数据集,保存所述第n目标数据块的压缩差异数据集;
所述第n目标数据块的差异数据集恢复所述第n目标数据块的数据之前进行解压缩:解压所述第n目标数据块的压缩差异数据集,得到所述第n目标数据块的差异数据集。
通过设置标志信息对升级失败进行记录。
具体地,设置所述标志数据块用于存储标识所述软件升级是否成功的标识信息;根据标志数据块确定所述软件升级失败。
在所述软件的升级过程中根据软件升级是否成功实时更新所述标志信息。
在上述实施例中,由于通过保存终端设备软件升级所涉及的目标数据块;比较所获取新版的软件包数据与所述目标数据块,得到差异数据集,并保存所述差异数据集;利用获取新版的软件包数据更新所述目标数据块;若更新操作失败,则根据所述目标数据块或差异数据集和当前操作的目标数据块将所述软件恢复到原有软件。利用差异数据集来恢复原有软件,可节省存储空间,以及对所述目标数据和/或差异数据集进行压缩后再进行存储,可进一步节省存储空间,从而降低成本。本发明实施例将所述目标数据及差异数据集保存在非易失存储介质中。通常,终端设备都采用闪存FLASH设备作为自己的非易失存储介质,有NAND FLASH和NORFLASH两种。
下面本发明实施例提供的方案以NAND FLASH为例来具体阐述。
首先,在当前终端设备运行系统的存储介质NAND FLASH存储空间中增加一个升级分区UPDATE,用于存储升级过程中的新老版本差异。如果升级程序包可以再分为几个部分,则在UPDATE分区中相应的创建其对应子分区。
NAND FLASH分为块(BLOCK)和页(PAGE),一般一页PAGE的用户操作区为512bytes或2048bytes,一块BLOCK包括32个PAGE或64个PAGE。且NAND FLASH的操作是按BLOCK进行擦除,按PAGE进行读写操作,如此则存在数据操作的不同步性。因此在擦除一个BLOCK前,需要先备份此BLOCK的数据,以防升级失败发生在操作此BLOCK的最后一个PAGE之前。设定此BLOCK为当前操作的BLOCK,并创建一个用于备份当前操作BLOCK数据的子分区UPDATE_BLOCK,该分区用于备份升级操作过程中待擦除的BLOCK数据,也即正在操作的BLOCK的数据,以便在升级失败后恢复时使用。同时记录该BLOCK的ID,以可以查询到是哪一个BLOCK,方便恢复。
同时,为了区分升级成功与失败,在UPDATE分区中的第一个BLOCK为标志BLOCK,通过读取此BLOCK的数据,可判断升级成功与否,是否需要恢复。例如:标志BLOCK的数据结构定义如下:
升级前,先更新此状态为默认的需要恢复状态,即上述数据结构的成员项update_need_restore为TRUE。
由于NAND FLASH的操作是按PAGE进行读写操作,因此,定义差异数据块的最小单位(称为差异子元)为PAGE,一个差异子元表示以PAGE为单位的新老版本差异数据。
参照图2,本发明实施例提供的一种终端设备软件升级恢复方法,其处理流程包括:
步骤S201,终端设备从服务器或PC下载新版本的软件镜像(二进制的流文件),即升级软件数据包。
下载及升级过程可以是,在获取新版的软件包数据过程中,每收到一个新版的软件数据,及时利用获取新版的软件数据更新所述目标数据块。也就是说,升级过程操作中边接收新版本软件数据边进行软件数据更新操作,而不是把整个软件镜像都下载下来后再升级,这样以节约内存空间。
为便于描述,本实施例中,定义每PAGE的字节数为PAGE_SIZE,每个下载包的大小为8*PAGE_SIZE,则一个数据包一次可以更新8个PAGE。具体的更新操作如下:
步骤S202,找到要升级的目标BLOCK,将该BLOCK的数据保存到预先设置的BLOCK备份区,然后擦除此BLOCK。
步骤S203,从所保存的备份BLOCK中读取第一个PAGE的数据,得到老版本数据集Aold,可表示为数组Aold[PAGE_SIZE]。
步骤S204,从获取的数据包中取第一个PAGE的升级数据,得到新版本数据集Anew,可表示为数组Anew[PAGE_SIZE]。
步骤S205,按如下算法求得升级前数据集Aold和升级后新版本数据集Anew的差异集Adiff=Anew-Aold,显然可导出如下公式:
Adiff=Anew-Aold (a)
Anew-Adiff=Aold, (b)
Aold+Adiff=Anew。 (c)
差异集Adiff可表示为一个数组Adiff[PAGE_SIZE]。以上计算,实际上是对数组的每个成员项进行差异计算,以满足公式(a)、(b)、(c)的要求。
一般而言,新版本和老版本的差别不大,则对于差异集Adiff,其大部分的成员项应该是0。
在本发明的一个实施例中,对于差异集Adiff,通过常用压缩算法进行压缩,得到压缩后的数据Acompress,存储到写FLASH的缓存write_buffer[PAGE_SIZE]中,等到write_buffer的数据达到PAGE_SIZE长度后,完成一次写FLASH的PAGE的操作。一般而言,需要多个PAGE的差分压缩数据才够写一次PAGE,因此可以极大的节约存储空间。
步骤S206,参照步骤S204-步骤S205对数据包中各页PAGE数据进行操作,一直到该接收包的数据都处理完毕,给下载服务器回ACK应答消息,申请服务器下发下一个升级包。
步骤S207,重复步骤S202-步骤S206的操作,一直到本次升级操作结束,升级成功或者升级失败。如果升级成功,则更新标志BLOCK的状态数据为成功,不需要恢复,否则仍默认为需要恢复。
终端设备对升级操作进行监测,当判定升级操作失败,根据所述差异数据集对已完成更新的数据块BLOCK进行回复,对于当前正在更新操作中数据块BLOCK,根据之前记录的该BLOCK的ID,利用所保存的该BLOCK以及利用差异数据集回复的数据块BLOCK将所述软件恢复到原有版本。
另外,还可按照下述步骤进行升级操作:
在升级操作过程中获取软件的更新数据;
根据所述更新数据确定对应的所述软件的需更新的目标数据,并保存所涉及的目标数据作为备份数据;
当所述软件升级失败,则根据利用所保存的目标数据恢复所述软件。
终端设备重新启动即再加电运行时,通过主BOOTLOADER程序(此程序是不会被升级更新的,类似PC的BIOS系统),读取UPDATE分区的标志BLOCK数据,判断是否需要恢复。如果需要恢复,则启动恢复流程,还原终端软件为老版本软件。参照图3,恢复流程的主要操作步骤如下:
步骤S301,选择当前操作的BLOCK为第一个BLOCK,备份当前BLOCK的数据到UPDATE的子分区UPDATE_BLOCK,并记录当前BLOCK的ID。通过该ID,可以知道已经恢复到什么程度了,如果在恢复过程中发生了异常,则下次终端上电运行后,还可以继续进行恢复。
步骤S302,备份完毕,擦除当前BLOCK,为写操作做好准备。
步骤S303,读取UPDATE分区的第一个备份差异数据页PAGE的数据到读缓存read_buffer[PAGE_SIZE],对此数据依次进行解压缩,依次生成每个PAGE的差异集Adiff,根据公式(b),得到待更新PAGE对应的老版本数据集Aold。执行写PAGE操作,以进行版本恢复。
步骤S304,参照步骤S202-S203对UPDATE分区的其余各备份差异数据页PAGE的数据进行相应操作,以恢复整个BLOCK的数据。
步骤S305,重复执行步骤S201-步骤S204,恢复整个备份差异集对应的数据。
步骤S306,读取UPDATE分区的子分区UPDATE_BLOCK中的备份升级BLOCK的ID和数据,将此BLOCK的数据完整的恢复到对应BLOCK。
步骤S307,更新UPDATE分区的标志BLOCK的数据为恢复成功,表示软件恢复为正常。至此,整个恢复操作完毕,所有升级失败前的修改已经都恢复为升级前的老版本状态。完成了软件修复。
步骤S308,如果恢复过程中发生异常,则可以通过已经恢复的BLOCK的ID,接着这个BLOCK继续执行步骤S302-步骤S307的操作,直至恢复成功。
参照图4,本发明实施例提供的一种终端装置400,包括:
接收单元410,用于获取软件的更新数据;
恢复数据获取单元420,根据所述更新数据确定对应的所述软件的需更新的目标数据,根据所述目标数据获取恢复数据;
存储单元430,用于保存获取的所述恢复数据;
软件更新单元440,利用所述更新数据更新所述软件中的所述目标数据;
恢复操作单元450,用于在所述软件升级失败时,根据所述恢复数据恢复所述软件的所述目标数据。
所述软件恢复数据为所述目标数据;或所述软件恢复数据为已更新数据与相应目标数据的差异数据集和当前操作中的目标数据。
所述软件更新单元440包括:
备份单元440a,用于保存所述目标数据中的第n目标数据块的数据,作为第n目标数据块的备份数据;其中n为不大于所述目标数据的数据块的数量的自然数;
更新单元440b,用于用所述第n目标数据块对应的所述更新数据中的第n更新数据块中的数据更新所述第n目标数据块的数据;
所述恢复数据获取单元420包括:
第一获取单元420a,用于在所述更新单元对所述第n目标数据块的数据更新不成功时,则将所述第n目标数据块的备份数据作为所述恢复数据;
第二获取单元420b,用于在所述更新单元对所述第n目标数据块的数据更新成功时,获取所述第n更新数据块的数据与所述第n目标数据块的备份数据中不同数据的集合,得到所述第n目标数据块的差异数据集,将所述第n目标数据块的差异数据集作为所述恢复数据。
所述第二获取单元420b具体用于,在所述更新单元对所述第n目标数据块的数据更新成功时,从所述第n目标数据块的备份数据中获取所述第n目标数据块的数据集Aold,将所述第n更新数据块的数据作为更新数据集Anew,按如下算法求得所述第n目标数据块的差异数据集Adiff=Anew-Aold,将所述第n目标数据块的差异数据集Adiff作为所述恢复数据。
所述恢复操作单元450包括:
判断单元450a,用于判断需恢复的所述第n目标数据块在软件升级时是否更新成功;
第一恢复单元450b,用于在所述判断单元的判断结果为所述第n目标数据块在软件升级时更新不成功的情况下,用所述第n目标数据块的备份数据恢复所述第n目标数据块的数据;
第二恢复单元450c,用于在所述判断单元的判断结果为所述第n目标数据块在软件升级时更新成功的情况下,用所述第n目标数据块的差异数据集恢复所述第n目标数据块的数据。
所述第二恢复单元450c具体用于,在所述判断单元的判断结果为所述第n目标数据块在软件升级时更新成功时,用所述Anew减去所述第n目标数据块的差异数据集差异数据集Adiff,得到所述Aold,用所述Aold恢复所述第n目标数据块的数据。
所述存储单元430具体用于压缩所述第n目标数据块的差异数据集,得到所述第n目标数据块的压缩差异数据集,保存所述第n目标数据块的压缩差异数据集;
所述恢复操作单元450,还包括:
解压单元450d,用于解压所述第n目标数据块的压缩差异数据集,得到所述第n目标数据块的差异数据集。
所述存储单元具体用于采用非易失存储介质存储所述恢复数据。
应用实施例
目前,空中传送固件升级(FOTA,Firmware Over-The-Air)技术越来越成熟,这项技术允许用户通过无线网络下载和接受最新的手机升级文件,不需要借助其它设备就可以完成升级。
将本发明实施例提供的终端设备软件升级方法应用到采用空中传送固件升级FOTA技术的无线终端设备中,可取得更好的效果,以提高用户满意度。
具体地,通过特定运算,计算出升级版本和老版本之间的差分包。类似如上Adiff=Anew-Aold的操作,并将差分包上传到升级服务器。
如果需要升级,则可以通过网络触发和用户触发两种触发方式来进行升级。其中网络触发是服务器接受到上传的新版本后,给目标终端发送一条PUSH短信,短信中带有要升级的版本的URL地址。终端接受并解析此短信,发现需要升级,则与服务器直接进行版本信息鉴权,以验证是否服务器版本比终端当前版本新。
用户触发升级是用户向服务器发一条PUSH短信,主动发起升级请求,服务器收到短信后,由服务器发起版本信息鉴权。
鉴权通过,则终端发起与服务器的网络连接,通过HTTP方式从服务器上将升级差分包下载下来,存储到终端的文件系统中,并启动终端自身的升级过程。终端的升级过程一般是将终端当前老版本数据读出到内存中,根据差分包,计算出新版本数据。然后将新版本数据由RAM中写入FLASH,完成升级操作。
采用本发明提供的软件升级方式,因为可以实现升级自恢复,则不需要像如上方式那样计算差分包,而直接可以从网络上下载新版本数据,边下载边升级即可。
本发明实施例提供的技术方案中,通过保存终端设备软件升级所涉及的目标数据块;比较所获取新版的软件包数据与所述目标数据块,得到差异数据集,并保存所述差异数据集;利用获取新版的软件包数据更新所述目标数据块;若更新操作失败,则根据所述差异数据集将所述软件恢复到原有版本。在升级自身软件时,如果发生异常,该方案可以实现终端软件的自动恢复,自动还原为升级前的原有软件版本,本发明方案可以解决升级失败导致终端设备无法使用的问题,即使升级过程中人为中断升级过程,也可以保证终端设备完好如前,保护了终端设备。
同时本发明方案对存储空间的需求很小,且对用户操作是透明的。用户不需要特殊操作。
显然,本领域的技术人员应该明白,上述的本发明的各单元或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个单元或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。