具体实施方式
下面结合本申请中的附图描述本申请的实施例。应理解,下面结合附图所阐述的实施方式,是用于解释本申请实施例的技术方案的示例性描述,对本申请实施例的技术方案不构成限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本申请实施例所使用的术语“包括”以及“包含”是指相应特征可以实现为所呈现的特征、信息、数据、步骤、操作、元件和/或组件,但不排除实现为本技术领域所支持其他特征、信息、数据、步骤、操作、元件、组件和/或它们的组合等。应该理解,当我们称一个元件被“连接”或“耦接”到另一元件时,该一个元件可以直接连接或耦接到另一元件,也可以指该一个元件和另一元件通过中间元件建立连接关系。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的术语“和/或”指示该术语所限定的项目中的至少一个,例如“A和/或B”可以实现为“A”,或者实现为“B”,或者实现为“A和B”。
为使更好的理解和说明本申请实施例提供的方案,下面对本申请实施例所涉及的一些技术用语进行说明。
固件分区:一个软件的固件分区是指终端设备(如嵌入式设备)中用于存储软件的固件的存储区域。
AB升级方式:该升级方式为双***升级方式,顾名思义是有两个***,设备上有A、B相等的两个分区,即开辟了两个存储空间,A存储空间(A分区)和B存储空间(B分区),固件的大小不大于A分区或B分区的大小,AB升级方式为全量升级方式。
差分升级方式:该升级方式为单***升级方式,只存在一个固件版本,差分升级又叫增量更新,是将旧版本与新版本的数据文件做差分,生成差分包,基于差分包在旧版本上做差分升级,差分包一般很小。
压缩升级方式:该升级方式也为单***升级方式,只存在一个固件版本,压缩包一般为固件的50%大小,通过解压缩升级包完成升级。
每种升级方式都有各自的优缺点。AB升级方式是双***升级,当前***不可用时,可转换到备用分区,但该升级方式要求固件只能小于总分区(即固件分区,也就是A分区和B分区的总大小)的一半。差分升级方式中差分包通常较小,能够减少传输和升级资源的占用,但是该升级方式依赖于老固件,实现相对复杂。压缩升级方式实现简单,不依赖老固件,但和差分升级方式一样,都是单***升级。
在实际应用中,根据不同的应用场景和需求,目前一般只使用一种升级方式,不支持多种升级方式之间的切换,这就会导致一些问题的出现,不能够很好的满足实际需求,比如,当用户使用了AB升级方式时,经过一段时间的技术开发,固件超过了固件分区一半的大小,则无法实现软件升级。为了解决现有技术中存在的上述问题,本申请实施例提供了一种能够支持不同升级方式之间切换的软件升级方式,基于本申请实施例提供的该升级方法,可以实现多种不同升级方式之间的互相升级,能够更好的满足用户需求。
其中,本申请实施例中的不同软件升级方式之间包括但不限于上述AB升级方式、差分升级方式和压缩升级方式中的任意两种升级方式之间。本申请实施例所提供的方式可以适用于但不限于OTA升级场景中。待升级软件可以是终端设备中的任意可以升级的软件,包括但不限于设备的***软件或者下载安装的其他应用,终端设备可以包括但不限于嵌入式设备。
下面通过对几个示例性实施方式的描述,对本申请实施例的技术方案以及本申请的技术方案产生的技术效果进行说明。需要指出的是,下述实施方式之间可以相互参考、借鉴或结合,对于不同实施方式中相同的术语、相似的特征以及相似的实施步骤等,不再重复描述。
图1为本申请实施例提供的一种软件升级方法的流程示意图,该方法可以由任一电子设备执行,可选的,该方法可以由嵌入式设备执行,为了描述方便,在下文的实施例描述中,将以嵌入式设备作为该方法的执行主体为例进行说明。如图1中所示,该方法可以包括以下步骤S110至步骤S140。
步骤S110:获取待升级软件的升级数据,升级数据包括第一升级标识和升级包。
升级数据,即用于实现待升级软件升级的数据,也就是实现嵌入式设备中待升级软件的固件版本的数据,升级数据也可以称为升级软件包或升级固件包。第一升级标识用于指示当前获取到的升级包是哪种升级方式的升级包,也就是用于标识升级包对应的目标升级方式。比如,上述升级包是差分包,第一升级标识则指示了目标升级方式是差分升级方式,如果升级包是压缩包(压缩升级方式对应的数据包,也可以成为压缩升级包),第一升级标识则指示了目标升级方式是压缩升级方式。
对于第一升级标识的具体形式本实施例不做限定,只要是能够用于区分不同的升级方式即可。比如,第一升级标识为0,标识目标升级方式为双***升级方式,第一升级标识为1,标识目标升级方式为单***升级方式。在实际应用中,若双***升级方式或单***升级方式是至少两种中的一种,升级标识还可以进一步标识具体是至少两种中的哪一种,比如,目标升级方式是单***升级方式,单***升级方式可以是压缩升级方式或差分升级方式,第一升级标识为1a时,标识目标升级方式为压缩升级方式,第一升级标识为1b时,标识目标升级方式为差分升级。
对于升级软件包的包格式本申请实施例也不做限定,可选的,升级软件包可以包括包头和包体两部分,其中,包头中携带有第一升级标识,包体部分则是真正的用于升级的数据,也就是上述升级包。可以理解的是,在实际应用中,包头中除了包含第一升级标识之外,还可以包含其他与升级有关的附加数据,比如,升级包内容校验信息等。作为一个示例,图2中示出了本申请实施例提供的一种升级软件包的包格式的示意图,包头(即Head)中包含每种升级包的区分识别(即第一升级标识)以及升级包内容校验等信息,包体则是第一升级标识所标识的升级方式对应的升级包,如差分升级的差分包(Diffpackage)、压缩升级的压缩包(CMZ package)或AB升级的升级包(AB package)。
在需要对待升级软件(也就是软件的老固件)进行升级时,嵌入式设备可以通过与服务器通信,从服务器获取到软件升级包。可选的,嵌入式设备在获取软件包时,可以先从服务器获取升级包的头部数据即包头,根据包头中的第一升级标识确定出目标升级方式之后,再从服务器获取升级包部分,并根据后文中描述的方式,将升级包存储到固件分区的目标存储区域。当然,嵌入式设备也可以从服务器将整个软件升级包都下载下来,并存储(如缓存)到设备的指定区域(非固件分区),之后,通过解析软件升级包,根据包头中的第一升级标识确定出目标升级方式之后,再将升级包存储到目标存储区域。
作为一可选方式,嵌入式设备在需要进行软件升级时,服务器可以将上述包头数据以及升级包的获取地址发送给嵌入式设备,嵌入式设备可以根据接收到的包头数据中的第一软件标识确定目标升级方式,根据上述获取地址获取到升级包,对于获取地址的形式本申请实施例不做限定,比如,获取地址可以是存储升级包的地址,如URL(UniformResource Locator,统一资源定位符)地址,嵌入式设备可以根据获取到的URL地址去下载升级包。
步骤S120:根据第一升级标识确定升级包对应的目标升级方式,并确定待升级软件当前的本地升级方式。
其中,本地升级方式指的是嵌入式设备在根据获取到的升级包进行此次升级前的软件升级方式。因为对于不同的升级方式,嵌入式设备中固件分区的分区形式要求可能是不同的(比如,对于双***升级方式,固件分区包括两个分区,对于单***升级方式,固件分区则是一个分区),因此,为了能够保证软件的正常升级,不仅要确定目标升级方式,还需要知晓嵌入式设备当前的本地升级方式,以保证升级包能够存储到固件分区中正确的位置,并根据升级包实现软件的升级。
可选的,设备中可以存储有本地升级方式的标识信息,设备可以通过读取该标识信息来确定本地升级方式。具体的,上述确定待升级软件当前的本地升级方式,可以包括:
获取本地存储的待升级软件的第二升级标识,根据第二升级标识确定本地升级方式;其中,若本地升级方式为双***升级方式,第二升级标识还用于标识升级所针对的升级分区。
其中,在目标升级方式和本地升级方式不同时,该方法还包括:
将第二升级标识更新为目标升级方式对应的升级标识;
若本地升级方式和目标升级方式都是双***升级方式,该方法还包括:
将第二升级标识所标识的升级分区进行更新。
第二升级标识用于确定本地升级方式,第二升级标识也可以称为本地升级标识。对于第二升级标识在嵌入式设备中的存储位置(即本地存储的位置)本申请实施例不做限定,可选的,第二升级标识可以是存储在固件分区的指定区域,如头部区域,嵌入式设备可以从固件分区的指定区域读取该标识来确定本地升级方式。如果本地升级方式和目标升级方式不同,在对软件进行的升级之后或者是将软件包存储到目标存储区域,还需要将本地存储的第二升级标识更新为目标升级方式所对应的升级标识,以保证在下一次需要进行升级时,可以根据更新后的标识准确的确定出本地升级方式。其中,对第二升级标识进行更新可以是在获取到此次升级所用的升级包之后执行,也可以在对待升级软件进行升级之后执行,其中,在对待升级软件进行升级后可以是指对待升级软件升级成功之后。
在本地升级方式是双***升级方式时,由于固件分区包括两个分区,为了能够确定此次升级是对哪个分区进行升级,上述第二升级标识还用于标识此次升级所针对的升级分区,也就是要对固件分区中的哪个分区中的老固件进行升级。相应的,如果本地升级方式和目标升级方式都是双***升级方式,在将待升级软件进行升级之后,还需要将第二升级标识所标识的升级分区进行更新。比如,双***升级方式是AB升级方式,固件分区包括A分区和B分区,A分区中存储的是待升级软件的第一固件,B分区中存储的是待升级软件的第二固件,如果此次升级前第二升级标识的升级分区是A分区,即对A分区的第一固件进行升级,在完成此次升级之后,需要将第二升级标识所标识的升级分区更新为B分区,以用于标识下次升级时针对B分区进行升级。
对于第二升级标识的具体形式本申请实施例也不做限定,可以根据实际应用需求配置。可选的,第二升级标识可以包括两个标志位,两个标志位分别对应于单***升级方式和双***升级方式,比如,第一个标志位对应双***升级方式,第二个标志位对应单***升级方式,如果第一个标志位为1,第二个标志位为0,则表示本地升级方式为双***升级方式,如果第一个标志位为0,第二个标志位为1,则表示本地升级方式为单***升级方式。对于双***升级方式,由于第二升级标识还用于指示当前升级所针对的升级分区,对于双***升级方式对应的标志位,还可以通过该标志位的取值不同来区分是针对的是哪个分区,比如,对于AB升级方式,如果第一个标志位为1A或者A,标识升级分区是A分区,如果第一个标志为1B或者B,标识升级方式是B分区。可以理解的是,在进行此次升级时,如果目标升级方式和本地升级方式不同,在进行此次升级之后,还需要对本地升级标识进行更新。例如,本地升级方式是双***升级方式,本地升级标识的第一个标志位为1,第二个标志位为0,目标升级方式为单***升级方式,进行此次升级之后,需要将本地升级标识的第一个标志位更新为0,第二个标志位更新为1。
步骤S130:根据本地升级方式,确定升级包在固件分区中的目标存储区域。
步骤S140:将升级包存储到目标存储区域,并基于升级包采用目标升级方式对待升级软件进行升级。
其中,固件分区为待升级软件在终端设备中的存储区域,也就是嵌入式设备中分配的用于存储待升级软件的固件的存储区域,比如,如果本地升级方式是AB升级方式,固件分区是指A分区和B分区。
由于不同的升级方式对于软件的固件的存储方式以及升级时的升级处理方式都是不同的,在确定出本地升级方式之后,需要根据本地升级方式确定出固件的当前存储方式,以将升级包正确的存储到固件分区中的目标存储区域。由于升级包是目标升级方式对应的升级固件包,因此,在将升级包存储到目标存储区域之后,则可以基于该升级包,采用目标升级方式的升级处理方式对待升级软件进行处理,实现软件的升级,得到升级后的固件。比如,目标升级方式是差分升级方式,上述升级包则是差分包,可以基于目标存储区域存储的差分包以及固件分区存储的老固件(即待升级软件的当前固件)进行差分还原,得到待升级软件的目标固件,实现升级。
基于本申请实施例提供的该方案,实现了多种不同软件升级方式互相升级的支持,即使在软件升级方式发生了切换,也可以实现软件升级,更好的满足了实际应用需求,提升了用户的使用感知。
可选的,在实际应用中,如果根据目标升级方式和本地升级方式判断出升级方式发生了变化,为了提升用户的使用感知,嵌入式设备在基于目标升级方式的升级包进行软件升级之前,可以提示用于升级方式发生了变化,比如提示用户如果进行升级,升级方式会由a升级方式变为b升级方式,还可以进一步提示用户两种升级方式的不同或者优缺点,并让用户选择是否要继续进行升级,如果用户确定进行升级,则基于升级包采用目标升级方式进行软件升级,如果用户指示不进行升级,可以继续采用当前的固件版本为用户提供服务。
本申请的可选实施例中,上述目标升级方式为双***升级方式或单***升级方式,本地升级方式为双***升级方式或单***升级方式。
在实际应用中,由于单***升级方式对应的固件分区是一个整体分区,而双***升级方式对应的固件分区需要两个分区(比如对于AB升级方式而言,固件分区包含两个同等大小的分区),基于此,本申请的该可选实施例中,软件升级方式可以分为两大类,一类是双***升级方式,一种是单***升级方式。可选的,双***升级方式可以是但不限于AB升级方式,单***升级方式可以是但不限于差分升级方式或压缩升级方式。由于不同类的升级方式对应的固件分区的形式以及升级处理方式都是不同的,因此,对于不同类的升级方式,确定升级包的目标存储区域的方式也是不同的。
本申请的可选实施例中,上述根据本地升级方式,确定升级包在固件分区中的目标存储区域,可以包括:
在本地升级方式为双***升级方式时,确定固件分区中待升级软件当前所运行在的目标分区,将固件分区的非目标分区确定为目标存储区域;
在本地升级方式为单***升级方式时,若目标升级方式是单***升级方式,将固件分区的尾部区域确定为目标存储区域,若目标升级方式为双***升级方式,则将固件分区划分为双***升级方式对应的第一分区和第二分区,将第二分区的头部区域确定为目标出区域,其中,第二分区的存储区域位于第一分区的存储区域之后。
对于双***升级方式而言,固件分区是包括两个分区的,例如,对于AB升级方式来说,两个分区也就是常说的A分区和B分区,两个分区中存储的固件的版本可能相同,也可能不同,在大多数情况下是不同的。本申请实施例中,对于双***升级方式,将嵌入式设备当前运行在的分区称为目标分区,另一分区称为非目标分区。
如果本地升级方式是双***升级方式,那么固件分区则是包括了两个分区,由于目标分区是设备当前运行所在的分区,因此,需要将升级包存储到非目标分区中。如果本地升级方式是单***升级方式,设备的固件分区是一个整体,而双***升级方式需要两个分区,因此,如果本地升级方式是单***升级方式,在确定升级包的目标存储区域时,需要进一步考虑目标升级方式,具体的,如果目标升级方式也是单***升级方式,那么可以直接将升级包存储到整个固件分区的尾部区域即可,如果目标升级方式是双***升级方式,此时则需要将固件分区分为两个分区,即上述第一分区和第二分区,其中,第一分区的存储区域位于第二分区之前,由于此时的本地升级方式是单***升级方式,进行此次升级前的固件通常是存储在固件分区的头部区域(即固件是从固件分区的起始位置开始存储的固件分区中的),因此,可以将升级包存储到两个分区中存储位置靠后的分区中,进一步的,双***升级方式采用的是全量升级方式,将升级包存储到存储位置靠后的分区的头部区域即可,也就是从第二分区的起始存储位置开始将升级包烧录到第四分区中即实现了升级。
可以理解的是,在升级方式由单***升级方式转换为目标升级方式时,要保证之前的固件(即固件分区中的老固件)大小不能大于第一分区的大小,升级后的固件(位于第二分区的新固件)不能大小第二分区的大小。在双***升级方式是AB升级方式时,第一分区和第二分区的大小相等,升级前的固件和升级后的固件都不大于整个固件分区的一半。
本申请的可选实施例中,上述升级数据还包括存储地址标识,该存储地址标识用于指示在目标升级方式为单***升级方式时,升级包在固件分区中的起始存储地址。
如果目标升级方式是双***升级方式,比如AB升级方式,由于是全量升级方式,在确定出目标存储区域之后,可以将升级包从目标存储区域的起始位置开始存储到该目标存储区域即可。而在目标升级方式是单***升级方式时,由于升级包的目标存储区域是固件分区的尾部区域,也就是整个固件分区尾部向上的区域,此时嵌入式设备需要知晓升级包在固件分区中的起始存储位置即存储起始地址(可以简称为起始地址或起始位置),从该起始位置开始将升级包存储到固件分区中。
本申请的可选实施例中,单***升级方式可以是压缩升级方式或差分升级方式,上述存储地址标识也可以称为差分压缩地址标识,标识升级包存储的起始地址,该地址标识只有在第一升级标识是差分升级标识或压缩升级标识有效时才有效,也就是说,该地址标识只有在目标升级方式是单***升级方式时才有效。
对于上述存储地址标识的具体数据形式本申请实施例不做限定,可选的,该存储地址标识可以是一个地址偏移,具体的,该地址偏移可以是升级包在固件分区中的存储起始地址相对于固件分区的起始位置(即起始存储地址)的偏移,嵌入式设备可以根据固件分区的起始存储地址和该地址偏移,确定出升级包在固件分区中的存储起始地址。可选的,存储地址标识还可以是升级包的大小,嵌入式设备可以根据固件分区的结束存储地址和升级包的大小,确定出升级包在固件分区的存储起始地址,比如,固件分区的结束存储地址是地址a,升级包的大小为b,则固件分区中最后的存储空间大小为b的区域则是升级包的存储区域,该区域的起始位置可以根据地址a和升级包的大小b确定出,即相对于地址a向前偏移大小为b的存储地址。
在将升级包存储到目标存储区域之后,则可以基于该升级包采用目标升级方式进行软件的升级处理。
本申请的可选实施例中,双***升级方式为AB升级方式,单***升级方式为差分升级方式或压缩升级方式;在本地升级方式为双***升级方式,目标升级方式为单***升级方式时,上述将升级包存储到目标存储区域,并基于升级包采用目标升级方式对所述待升级软件进行升级,可以包括:
若目标分区的存储区域位于非目标分区之前,将升级包存储到非目标分区的尾部区域;
在目标升级方式为压缩升级方式时,对非目标分区的尾部区域存储的升级包进行解压缩,并将解压缩后的数据从固件分区的起始位置开始存储到固件分区中;
在目标升级方式为差分升级方式时,基于非目标分区的尾部区域存储的升级包和第一分区中存储的数据进行差分升级。
本申请的可选实施例中,在本地升级方式为双***升级方式,目标升级方式为单***升级方式时,上述将升级包存储到目标存储区域,并基于升级包采用目标升级方式对所述待升级软件进行升级,可以包括:
若目标分区的存储区域位于非目标分区之后,将升级包存储到非目标分区尾部的第一空间中;
根据升级包的大小,从目标分区的尾部区域划分出对应大小的第二空间,并将第一空间中存储的数据与第二空间中存储的数据交换;
在目标升级方式为压缩升级方式时,对第二空间存储的升级包进行解压缩,并将解压缩后的数据从固件分区的起始位置开始存储到固件分区中;
在目标升级方式为差分升级方式时,基于第二空间存储的升级包、目标分区的第三空间中存储的数据以及第一空间中存储的数据进行差分升级,并将升级后的数据从固件分区的起始位置开始存储到固件分区中,其中,第三空间是目标分区中除第二空间之外的存储区域。
上述可选方案中提供了升级方式由双***升级方式切换为单***升级方式时的升级处理方式。在实际应用中,本地升级方式是双***升级方式时,嵌入式设备当前运行所在的分区可能是存储区域靠前的分区,也可能是存储区域靠后的分区,如果是运行在靠前的分区,那么升级包存储在非目标分区的尾部区域也就是整个固件分区的尾部区域,将升级包存储到该尾部区域后则可以基于该升级包采用单***升级方式对应的升级处理方式进行升级。
具体的,在升级方式由双***升级方式切换为单***升级方式时,如果单***升级方式是压缩升级方式,直接将压缩包解压缩,并将解压缩后的数据从固件分区的起始位置开始存储到固件分区中即可,如果单***升级方式是差分升级方式,由于要用到老固件数据,即当前运行所在的目标分区的数据,此时需要基于差分包和目标分区中的老固件进行差分还原得到新固件,并新固件的数据从固件分区的起始位置开始存储到固件分区中。
可以理解的是,如果本地升级方式和目标升级方式都是AB升级方式,设备当前运行在靠前的分区时,升级包可以存储到非目标分区的尾部区域,之后将该升级包从目标分区的起始位置开始烧录到第一分区即可。
在本地升级方式是双***升级方式,目标升级方式是单***升级方式时,如果嵌入式设备当前运行所在的分区是靠后的分区,升级包存储在非目标分区的尾部区域(第一空间)之后,在进行升级处理时,需要将存储在非目标分区的尾部区域的升级包与目标分区中相同大小的尾部区域(第二空间)中的数据进行交换,将升级包交换到整个固件分区的尾部区域,再基于该升级包采用对应的单***升级方式进行升级处理。
具体的,对于差分升级方式,由于升级需要依赖于老固件,即目标分区中的固件数据,在进行上述数据交换前,升级所需要的老固件数据是目标分区中存储的数据,是从目标分区的开始位置存储到该分区中的数据,通过上述数据交换处理,老固件则变成了目标分区的第三空间中存储的数据以及非目标分区的第一空间中的数据(之前存储在目标分区的尾部区域的数据),因此,此时的差分升级则需要基于第二空间中存储的差分包、第三空间和第一空间中存储的老固件数据进行差分还原,并将得到的新固件从整个固件分区的起始位置开始存储到固件分区中。
可以理解的是,如果本地升级方式和目标升级方式都是单***升级方式,固件分区是一个整体,老固件是从固件分区的起始位置开始存储到固件分区中的,升级包存储到固件分区的尾部区域即可,在进行升级时,直接基于升级包采用单***升级方式对应的升级处理方式进行处理,并将得到的新固件从固件分区的起始位置开始存储到固件分区中即可。比如,如果目标升级方式是压缩升级方式,将升级包进行解压缩,并将解压缩后的数据从固件分区的起始位置存储到固件分区即完成了升级,如果目标升级方式是差分升级方式,基于升级包和固件分区中存储的老固件进行差分还原,并将差分还原得到的数据从固件分区的起始位置开始存储到固件分区即可。
下面结合一个示例,对本申请实施例提供的一种嵌入式设备的升级方式由双***升级方式切换为单***升级方式时的软件升级流程进行说明。该示例中,本地升级方式是AB升级方式,固件分区包括A分区和B分区两个分区,且两个分区的大小相同,本示例中,A分区位于B分区之前。图3示出了在此次升级前AB升级方式对应的固件分区的示意图,图3中固件区A和固件区B为整个固件分区,固件区A对应上述A分区(简称为A区),固件区B对应上述B分区(简称为B区),图3中所示的其他区为嵌入式设备的固件分区之外的其他存储区域。为描述方便,将存储在固件区A的老固件称为固件A,将存储在固件区B的老固件称为固件B。A固件的数据是从固件区A的起始位置(图3所示的示意图中固件区A的左侧端点)开始存储到固件区A的,固件B的数据是从固件区B的起始位置开始存储到固件区B。由于本地升级方式是AB升级方式,固件A和固件B肯定都不大于整个固件分区的一半,如果嵌入式设备当前是运行在A区,在获取到单***升级方式(压缩或差分升级方式)的升级包之后,将升级包从B区的尾部开始存储即如根据升级包的大小或者升级包的起始存储位置(可以根据升级数据中的存储地址标识确定),将升级包存储到B区尾部对应大小的存储空间中。之后,则可以进一步确定单***升级方式具体是哪种升级方式,如果是压缩升级方式,则对升级包进行解压缩,将解压缩后的固件数据从A区的起始位置开始存储到固件分区中即可,如果是差分升级方式,则基于A区中的老固件和该升级包进行差分还原,将得到的新固件的数据从A区的起始位置开始存储到固件分区中即可。
如果嵌入式设备当前是运行在B区,图4中示出了此时的一种固件分区的示意图,由图4可以看出,此时的固件分区分为了4部分,空间L1、空间L2、空间L3和空间L4,其中,空间L1和空间L2是A区,空间L3和空间L4是B区,从存储空间大小上,L1+L2=L3+L4,L1=L3,L2=L4。空间L2和空间L4的空间大小是由升级包的大小确定的。
具体的,在当前运行在B区即目标分区是B区时,如果根据第一升级标识确定目标升级方式是单***升级方式,获取到升级包之后,将升级包存储到A区的尾部区域即第一空间,如图4中的L2空间,并按照升级包的大小,从B区的尾部划分出相同大小的第二空间,如图4中的L4空间,并将L4空间和L2空间中的数据进行交换,也就是将升级包交换存储到L4空间(整个固件分区的尾部),将原来存储在L4空间中的固件B的部分数据存储到L2空间中,交换后的固件B的数据则是由L3+L2部分组成,固件B的数据从L3空间开始存储,如果固件B的数据大小不大于L3空间的大小,固件B的数据其实就是L3空间中存储的数据,如果固件B的数据大小大于L3空间,固件B的数据此时则是L3空间中的数据加上L2空间中的数据。可选的,L4空间中原来存储的数据可以是从L2空间的起始位置开始存储到L2空间中。
如果目标升级方式是压缩升级方式,升级包则是压缩包,升级不依赖老固件,且经过上述交换后,压缩包位于整个固件区尾部向上,直接解压缩即可得到新固件,并顺序烧录在整体固件分区实现升级。
如果是差分升级方式,升级包则是差分包,升级依赖老固件,即固件B,经过上述交换后,固件B的数据位于L3空间和L2空间,基于L4空间中存储的差分包、以及L3空间和L2空间中的老固件数据进行差分还原,得到新固件,并顺序烧录在整体固件分区实现升级,差分还原过程中,差分规则大于L3空间的内容(也就是需要用到交换前存储在L4空间中的老固件的数据)从L2空间开始去获取即可。
基于本申请实施例提供的方法,无论设备的升级方式是否发生变化,都可以实现软件的升级,可以更好的满足实际应用需求。需要说明的是,本申请实施例提供的方案,支持两种或两种以上不同升级方式的切换,如果是支持两种升级方式之间的切换,即无论是目标升级方式还是本地升级方式,都是两种升级方式中的一种,如AB升级方式和差分升级方式中的一种,此时,升级数据中的第一升级标识可以只需要标识是哪类升级方式即可,比如,标识0标识双***升级方式,1标识单***升级方式,那么设备在获取到第一升级标识之后,既可以根据0或1知晓目标升级方式是AB升级方式还是差分升级方式,而对于本地升级标识(即第二升级标识),如果是AB升级方式,该标识除了指示是AB升级方式之外,还需要指示升级所针对的升级分区是A分区还是B分区。如果升级切换支持的是两种以上升级方式之间的切换,第一升级标识还需要能够指示到具体是哪种升级方式,比如,支持AB升级方式、差分升级方式和压缩升级方式,如果目标升级方式是单***升级方式,根据第一升级标识还应该能够确定出具体是差分升级方式还是压缩升级方式。
在将升级包存储到固件分区的目标存储区域或者是基于升级包完成升级之后,还需要对本地升级标识进行更新,将该标识更新为目标升级方式对应的标识,比如,本地升级方式是双***升级标识,目标升级方式是单***升级方式,则需要将第二升级标识更新为单***升级方式对应的升级标识,如果本地升级方式是单***升级方式,目标升级方式是双***升级方式,则需要将第二升级标识更新为双***升级方式对应的标识,并且要有更新双***升级方式所对应的升级分区,也就是下一次升级时如果目标升级方式仍是双***升级方式,下一次升级要升级的是哪个分区中的固件,比如,此次升级后的新固件是存储在A分区,更新后的第二升级标识所指示的升级分区则是B分区。
可以理解的是,如果本地升级方式和目标升级方式都是AB升级方式,在将升级包存储到目标存储区域或升级完成后,也需要对本地升级标识进行更新,更新其所指示的升级分区。如果本地升级方式和目标升级方式都是单***升级方式,本地升级标识可以不更新,当然,如果本地升级方式和目标升级方式都是单***升级方式但是升级方式不同时,本地升级标识也可以更新。
在目标升级方式是差分升级方式时,上述升级包则是差分包,对于差分包的具体生成方式本申请实施例不做限定,可以是采用现有的任一差分算法来生成差分包,嵌入式设备在获取到该差分包之后,可以基于该差分包采用与向后差分算法相对应的差分还原方式进行升级处理。
差分算法原理简单来说就是新固件(升级后的固件)在原始固件(即老固件)中找最大的相似块(对于判断两个数据块是否是相似块的判断方式本申请实施例不做限定),如果找到相似块,做减法运算即做差分处理,则差异值大部分是0,那么可以大大的提高压缩率,可以使差分包很小。在整个老固件中找新固件的相似块时,新固件的相似块在老固件中的偏移可能向前,也可能向后,没有找到相似块的形成新增块。
差分包包含两部分,即差分块和新增块,差分块的还原需要老固件的参与,即加法运算反计算出新固件中的内容,新增块则不需要老固件的参与,直接填充到新固件对应地址即可。
作为一可选方式,可以采用向后差分算法来生成差分包,向后差分算法在进行新固件和老固件的差分处理时,相似块只选择相对于老固件位置偏后的位置的数据块,也就是说,如果新固件中的一个数据块在老固件中存在相似的数据块,那么该相似的数据块在老固件中的位置(相对于老固件存储区域的起始位置的偏移)一定不小于对应的新固件中的数据块在新固件中的位置(相对于新固件存储区域的起始位置的偏移)。
为了描述方便,下文的描述中将新固件的数据块分为两种进行说明,一种是目标块,一种是新增块,目标块是指在老固件中存在相似数据块的数据块,目标块在老固件中的相似块称为相似块,新增块是指在老固件中不存在相似块的数据块。
作为一个示例,图5中示出来一种差分包的生成原理示意图,图5中上方的矩形块代表老固件的数据块,下方的矩形块代表新固件的数据块,该示意图中,新固件与老固件存在4对相似块,老固件的数据块1至数据块4分别是新固件的数据块1至数据块4一一对应的相似块,由于新固件的数据块4的相似块4在老固件中的位置位于该数据块4在新固件中的偏移,采用向后差分处理方式时,认为新固件的数据块4并非目标块,而是当作新增块来处理。采用向后差分,在基于差分包进行差分还原时,当还原新固件中的数据块1至数据块3时,这三块数据块可以顺序存储到老固件中位置对应的区域,如还原得到新固件中的数据块1之后该数据块会存储到老固件中对应的存储区域,也就是老固件的数据块4之前的区域,采用向后差分,肯定不会存在一个新固件中的目标块的相似块出现在该目标块对应的存储位置之前的情况,差分还原处理时比较简单。但是由图5可以看出,向后差分算法舍弃了向前差分的块,导致差分包的大小会增加。
为了能够减少差分包的包大小,本申请实施例中还提供了另一可选的差分包的生成算法,可以称为改进差分算法,通过该算法,可以通过移动老固件中位置相对靠前的数据块,把一个新固件的数据块的相似块移动到老固件的固件分区中位置相对偏后的位置,从而在进行新固件的该数据块的差分还原时,可以在固件分区中该数据块的存储位置靠后的位置找到对应的相似块。
对于图5中所示的示例,如果采用改进差分算法,对于新固件中的数据块4,该数据块不会被当作新增块,而是作为目标块,与对应的老固件中的相似块进行差分处理,在进行差分还原时,如果还原得到的新固件的数据需要存储到其相似块(即老固件中的数据块4)所在的区域时,将该相似块的存储位置按照差分包中的平移控制信息向后移动即可。
改进差分算法的核心为对老固件的数据进行平移等处理,只增加少量的差分控制信息和平移控制信息,就可以合理的使用老固件占用的资源,其中差分控制信息用于确定还原目标块所需要的老固件中数据,平移控制信息用于确定发生移动的老固件中的数据块移动前的存储空间和移动后的存储空间。新固件相对于老固件有差分块(目标块和目标块的相似块之间的差异数据)和***块(也就是新增块)。差分块需要老固件参与,新固件寻找老固件的相似块时,可以通过平移的操作,把老固件中相似块的数据平移到老固件区空闲区域重新形成差分块。
考虑到三种场景:1.新固件小于老固件大小;2.新固件等于老固件大小;3.新固件大于老固件大小。
针对1和场景2,新固件除了目标块还有新增块,那么老固件区就至少有新增块大小的数据的内容在还原时是不参与计算的。针对目标块,如果有多块目标块可以在老固件的相同位置找到相似块,那么就有对应大小的老固件数据区是不参与还原计算的,且做完差分块后的原始固件区的相似块位置就可以重复被利用了。针对场景3,新固件大于老固件的部分都是空闲块,不参与差分计算,空闲的数据块比上述两种场景更多。可见,总是会找到老固件区的还原位置之后可以存放相似块数据的空闲部分,那么就可以把这部分数据平移到老固件区还原点(即存储还原后的数据块的位置)之后不参与差分计算的位置重新形成相似块,故平移可满足上述所有应用场景下,在老固件中还原点之后找到一一对应的相似块,形成差分包。
可选的,在制作差分包时,可以定义一个最大差分还原长度X,如果相似块或者新增块的大小大于X,则进行分段,形成拆分后的相邻相似块或者相邻新增块,拆分后的每个数据块的大小等于或小于设定大小X。其中,对于X的具体取值大小和单位本申请实施例不限定,可以根据实验值或经验值配置,可选的,X的单位可以是字节,如果块长度大于设定大小的字节数,则可以进行分片处理。
在进行差分还原时,根据新固件的起始位置依次进行还原,使用还原后的数据在固件分区的存储位置中包含相似块的数据,,那么需要将该部分数据平移到固件分区未做差分的空闲部分,未做差分的空闲部分包含已做过差分还原被释放的部分(后文中回收的空闲区域)。
改进差分算法可以分为以下4部分内容:
差分算法模块:用于根据原始固件(即老固件)生成差分数据。
数据链模块:用于对空闲块(即空闲区间,也就是老固件中除相似块之外的数据的存储空间)、差分块、新增块进行管理,以及进行分片后块***等。
空间管理模块:用于对空闲区域进行管理、回收、合并及分配。
分片处理模块:用于对大于还原步长X的数据块进行分片。
下面结合一些示意图对改进差分算法的实施流程进行可视化说明,该流程的实施步骤可以如下:
步骤1.对新老固件进行对齐处理
原始固件与新固件肯定可以存放在升级区(即固件分区)。当老固件小于新固件时,老固件跟新固件的大小进行对齐,尾部对齐部分作为空闲块,比如,新固件大小为A,老固件大小为B,如果A>B,则在老固件所占存储空间之后补齐大小为A减B的存储空间,这部分空间作为空闲空间。
步骤2.对固件的区域进行着色处理,老固件中的相似块使用黄色,空闲块使用白色,新固件中的目标块(在老固件中存在相似块的数据块)使用红色,新增块使用蓝色,已还原块(根据差分数据还原得到的新固件的数据块)使用绿色表示。上述着色处理只是为了便于说明差分算法的过程,并不是必选步骤,上述着色处理中的颜色在示意图中采用了对应颜色的文字进行说明,比如新固件中的“红1”表示新固件中的第一个目标块,老固件中的“黄1”则表示“红1”这个目标块的相似块。
该步骤实际上是根据新固件和老固件确定两者之间的相似块、新固件中的新增块、以及老固件中的空闲块。
对于老固件来说,只有相似块和空闲块,对于新固件来说有目标块和新增块,新固件中目标块的个数和老固件中相似块的个数是相等的。一个目标块在新固件中的位置可能在其对应的相似块在老固件中的位置之前,也可能在其之后。另外,在实际应用中,不同目标块的大小可能相同,也可能不同,但差分处理的原理是相同的,为了描述方便,下面以块大小相同为例进行了说明。
图6示出来了差分还原方法的原理示意图,如图6中a部分所示,该示例中新固件的目标块是红1、红2、红3和红4,以及分别与这四个目标块一一对应的老固件中的相似块是黄1、黄2、黄3和黄4,老固件中的白1、白2、白3和白4为空闲块。新固件中的蓝1至蓝4是新增块。
当老固件大小等于新固件时,新固件的新增块总大小等于老固件的空闲块总大小。当老固件小于新固件时,由于做了对齐处理,新增块总大小等于空闲块总大小。当老固件大于新固件时,新增块总大小小于空闲块总大小。
步骤3.差分移动处理
当前只有老固件FLASH区域(即老固件的固件分区)为实际的物理资源,新固件为要对老固件进行升级得到的固件。进行正向差分处理时,黄1区和红1区的数据形成差分块,形成该差分块即规则之后,则黄1区可以回收,对应的,在还原时根据规则还原后,黄1区不再使用,即嵌入式设备在根据该差分块和黄1区中的老固件的数据还原得到红1区中的新固件的数据之后,嵌入式设备可以将黄1区中的数据删除,黄1区回收作为空闲块。
具体的,差分还原时,首先根据上述黄1区和红1区之间的差分块以及黄1区的数据进行差分还原(图6中所示的还原红1),还原后的数据(也就是红1区中的数据)存储到白1区(与红1位置对应的老固件中的位置),白1区被占用,空闲块白1被删除(即空闲块白1不再是空闲块,变为了绿1,存储的是新固件中红1的数据),由于还原后黄1区后面不再使用,则黄1区被回收到空闲块中。还原红1区之后的老固件的固件分区如图6中的b部分所示,白1变为了绿1,黄1变为了白5。
然后对蓝1区(即新增块1)进行***还原(图6中所示的还原蓝1),即将蓝1区的数据***到固件分区对应的位置,也就是黄3区,还原蓝1区后,黄3区要被使用,而黄3区中的数据是相似块,黄3区中的数据需移动到后面的空闲块中,移动后重新形成与红3区对应的相似块。还原蓝1区之后的老固件的固件分区如图6的c部分所示,原来的黄3变为了绿2,原来存储在黄3中的数据移动到了原来的白4中,作为红3的新的相似块。
之后对红2区进行差分还原(图6中所示的还原红2),同样的,基于红2区和黄2区之间的差分数据和黄2区的数据进行差分还原,得到红2区中的数据并存储到与红2区位置对应的老固件中的白2区中。还原红2区之后的老固件的固件分区如图6的d部分所示,原来的白2变为了绿3,原来的黄2被回收为了空闲块即白6。
接下来是对蓝2区进行***还原(图6中所示的还原蓝2),将蓝2区中的数据存储到白5区中,还原蓝2区之后的老固件的固件分区如图6的e部分所示。
再对红3进行差分还原(图6中所示的还原红3),基于黄3区中的数据以及红3与黄3之间的差分数据对红3区进行差分还原后,老固件的固件分区中如图6的f部分所示,还原后的数据存储到原来的白3区中,成为了绿5,原来的黄3区回收为了白7。
接下来对蓝3区进行***还原(图6中所示的还原蓝3),此时需要平移黄4区中的数据到空闲块,移动后重新形成与红3区对应的相似块,将蓝3区进行还原后,老固件的固件分区中如图6的g部分所示,原来黄4中的数据移动到了原来的白6中。之后,再对红4区进行差分还原,并在还原后回收黄4区的资源,即删除黄4区的数据,将红4区还原后的老固件的固件分区如图6的h部分所示。最后对蓝4区进行***还原,还原后的老固件的固件分区如图6的i部分所示,此时固件分区中存储区的数据即为还原得到的新固件。
通过上述差分还原的步骤可以看出:1.空闲区总大小大于或等于新增区;2.
当差分块出现重复区域时(至少两个新固件数据块对应同一老固件差分块),空闲区会增加相同大小的区域;3.差分后的相似块(差分还原时被使用的老固件中的数据所在区域)可以被回收重复利用;4.对数据块进行平移时总是可以找到空闲区域存放要平移的数据。
由上述描述可以看出,差分还原是根据与新固件的差分顺序进行的,那么可以对还原过程进行分片化处理,即每次还原或者***X大小的数据段,减少每一次还原使用的资源。分片前,长度任意(差分块与新增块的数据块大小可能相同,也可能不同)。
下面结合示意图,对基于分片化处理方式的差分包生成过程(即新固件和老固件的差分过程)进行可视化说明。
作为一个示例,图7中的a部分示出了新固件和老固件中各个数据块的示意图,同样的,老固件中的相似块使用黄色,空闲块使用白色,新固件中的目标块使用红色,新增块使用蓝色。新固件差分块与其对应的老固件差分块的数字相同。如新固件中的红1对应的相似块是黄1。
按照设定大小X对新固件依次进行分片处理,第一次分片处理的示意图如图7中b部分所示,竖线前的数据大小即为设定大小X,黄3区中的竖线前的数据(b部分的斜线填充部分)需要移动后面的空闲块中,可选的,可以移动到白2、白3或白4中任意一块中(该示例中移动至了白2中,即图7的c部分斜线填充部分的黄5),并更新红3分为两部分,一部分为原始剩余部分(c部分的红3),一部分为移动后的部分(c部分的红5,也就是与c部分的黄5对应的相似数据)。第一次分片处理后的新固件和老固件的对应关系如图7中的c部分所示。在差分时,红1区中竖线前的数据与黄1区中对应大小的数据形成差分数据,因为在差分还原时,此次分片后得到的新固件的第一个子块(即大小为X的数据块)对应的该差分数据会与黄1区中对应大小的数据进行差分还原得到该子块,之后黄1区中该部分数据可以被回收为空闲区域,因此,白2区在c部分的区域变大了。
第二次分片处理如图7的d部分所示,同样的,黄3区中竖线前的数据(d部分斜线填充部分)需要移动后面的空闲块中,可以移动到白2、白3或白4中任意一块中,如图7的e部分所示,该部分数据移动到了黄6,也就是原来白3区,并更新d部分的红3(被移动的该部分数据对应的相似数据)分为两部分,一部分为原始剩余部分(e部分的红3),一部分为移动后的部分(e部分的红6),第二次分片处理后的结果如图7的e部分所示。
第三次分片的位置如f部分的竖线,此次分片处理后,f部分中竖线前的黄3中的数据移动到了白4区中,如g部分的黄7,f部分的红3分为了g部分的红7和红3。
第四次分片的位置如图7的g部分的竖线,此次分片后f部分的黄3区竖线后的部分以及f部分的黄5部分分别移动到了g部分所示的黄3区和黄5区中。通过不断重复分片处理过程,得到分片处理后的新的目标块、新的相似块、新的新增块、新的空闲块,根据上述分片处理原理,可以得到差分还原信息(也就是用于确定差分包中每个差分块对应的相似块的信息)、每个新的相似块移动前的存储位置和移动后的存储位置(用于指示在差分还原时应该将该相似块移动到哪里),例如,图7所示的示例中,在根据分片处理后的第一个小红块与其对应的黄块之间的差分块进行差分还原时,可以根据差分还原信息知晓这个差分块对应的黄块在固件分区的哪里,可以根据找到的黄块中的数据和该差分块还原得到这个第一个小红块的数据,还原得到的该数据需要从固件分区的起始位置开始存储,也就是图7的b部分中老固件中竖线之前的区域,由于该区域包含黄3的部分数据,需要平移到后面的空闲块中,在差分还原时,根据差分包中该部分数据的平移控制信息可以知道需要把该部分数据移动到固件分区后面的哪个区域。
通过上述差分过程可以看出:设定长度为X的差分过程,分片的次数n为固件大小除以X中结果向下取整,在差分过程中,可以首先根据原始差分算法形成差分包,如图7的a部分所示,根据差分包内容,分别形成空闲块节点(即上述空闲块)、老固件差分块节点(即上述老固件中的相似块),新固件差分节点(新固件中的目标块),新增块节点(新固件中的新增块),每个节点包含在节点的大小/长度(也就是数据块的大小)、以及节点在固件分区中的原始位置(如数据块的起始位置相对于固件分区的起始位置的偏移位置)。
之后,可以根据新固件的差分节点和新增节点,重新生成差分包,如果块长度大于X,则做分片处理,分成小于等于X的多个新的差分节点或新增节点(即通过分片处理后得到的各个新的目标块和新增块),差分部分完成之后,回收老固件中的差分资源块。平移固件分区中0(即起始位置)至n*X长度内的差分块内容,并更改差分块的偏移位置,形成平移控制信息。差分还原过程则是:每次还原长度大小为X的内容,根据差分数据进行差分还原,根据平移控制信息进行平移操作,找到分片处理后的各新固件的差分节点对应的老固件差分节点。
本申请实施例提供的软件升级方法,可以是适用但不限于AB升级方式、差分升级方式、压缩升级方式中任意两种升级方式之间的切换。下面以这几种升级方式为例对本申请实施例提供的方案的原理再次进行说明。
由于差分升级方式和压缩升级方式只是单固件分区,差分包和压缩包从固件分区的尾部向上存储即可(即存储在固件分区的尾部区域即可)。在采用差分升级方式或压缩升级方式升级时,只需要能够识别出来尾部的升级包是差分包还是升级包即可。AB升级方式同样,当固件运行于A固件(即A分区,存储区域靠前的分区)时,跟单***固件的位置一致,转换成其他升级方式时,把当前的升级包存放到B固件分区尾部向上即可。也就是说,对于差分包和压缩包的升级包来说,只要能够区分识别即可。
可选的,升级过程可以分为两部分,第一部分为下载过程,第二部分为升级过程。对于AB升级方式来说,当下载如图3所示的升级数据时,可以首先下载头部,如果判别出是AB升级包(即AB升级方式对应的数据包)时,只需要把除包头的部分下载到AB升级方式的备用分区即可,并在完成升级之后告知下一次启动时需要启动新的分区(即此次升级的分区),也就是更新本地升级标识。
对于差分升级方式和压缩升级方式,下载过程,只是把升级包的内容下载到分区尾部向上的存储空间,升级过程则是差分还原或者解压缩还原到原始固件区替换原有的固件数据。
如果当前升级方式是AB升级方式,对于目标升级方式也是AB升级方式来说,完成下载过程后,更新启动分区标记就完成了本次升级的动作。对于目标升级方式是差分升级方式或压缩升级方式,包头内容也会进行存储,用于在升级时区分升级包是差分包还是压缩包。
可见,在升级方式发生切换时,由于差分升级放方式和压缩升级方式是单固件升级,固件从整个固件分区起始地址开始存储在固件分区中,固件分区的尾部保存升级包,升级时只需分区升级包类型就可完成升级方式切换,升级包类型可以在升级包的头部中做了区分(即通过第一升级标识可以区分)。
差分升级方式或压缩升级方式转换AB升级方式时,由于差分升级方式和压缩升级方式的固件是从整个固件分区的起始地址开始存储,切换到AB升级方式后,根据升级包的头部信息,确定是AB升级方式,则需要把整个固件分区当作两个***分区识别,第一次把升级包存储到B分区(即存储位置靠后的分区),后续升级在AB分区之间进行切换升级。
AB升级方式转换成差分升级方式或压缩升级方式时,把升级包存放到备用分区中,在当前运行在A区时,升级包从B区的尾部向上存放,头部区分了升级包的类型,在还原时根据升级包进行还原。当当前运行在B区时,升级包存放于A区的尾部向上存放。
本申请实施例提供的升级方法中,涉及到以下几个升级标识标志:
AB升级标识,标识从A分区还是从B分区启动,当是差分升级方式时,此标识被清0,如果是AB升级方式,该标识则一定有效,如果是由AB升级方式切换为差分升级方式或压缩升级方式,则该标识在升级包下载完成后清0,同时差分压缩升级标识置1。
差分压缩升级标识,标识为1标识发生了差分或者压缩升级,具体从升级软件包的包头获取。如果升级软件包是差分或者压缩升级方式,则下载完升级包后置此标记,如果是压缩升级方式或差分升级方式转为AB升级方式,此标记清0的同时AB升级标识置A或B。
差分压缩地址标识,标识升级包存储的起始存储地址,差分压缩升级标识有效时才有效。
可选的,在实际应用中,本地升级标识可以包括上述AB升级标识和差分压缩升级标识,哪个标识有效(如上述置为1表示有效),则说明本地升级方式是有效标识对应的升级方式。当然,本地升级标识也可以是一个标识,该标识置A表示本地升级方式为AB升级方式,且升级针对的分区是A分区,如果该标识置B表示本地升级方式为AB升级方式,且升级针对的分区是B分区,如果该标识置1(或A和B除外的其他值)表示本地升级方式为压缩升级方式或差分升级方式。升级软件包的包头的第一升级标识的形式本申请实施例也不做限定,能够用于区分目标升级方式具体是哪种方式即可。
此外,AB升级方式为全量升级方式,当固件版本迭代到一定程度时,无法确定当前最新的基础版本以及运行版本的分区,即由于现实的各种情况,由于AB是下发了一系列的版本升级,但存在中间个别版本无升级的状态,系列升级过程中会出现跨越版本升级的情况。
比如:历史发布版本号依次为1.0.0、2.0.0、3.0.0、4.0.0和5.0.0。一直在线的板子:出厂版本为1.0.0运行于A分区,经过四次升级到5.0.0运行在A分区。跨时间段在线的板子,出厂版本为1.0.0运行于A分区,2.0.0/3.0.0/4.0.0发布时未在线或者错过了升级,升级了一次到5.0.0运行在B分区。由于AB升级方式是全量AB升级,可以基于任意的基础版本升级到最新的版本。
当要发布6.0.0版本时,发现固件的大小超过了A分区或者B分区的大小,则此时需要考虑5.0.0运行不同分区的问题,由于差分升级是需要考虑基础版本号的,故6.0.0的升级只能基于5.0.0,非5.0.0的版本需要先根据之前的升级策略升级到5.0.0。当5.0.0版本运行于A分区时,差分包下载到B分区的尾部向上即可进行正常过程的差分还原过程,当5.0.0版本运行于B分区时,差分包只能反向存放于A分区的尾部区域。
在具体升级处理时,可以在固件的头部(第二升级标识)标识自身是那种升级方式(即本地升级方式),在升级软件包的头部(第一升级标识)中表明自己是哪种方式的升级包(即目标升级方式),当前固件识别自身运行的固件区(即设备当前所运行在的目标分区),之后,可以根据本申请实施例所提供的升级方法进行软件的升级。本地升级方式是差分/压缩升级方式时,只需要根据第一升级标识识别出是哪种升级包即可,由于老固件本身存储于整个固件区的前面,升级包位于固件区尾部向上。当升级包是AB升级方式的升级包时,需要从固件区的一半的位置开始烧录,此时要保证之前的固件于升级后的固件都不大于整个固件区的一半。
图8中示出了本申请实施例提供的一种支持上述三种升级方式之间切换的升级方法的原理示意图,图8中左侧第一列信息表示本地升级方式的可能情况,可以根据固件头部(第二升级标识)确定,“差分”表示本地升级方式为差分升级方式,“压缩”表示本地升级方式为压缩升级方式,“AB→A”表示本地升级方式为AB升级方式,此次升级的针对的分区是A分区,“AB→B”表示本地升级方式为AB升级方式,此次升级的针对的分区是B分区。图8中左侧第二列信息表示目标升级方式的可能情况,可以根据升级软件包的包头(第一升级标识)确定,其中,“差分包”表示目标升级方式是差分升级方式,“压缩包”标表示目标升级方式是压缩升级方式,“AB包”表示目标升级方式是AB升级方式。
如图8中所示,如果本地升级方式是差分升级方式或压缩升级方式,目标升级方式是差分升级方式或压缩升级方式,可以将升级包(差分包或压缩包)存储到整个固件分区的尾部区域(图8中所示的存放在B分区尾部),之后,采用对应的升级方式进行升级即可。
如果本地升级方式是差分升级方式或压缩升级方式,目标升级方式是AB升级方式,需要将AB包从固件分区的一般的位置开始烧录到固件分区(图中所示的根据当前分区(固件分区的前1/2的分区),存放到备用分区(固件分区的后1/2的分区),此次升级后还需要更新启动分区标记,以在下次启动时运行B分区的固件(即启用备份分区的固件),还需要更新本地升级标识。
如果本地升级方式是AB→A,表示当前运行在A分区,如果目标升级地方是差分或压缩升级方式,需要将差分包或压缩包存储到B分区尾部,并采用相应的差分或压缩升级方式进行升级处理。如果本地升级方式是AB→B,表示当前运行在B分区,如果目标升级地方是差分或压缩升级方式,需要将差分包或压缩包存储到A分区尾部,对B分区进行差分还原或压缩还原。
如果本地升级方式和目标升级方式都是AB升级方式,根据当前运行在的目标分区(当前分区),将AB包存储到非目标分区(即备用分区),根据AB包完成升级后,更新本地升级标识,告知下次启动从哪个分区启动(图8中所示的启动备用分区固件),也就是说,如果此次是对A分区的固件进行的升级,标识下次是对B分区的固件进行升级。
基于本申请实施例提供的软件升级方法,在需要进行软件升级处理时,可以根据软件升级包中携带的第一升级标识来判别此次升级的目标升级方式,可以通过本地存储的第二升级表示来判别本地升级方式,并可以根据本地升级方式确定出升级包在固件分区中的目标存储区域,进而可以将升级包存储到该目标存储区域,进一步的,则可以采用目标升级方式实现软件升级。基于该方法,不论软件的本地升级方式和目标升级方式是否相同,都可以实现软件升级,能够更好的满足实际应用需求。
基于与本申请实施例提供的方法相同的原理,本申请实施例还提供的一种软件升级装置,该软件升级装置100包括升级数据获取模块110、升级方式确定模块120和升级处理模块130。
升级数据获取模块110,用于获取待升级软件的升级数据,升级数据包括第一升级标识和升级包;
升级方式确定模块120,用于根据第一升级标识确定升级包对应的目标升级方式,以及确定待升级软件当前的本地升级方式;
升级处理模块130,用于根据本地升级方式,确定升级包在固件分区中的目标存储区域,将升级包存储到目标存储区域,并基于升级包采用目标升级方式对待升级软件进行升级,其中,固件分区为待升级软件在终端设备中的存储区域。
可选的,目标升级方式为双***升级方式或单***升级方式,本地升级方式为双***升级方式或单***升级方式。可选的,双***升级方式为AB升级方式,单***升级方式为差分升级方式或压缩升级方式。
可选的,升级处理模块在根据本地升级方式,确定升级包在固件分区中的目标存储区域时,可以用于:在本地升级方式为双***升级方式时,确定固件分区中待升级软件当前运行所在的目标分区,将固件分区的非目标分区确定为目标存储区域;在本地升级方式为单***升级方式时,若目标升级方式是单***升级方式,将固件分区的尾部区域确定为目标存储区域,若目标升级方式为双***升级方式,则将固件分区划分为双***升级方式对应的第一分区和第二分区,将第二分区的头部区域确定为目标存储区域,其中,第二分区的存储区域位于第二分区的存储区域之后。
可选的,在本地升级方式为双***升级方式,目标升级方式为单***升级方式时,升级处理模块在将升级包存储到目标存储区域,并基于升级包采用目标升级方式对待升级软件进行升级时,可以用于:若目标分区的存储区域位于非目标分区之前,将升级包存储到非目标分区的尾部区域;在目标升级方式为压缩升级方式时,对非目标分区的尾部区域存储的升级包进行解压缩,将解压缩后的数据从固件分区的起始位置开始存储到所固件分区中;在目标升级方式为差分升级方式时,基于非目标分区的尾部区域存储的升级包和目标分区中存储的数据进行差分升级。
可选的,在本地升级方式为双***升级方式,目标升级方式为单***升级方式时,升级处理模块在将升级包存储到目标存储区域,并基于升级包采用目标升级方式对待升级软件进行升级时,可以用于:
若目标分区的存储区域位于非目标分区之后,将升级包存储到非目标分区尾部的第一空间中;
从目标分区的尾部区域划分出与第一空间相同大小的第二空间,并将第一空间中存储的数据与第二空间中存储的数据交换;
在目标升级方式为压缩升级方式时,对第二空间存储的升级包进行解压缩,并将解压缩后的数据从固件分区的起始位置开始存储到固件分区中;
在目标升级方式为差分升级方式时,基于第二空间存储的升级包、目标分区的第三空间中存储的数据以及第一空间中存储的数据进行差分升级,并将升级后的数据从固件分区的起始位置开始存储到固件分区中,其中,第三空间是目标分区中除第二空间之外的存储区域。
可选的,升级方式确定模块在确定待升级软件当前的本地升级方式时,可以用于:获取本地存储的待升级软件的第二升级标识,根据第二升级标识确定本地升级方式;其中,若本地升级方式为双***升级方式,第二升级标识还用于标识升级所针对的升级分区。
可选的,在目标升级方式和本地升级方式不同时,升级处理模块还用于:在目标升级方式和本地升级方式不同时,将第二升级标识更新为目标升级方式对应的升级标识;若本地升级方式和目标升级方式都是双***升级方式,升级处理模块还用于:将第二升级标识所标识的升级分区进行更新。
可选的,升级数据还包括存储地址标识,存储地址标识用于指示在目标升级方式为单***升级方式时,升级包在固件分区中的起始存储地址。
本申请实施例的装置可执行本申请实施例所提供的方法,其实现原理相类似,本申请各实施例的装置中的各模块所执行的动作是与本申请各实施例的方法中的步骤相对应的,对于装置的各模块的详细功能描述具体可以参见前文中所示的对应方法中的描述,此处不再赘述。本申请实施例提供的软件升级装置,在对软件升级时,不论软件的目标升级方式和本地升级方式是否发生了切换,都可以根据本地升级方式确定出升级包在固件分区中的存储区域,根据升级数据中的第一升级标识可以知晓目标升级方式,从而可以根据目标升级方式实现软件升级。基于本申请实施例提供的软件升级装置,可以实现多种不同软件升级方式互相升级的支持,即使软件升级方式发生切换也可以实现升级。
本申请实施例中还提供了一种电子设备,包括存储器、处理器及存储在存储器上的计算机程序,该处理器执行上述计算机程序以实现本申请任一可选实施例提供的方法。
图10示出了本申请实施所适用的一种电子设备的结构示意图,如图10所示,该电子设备4000包括:处理器4001和存储器4003。其中,处理器4001和存储器4003相连,如通过总线4002相连。可选地,电子设备4000还可以包括收发器4004,收发器4004可以用于该电子设备与其他电子设备之间的数据交互,如数据的发送和/或数据的接收等。需要说明的是,实际应用中收发器4004不限于一个,该电子设备4000的结构并不构成对本申请实施例的限定。
处理器4001可以是CPU(Central Processing Unit,中央处理器),通用处理器,DSP(Digital Signal Processor,数据信号处理器),ASIC(Application SpecificIntegrated Circuit,专用集成电路),FPGA(Field Programmable Gate Array,现场可编程门阵列)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器4001也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等。
总线4002可包括一通路,在上述组件之间传送信息。总线4002可以是PCI(Peripheral Component Interconnect,外设部件互连标准)总线或EISA(ExtendedIndustry Standard Architecture,扩展工业标准结构)总线等。总线4002可以分为地址总线、数据总线、控制总线等。为便于表示,图10中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器4003可以是ROM(Read Only Memory,只读存储器)或可存储静态信息和指令的其他类型的静态存储设备,RAM(Random Access Memory,随机存取存储器)或者可存储信息和指令的其他类型的动态存储设备,也可以是EEPROM(Electrically ErasableProgrammable Read Only Memory,电可擦可编程只读存储器)、CD-ROM(Compact DiscRead Only Memory,只读光盘)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质、其他磁存储设备、或者能够用于携带或存储计算机程序并能够由计算机读取的任何其他介质,在此不做限定。
存储器4003用于存储执行本申请实施例的计算机程序,并由处理器4001来控制执行。处理器4001用于执行存储器4003中存储的计算机程序,以实现前述方法实施例所示的步骤。
本申请实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
本申请实施例还提供了一种计算机程序产品,包括计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”、“1”、“2”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除图示或文字描述以外的顺序实施。
应该理解的是,虽然本申请实施例的流程图中通过箭头指示各个操作步骤,但是这些步骤的实施顺序并不受限于箭头所指示的顺序。除非本文中有明确的说明,否则在本申请实施例的一些实施场景中,各流程图中的实施步骤可以按照需求以其他的顺序执行。此外,各流程图中的部分或全部步骤基于实际的实施场景,可以包括多个子步骤或者多个阶段。这些子步骤或者阶段中的部分或全部可以在同一时刻被执行,这些子步骤或者阶段中的每个子步骤或者阶段也可以分别在不同的时刻被执行。在执行时刻不同的场景下,这些子步骤或者阶段的执行顺序可以根据需求灵活配置,本申请实施例对此不限制。
以上仅是本申请部分实施场景的可选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请的方案技术构思的前提下,采用基于本申请技术思想的其他类似实施手段,同样属于本申请实施例的保护范畴。