一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

操作系统数据配置方法、设备、存储介质及程序产品与流程

2022-05-11 10:24:22 来源:中国专利 TAG:
1.本技术涉及计算机
技术领域
:,具体地涉及一种操作系统数据配置方法、设备、存储介质及计算机程序产品。
背景技术
::2.在现有技术的应用场景中,用户终端需要安装操作系统才可以被用户使用。例如,手机上需要安装手机操作系统(例如:ios系统、安卓系统)才可以被用户使用。3.在终端设备安装操作系统后,当操作系统出现版本升级时,需要升级终端设备上所安装的操作系统。在升级过程中,存在升级错误的情况。例如,读取升级数据时读取操作失败;又例如,写入升级数据时写入操作失败。因此,需要一种针对操作系统升级失败的操作系统数据配置方法。技术实现要素:4.有鉴于此,本技术提供一种操作系统数据配置方法、设备、存储介质及计算机程序产品,以利于解决现有技术中操作系统升级失败时静态分区不可用的问题。5.第一方面,本技术实施例提供了一种操作系统数据配置方法,应用于电子设备,所述电子设备包括处理器以及存储器,所述存储器包括基础分区、第一静态分区、第二静态分区、动态分区以及用户数据分区;所述电子设备启动后加载所述基础分区、所述第一静态分区以及动态分区的数据以启动第一操作系统;所述第一操作系统启动之后,所述方法包括:6.获取操作系统升级包;7.将所述第二静态分区的状态标记设置为不可启动;8.根据所述操作系统升级包升级所述第二静态分区的数据;9.当所述第二静态分区的数据升级失败时,将所述第二静态分区的状态标记设置为可启动,并且,将所述第一静态分区的数据同步到所述第二静态分区。10.在第一方面的一种实现方式中,所述方法还包括:11.当所述第二静态分区的数据升级失败时,输出升级失败提示信息。12.在第一方面的一种实现方式中,当所述第二静态分区的数据升级失败时,后台执行所述将所述第二静态分区的状态标记设置为可启动的步骤,以及,后台执行所述将所述第一静态分区的数据同步到所述第二静态分区的步骤。13.在第一方面的一种实现方式中,所述操作系统升级包包含用于升级所述动态分区的动态分区升级数据,所述方法还包括:14.当所述第二静态分区的数据升级成功时,根据所述操作系统升级包在所述用户数据分区中写入动态分区升级数据;15.当所述动态分区升级数据写入失败时,将所述第二静态分区的状态标记设置为可启动,并且,将所述第一静态分区的数据同步到所述第二静态分区。16.在第一方面的一种实现方式中,所述方法还包括:17.当所述动态分区升级数据写入失败时,输出升级失败提示信息。18.在第一方面的一种实现方式中,当所述动态分区升级数据写入失败时,后台执行所述将所述第二静态分区的状态标记设置为可启动的步骤。19.在第一方面的一种实现方式中,所述方法还包括:20.当所述动态分区升级数据写入失败时,删除所述用户数据分区中已写入的动态分区升级数据。21.在第一方面的一种实现方式中,所述操作系统升级包还包含用于更新所述动态分区的分区配置的第一分区配置信息,所述方法还包括:22.当所述第二静态分区的数据升级成功时,将所述动态分区的元数据中的分区信息备份为分区备份信息;23.分区信息备份完成后,根据所述第一分区配置信息刷新所述动态分区的元数据中的分区信息;24.当所述动态分区升级数据写入失败时,使用所述分区备份信息恢复所述动态分区的元数据中的分区信息。25.在第一方面的一种实现方式中,所述方法还包括:26.当所述动态分区升级数据写入成功时,将所述第二静态分区的状态标记设置为可启动,修改所述电子设备的启动顺序为从所述第二静态分区启动;27.重启所述电子设备,确认所述电子设备的启动顺序为从所述第二静态分区启动;28.加载所述基础分区以及所述静态分区的数据;29.加载所述动态分区的数据以及所述动态分区升级数据,启动所述第二操作系统;30.将所述动态分区升级数据落盘到所述动态分区。31.在第一方面的一种实现方式中,所述方法还包括:32.当所述第二静态分区的数据升级成功时,将所述第二静态分区的状态标记设置为可启动,修改所述电子设备的启动顺序为从所述第二静态分区启动。33.第二方面,本技术实施例提供了一种电子设备,所述电子设备包括处理器以及存储器,所述存储器包括基础分区、第一静态分区、第二静态分区、动态分区以及用户数据分区,所述处理器用于执行所述存储器上存储的软件代码,以使得所述电子设备启动后加载所述基础分区、所述第一静态分区以及所述动态分区的数据以运行第一操作系统;34.并且,在所述第一操作系统运行之后,使得所述电子设备执行如第一方面所述的方法流程。35.第三方面,本技术实施例提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,当其在计算机上运行时,使得计算机执行如第一方面所述的方法。36.第四方面,本技术实施例提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,当其在计算机上运行时,使得计算机执行如第一方面所述的方法。37.根据本技术实施例所提出的上述技术方案,至少可以实现下述技术效果:38.根据本技术实施例的方法,可以在第二静态分区升级失败时确保设备后续可以从第二静态分区顺利启动操作系统,从而大大提高操作系统启动的成功率,确保设备稳定运行,提高用户的设备使用体验。附图说明39.为了更清楚地说明本技术实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。40.图1所示为根据本技术一实施例的数据存储结构示意图;41.图2a所示为根据本技术一实施例的操作系统升级的流程图;42.图2b为根据本技术一实施例的手机运行界面示意图;43.图2c为根据本技术一实施例的手机运行界面示意图;44.图3a所示为根据本技术一实施例的操作系统数据调配流程图;45.图3b所示为根据本技术一实施例进行操作系统升级的部分流程图;46.图4所示为一应用场景下设备出厂前进行系统烧录的烧录系统框架结构示意图;47.图5所示为根据本技术一实施例的操作系统数据调配流程图。具体实施方式48.为了更好的理解本技术的技术方案,下面结合附图对本技术实施例进行详细描述。49.应当明确,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。50.在本技术实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术。在本技术实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。51.应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,甲和/或乙,可以表示:单独存在甲,同时存在甲和乙,单独存在乙这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。52.在实际应用场景中,针对操作系统升级失败,一种可行的解决方案是回滚操作系统,将操作系统恢复为升级前状态,在顺利启动操作系统后重新进行操作系统升级操作。53.以采用虚拟a/b升级方式的安卓系统为例,图1所示为根据本技术一实施例的数据存储结构示意图。如图4所示,安卓系统数据存储区包含基础分区(common)、静态分区(a)(第一静态分区)、静态分区(b)(第二静态分区)、动态分区(super)、用户数据分区(userdata)。54.用户数据分区(userdata)用于保存用户的个人数据,例如,用户个人安装的app、用户个人保存的图片、文档以及视频等个人数据。基础部分中保存的数据为不参与操作系统升级的系统数据。静态分区(a)与静态分区(b)的结构相互对应,子分区命名通过后缀_a以及_b相互区分。例如,静态分区(a)包括bootloader_a、boot_a、vendor_boot_a、dtbo_a、vbmeta_a;静态分区(b)包括bootloader_b、boot_b、vendor_boot_b、dtbo_b、vbmeta_b。动态分区(super)包含多个子分区(system、system_ext、vendor、product、cust、odm)。55.在设备启动时,从一个静态分区启动。例如,设备从静态分区(a)启动:依次加载基础分区(common)、静态分区(a)以及动态分区(super);设备从静态分区(b)启动:依次加载基础分区(common)、静态分区(b)以及动态分区(super)。56.以采用主引导记录(masterbootrecord,mbr)格式的通用闪存(universalflashstorage,ufs)为例。在ufs的mbr(主引导扇区,ufs的第一个扇区,即c/h/s地址的0柱面0磁头1扇区)中,保存有设备启动顺序描述,例如,从静态分区(a)启动(启动顺序标志为a)或从静态分区(b)启动(启动顺序标志为a)。设备启动后首先从ufs的mbr中读取设备启动顺序。57.图2a所示为针对图1所示实施例的操作系统数据存储结构进行操作系统升级的流程图,当设备当前是从静态分区(a)启动时,设备按照如图2a所示的流程实现操作系统的升级。58.s200,设备依次加载基础分区(common)、静态分区(a)以及动态分区(super),从静态分区(a)启动。59.s210,设备获取操作系统升级安装包。60.示例的,在一种可行的实现方案中,设备定期向搜包服务器发起搜包请求,搜包请求包含设备当前运行的操作系统的版本号(例如版本1.1);搜包服务器根据搜包请求中的操作系统版本号,检索当前是否存在更新版本号的操作系统安装包(例如版本1.2);当存在更新版本号的操作系统安装包时,搜包服务器向设备反馈操作系统升级安装包(例如,由版本1.1升级到版本1.2的系统增量升级安装包)的下载地址;设备根据操作系统升级安装包的下载地址下载操作系统升级安装包。61.s220,设备根据操作系统升级安装包针对静态分区(b)进行数据写入操作以升级静态分区。62.s230,设备根据操作系统升级安装包在用户数据分区(userdata)创建虚拟动态分区,在虚拟动态分区写入动态分区(super)的升级数据。例如,在操作系统升级安装包中包含动态分区升级数据,例如,版本1.2的动态分区的数据,设备在虚拟动态分区中写入版本1.2的动态分区(super)的数据。63.进一步的,在虚拟a/b升级方案中,针对动态分区(super),采用增量升级方式。在升级过程中,用户数据分区(userdata)的虚拟动态分区中保存的并不是升级后新版本的动态分区(super)的全部文件,而是旧版本的动态分区(super)中需要升级的数据在升级后的升级结果。即,用户数据分区(userdata)的虚拟动态分区中保存的是动态分区的更新数据。64.以system子分区为例,假设在版本1.1中,system子分区中的数据可以分为system1、system2两部分。从版本1.1升级到版本1.2,数据system2没有发生变化,数据syetem1被升级为system3。那么,在s230中,设备在用户数据分区(userdata)创建虚拟动态分区,在虚拟动态分区中写入数据system3。65.例如,版本1.1升级到版本1.2的系统增量升级安装包包含版本1.1升级到版本1.2的动态分区(super)更新数据,该动态分区(super)更新数据包含数据system3。66.进一步的,在虚拟a/b升级方案中,基于快照技术(snapshot)实现动态分区(super)的增量升级。具体的,用户数据分区(userdata)的虚拟动态分区中,采用写时拷贝(copy-on-write,cow)文件保存动态分区(super)的升级数据。67.具体的,用户数据分区(userdata)中保存的动态分区(super)的升级数据包含多个cow文件,每个cow文件对应一个动态分区(super)的子分区,cow文件的命名与其所针对的动态分区(super)子分区相对应。68.在s210所获取的操作系统升级安装包中,动态分区(super)的升级数据的cow文件以二进制代码形式压缩保存。在操作系统升级安装包中,每个cow文件根据其所针对的动态分区(super)子分区所命名。例如,针对system子分区的cow文件被命名为system-cow-img.img.0000。69.在s230中,设备解包操作系统升级安装包以获取所有的cow文件,为每个cow文件附加a/b分区标记。具体的,当设备当前从静态分区(a)启动时,可以理解为设备当前运行操作系统所加载的动态分区(super)为动态分区(a)。在升级操作系统时,用户数据分区(userdata)中创建的虚拟动态分区是针对动态分区(b)。因此,为cow文件附加对应动态分区(b)的名称标记_b。例如,为system-cow-img.img.0000附加_b生成system_b-cow-img.img.0000。70.进一步的,在s230中,在用户数据分区(userdata)中创建update文件夹,将重命名的cow文件保存到update文件夹下。例如,在一应用场景中,在向用户数据分区(userdata)写入cow文件后,用户数据分区(userdata)的update文件夹中包含下述文件:71.system_b-cow-img.img.0000;72.system_ext_b-cow-img.img.0000;73.vendor_b-cow-img.img.0000;74.product_b-cow-img.img.0000;75.cust_b-cow-img.img.0000;76.odm_b-cow-img.img.0000。77.具体的,cow文件中包含cow文件自身的cow文件地图(快照map)以及升级数据。cow文件地图(快照)与cow文件所针对的动态分区(super)的子分区的文件地图相对应。动态分区(super)的子分区的文件地图用于描述当前版本的操作系统(本次升级之前的版本,例如,版本1.1)动态分区(super)的子分区中的所有文件以及各个文件的保存地址。78.cow文件中的升级数据为相较于当前版本的子分区数据,新版本的子分区数据中被更新的文件;cow文件自身的cow文件地图则用于描述被更新的文件与当前版本的子分区中的文件间的对应关系以及被更新的文件的保存地址。79.基于动态分区(super)的子分区的文件地图以及cow文件中的cow文件地图,就可以使用cow文件中的升级数据替换动态分区(super)的子分区中的对应文件,从而实现动态分区(super)数据的升级。具体的,在需要获取动态分区(super)的子分区的文件地图时,可以基于snapshot对动态分区(super)的子分区的数据进行快照操作以生成动态分区(super)的子分区的文件地图。也可以在制作操作系统升级安装包时,预先生成动态分区(super)的子分区的文件地图,将该文件地图加入到cow文件中。80.以system子分区为例,假设system子分区中按照以下路径保存数据:81./system/app/a0.xxx;82./system/app/a1.xxx;83./system/app/a2.xxx;84./system/b0.xxx;85./system/b1.xxx;86./system/user/c0.xxx;87./system/user/c1.xxx;88./system/user/c2.xxx;89./system/user/c3.xxx。90.system子分区的文件地图可以是:91./system/app/a0.xxx:024010~024013;92./system/app/a1.xxx:024014~024017;93./system/app/a2.xxx:024018~024020;94./system/b0.xxx:024021~024026;95./system/b1.xxx:024027~024028;96./system/user/c0.xxx:024029~024032;97./system/user/c1.xxx:024033~024035;98./system/user/c2.xxx:024036~024040;99./system/user/c3.xxx:024041~024044。100.文件名后的数值(例如,/system/app/a0.xxx:024010~024013中的024010~024013)为该文件在动态分区(super)的system子分区的物理保存地址(块地址)。101.假设当前操作系统升级需要更新数据/system/app/a2.xxx以及/system/user/c2.xxx。102.可以视为:103./system/app/a2.xxx以及/system/user/c2.xxx为system子分区数据的system1部分;104./system/app/a0.xxx、/system/app/a1.xxx、/system/b0.xxx、/system/b1.xxx、/system/user/c0.xxx、/system/user/c1.xxx以及/system/user/c3.xxx为system子分区数据的system2部分。105.那么,针对system子分区的cow文件(system_b-cow-img.img.0000)就包含最新版的/system/app/a2.xxx以及/system/user/c2.xxx。106.可以视为,最新版的/system/app/a2.xxx以及/system/user/c2.xxx为system3。升级目标是使用system3更新掉system1。107.cow文件(system_b-cow-img.img.0000)自身的cow文件地图可以为:108./system/app/a2.xxx:109.map1(原super分区中待更新数据的地址):起始地址addressstart:024018(相对于system起始地址的偏移量);偏移量大小size:2(即024018~024020地址段的数据)110.map2(cow文件中存储的更新数据的地址):起始地址addressstart:045033(相对于cow文件存储的起始地址的偏移量);偏移量大小size:2(即045033~045035地址段的数据);111./system/user/c2.xxx:112.map1(原super分区中待更新数据的地址):起始地址addressstart:024036(相对于system起始地址的偏移量);偏移量大小size:4(即024036~024040地址段的数据)113.map2(cow文件中存储的更新数据的地址):起始地址addressstart:045036(相对于cow文件存储的起始地址的偏移量);偏移量大小size:4(即045036~045040地址段的数据);114.文件名后的数值(045033~045035以及045036~045040)分别为cow文件(system_b-cow-img.img.0000)中最新版的/system/app/a2.xxx以及/system/user/c2.xxx在用户数据分区(userdata)的物理保存地址(块地址)。115.这样,如果使用地址045033~045035上的a2.xxx替换掉地址024018~024020上的a2.xxx,并且,使用地址045036~045040上的c2.xxx替换掉地址024036~024040上的c2.xxx,就可以完成动态分区(super)的system子分区的数据升级。116.进一步的,在s230中,在将cow文件写入用户数据分区(userdata)后,还需要对动态分区(super) cow文件进行整体校验,校验动态分区(super) cow文件的有效性,验证当前版本的动态分区(super)数据 cow文件的合成结果是否为新版本的动态分区(super)数据。117.具体的,以从1.1版本升级到1.3版本为例,计算动态分区(super)中不需要升级的数据(从版本1.1到版本1.2未发生变化的数据)与cow文件中升级数据(从版本1.1到版本1.2需要升级的数据)的合成结果的哈希值,判断该哈希值与1.3版本中动态分区(super)的完整数据的哈希值是否一致,如果一致,则说明cow文件有效;如果不一致,则说明cow文件无效,升级失败,中断升级进程并报错;其中,1.3版本中动态分区(super)的完整数据的哈希值被保存在操作系统升级安装包中。118.具体的,在校验过程中,基于snapshot合并动态分区(super) cow文件。在snapshot的实现过程中,动态分区(super)与cow文件的合并并不是物理意义上的合并,而是将动态分区(super)中子分区的文件地图与cow文件自身的cow文件地图进行合并,生成新版本的子分区数据的文件地图。119.例如,将system子分区的文件地图:120./system/app/a0.xxx:024010~024013;121./system/app/a1.xxx:024014~024017;122./system/app/a2.xxx:024018~024020;123./system/b0.xxx:024021~024026;124./system/b1.xxx:024027~024028;125./system/user/c0.xxx:024029~024032;126./system/user/c1.xxx:024033~024035;127./system/user/c2.xxx:024036~024040;128./system/user/c3.xxx:024041~024044。129.与cow文件地图:130./system/app/a2.xxx:045033~045035;131./system/user/c2.xxx:045036~045040。132.合并。则得到system子分区的新版本的文件地图:133./system/app/a0.xxx:024010~024013;134.(指向动态分区(super)中/system/app下的a0.xxx)135./system/app/a1.xxx:024014~024017;136.(指向动态分区(super)中/system/app下的a1.xxx)137./system/app/a2.xxx:045033~045035;138.(指向用户数据分区(userdata)中/update/system_b-cow-img.img.0000中的a2.xxx)139./system/b0.xxx:024021~024026;140.(指向动态分区(super)中/system下的b0.xxx)141./system/b1.xxx:024027~024028;142.(指向动态分区(super)中/system下的b1.xxx)143./system/user/c0.xxx:024029~024032;144.(指向动态分区(super)中/system/user下的c0.xxx)145./system/user/c1.xxx:024033~024035;146.(指向动态分区(super)中/system/user下的c1.xxx)147./system/user/c2.xxx:045036~045040;148.(指向用户数据分区(userdata)中/update/system_b-cow-img.img.0000中的c2.xxx)149./system/user/c3.xxx:024041~024044。150.(指向动态分区(super)中/system/user下的c3.xxx)151.在新版本的system子分区的文件地图中,/system/app/a2.xxx的保存地址并不是指向存储器上动态分区(super)上的/system/app/a2.xxx,而是指向存储器上用户数据分区(userdata)中system_b-cow-img.img.0000中的a2.xxx;/system/user/c2.xxx的保存地址并不是指向存储器上动态分区(super)上的/system/user/c2.xxx,而是指向存储器上用户数据分区(userdata)中system_b-cow-img.img.0000中的c2.xxx。152.在校验过程中,按照上述合成方式,获取动态分区(super)的所有子分区的新版本的文件地图(如果用户数据分区(userdata)中并未写入某个子分区的对应cow文件,则直接以该子分区的文件地图为新版本的文件地图)。将所有子分区的新版本的文件地图组合生成动态分区(super)的新版本的文件系统。153.基于动态分区(super)的新版本的文件系统读取数据,读取动态分区(super)的新版本的文件系统所包含的所有文件并计算哈希值。154.在cow文件成功写入到用户数据分区(userdata)后,将基础分区(common)的元数据分区(/metadata)中的落盘状态信息由“已落盘(merged)”改为“未落盘(waitformerge)”。落盘状态信息用于表示当前是否存在需要落盘到动态分区(super)的cow文件。具体的,落盘状态信息包含针对动态分区(super)的整体标识以及针对每个子分区的子分区标识。当整体标识为“已落盘(merged)”时,代表动态分区(super)的所有子分区均不需要进行落盘操作;当整体标识为“未落盘(waitformerge)”时,代表动态分区(super)的一个或多个子分区需要进行落盘操作;当子分区标识为“已落盘(merged)”时,代表该子分区不需要进行落盘操作;当子分区标识为“未落盘(waitformerge)”时,代表该子分区需要进行落盘操作。155.s231,将设备的启动顺序由可从静态分区(a)启动变更为可从静态分区(b)启动。156.例如,改写主引导记录(masterbootrecord,mbr)的启动顺序标识,将启动顺序标识由a改写为b。在设备上电后,当设备读取到启动顺序标识为a,设备从静态分区(a)启动,启动过程中加载静态分区(a);当设备读取到启动顺序标识为b,设备从静态分区(b)启动,启动过程中加载静态分区(b)。157.s232,设备重启。退出当前的操作系统,切断设备电源,再次开启设备电源。158.s240,设备依次加载基础分区(common)、静态分区(b)。159.s241,设备加载动态分区(super)以及用户数据分区(userdata)的虚拟动态分区。160.具体的,设备读取元数据(/metadata)中的落盘状态信息,基于落盘状态信息确定是否需要从用户数据分区(userdata)的指定路径中检索cow文件,并采用snapshot合并加载动态分区(super)以及cow文件。161.进一步的,在s241中,设备并不加载动态分区(super)以及用户数据分区(userdata)中的全部cow文件,而是根据操作系统运行需求加载对应的文件。具体的,在s241中,设备根据操作系统运行需求确定需要加载的文件,基于snapshot从动态分区(super)或虚拟动态分区中的cow文件中提取对应的文件进行加载。162.具体的,在s241中,当动态分区(super)的子分区首存在对应的cow文件时,先基于snapshot生成动态分区(super)各个子分区的新版本的文件地图。生成新版本的文件地图的过程可以参照s230。设备根据操作系统运行需求确定需要加载的文件,基于动态分区(super)子分区的新版本的文件地图进行文件加载。163.例如,操作系统运行需求加载system子分区下目录user(/system/user)中的所有数据。设备读取元数据(/metadata)中的落盘状态信息,落盘状态信息中system子分区的子分区标识为“未落盘(waitformerge)”,因此,设备在用户数据分区(userdata)中/update下搜索cow文件,在update下搜索到cow文件system_b-cow-img.img.0000后,基于snapshot,根据system_b-cow-img.img.0000中的cow文件的文件地图生成system子分区的新版本的文件地图。按照system子分区的新版本的文件地图中/system/user下所有文件的保存地址进行数据加载,例如,根据system子分区的新版本的文件地图中:164./system/user/c0.xxx:024029~024032;165./system/user/c1.xxx:024033~024035;166./system/user/c2.xxx:045036~045040;167./system/user/c3.xxx:024041~024044。168.加载地址024029~024032处的c0.xxx、地址024033~024035处的c1.xxx、地址045036~045040处的c2.xxx以及地址024041~024044处的c3.xxx。169.进一步的,在加载system子分区下目录user(/system/user)中的所有数据时,当落盘状态信息中system子分区的子分区标识为“已落盘(merged)”时,设备就不会在用户数据分区(userdata)中/update下搜索cow文件,而是直接加载system子分区下目录user(/system/user)中的所有数据。170.进一步的,在加载system子分区下目录user(/system/user)中的所有数据时,当落盘状态信息中system子分区的子分区标识为“未落盘(waitformerge)”时,如果设备在用户数据分区(userdata)中/update下未搜索到对应system子分区的cow文件时,则说明升级过程中数据写入错误(cow文件写入错误或者落盘状态信息写入错误),此时设备回滚系统并报错。171.进一步的,在s241中,在加载文件之前,设备还需要对加载文件进行校验。不同于s230,在s241中,不对动态分区(super) cow文件进行整体验证,而是仅对需要加载的文件进行验证。例如,基于dmverity进行校验(dm-verity是dm(devicemapper)的一个目标(target),是一个虚拟块设备,专门用于文件系统的校验)。校验成功则加载文件,校验失败则重启设备,回滚系统或者尝试再次加载文件。172.s250,设备成功启动,进入用户交互界面。173.s251,设备将虚拟动态分区的数据落盘到动态分区(super)。174.在本技术说明书的描述中,落盘操作指的是,在操作系统升级过程中,将用户数据分区(userdata)上虚拟动态分区中保存的动态分区(super)升级文件(cow文件)写入到动态分区(super)中,使得动态分区(super)的文件完成数据升级,以便设备在下次启动时不需要加载动态分区(super)和虚拟动态分区,只需加载动态分区(super)就可以完成设备启动。175.具体的,设备在启动成功后进行开机广播,开机广播后开启升级进程。升级进程读取基础分区(common)的元数据(/metadata)中的落盘状态信息,如果落盘状态信息为“已落盘(merged)”,则设备进入正常运行模式。176.如果落盘状态信息为“未落盘(waitformerge)”,升级进程将用户数据分区(userdata)中的cow文件落盘到动态分区(super)中。177.具体的,升级进程将用户数据分区(userdata)中的cow文件中的升级数据写入到动态分区(super)中的对应地址上,使得动态分区(super)中的全部数据均为升级后的新版本的数据。178.例如,基于system子分区的文件地图中的/system/app/a2.xxx:024018~024020以及cow文件地图中的/system/app/a2.xxx:045033~045035,将地址045033~045035上的数据写入到地址024014~024017上;基于system子分区的文件地图中的/system/user/c2.xxx:024036~024040以及cow文件地图中的/system/user/c2.xxx:045036~045040,将地址045036~045040上的数据写入到地址024036~024040上。179.在此之后升级进程删除用户数据分区(userdata)中的cow文件,将存储空间归还给用户数据分区(userdata);并且,将基础分区(common)的元数据(/metadata)中的落盘状态信息由“未落盘(waitformerge)”改为“已落盘(merged)”。180.在s220中,静态分区升级的数据操作是针对静态分区(b)中的操作系统数据的,其并不会影响到当前启动的静态分区(a)的操作系统数据;并且,在s230中,动态分区升级的数据操作是在用户数据分区(userdata)中所创建的虚拟动态分区上完成的,其并不会影响到当前挂载的动态分区(super)。因此,在整个操作系统升级的过程中,用户可以正常使用设备;并且,在s231完成后,设备并不需要立即重启,可以由用户自行选择重启时机;这样,操作系统的升级过程并不会对用户的正常手机操作产生影响,从而大大提高了用户体验。进一步的,针对动态分区(super),仅在需要进行升级时才会在用户数据分区(userdata)上创建虚拟动态分区,因此有效提高了数据存储空间利用率。181.具体的,图2b为根据本技术一实施例的手机运行界面示意图。当手机顺利启动操作系统后,进入如图2b中201所示的系统界面。手机执行s200~s231,手机的显示界面可以为图2b中202所示的界面,从而向用户展示操作系统升级进度。s200~s231可以在系统后台运行,用户在手机运行s200~s231是可以切换至201所示的系统界面,打开其他应用;或者,用户在手机运行s200~s231是可以切换至系统正在运行的其他应用的应用界面,例如,204所示的聊天应用界面。182.在s232中,当手机需要重启时,手机向用户输出重启提示,由用户确认是否立即重启。例如,手机当前展示如图2b中202所示的界面,向用户展示操作系统升级进度。当需要重启时,手机展示如图2b中203所示的界面,由用户确认立即重启或是稍后重启。又例如,手机当前展示如图2b中204所示的界面,用户使用聊天应用。当需要重启时,手机展示如图2b中205所示的界面,弹出提示通知。用户点击提示通知,进入如图2b中203所示的界面,由用户确认立即重启或是稍后重启。或者,用户打开下拉通知栏,手机展示如图2b中206所示的界面。在下拉通知栏中,用户点击提示通知,进入如图2b中203所示的界面,由用户确认立即重启或是稍后重启。183.在实际应用场景中,在s220的执行过程中,存在s220执行失败(静态分区(b)的数据升级失败)的情况。针对该情况,设备会中断整个操作系统升级操作,向用户输出升级失败提示信息(例如,显示升级失败的对话框),自动重新升级或者由用户确定是否重新升级或放弃升级。184.具体的,图2c为根据本技术一实施例的手机运行界面示意图。例如,在s220的执行过程中,如果s220执行失败,手机展示如图2c中206或207所示的界面,由用户确认放弃本次升级(更新)或是重新升级(更新)。185.例如,手机当前展示如图2b中202所示的界面,向用户展示操作系统升级进度。如果s220执行失败,手机展示如图2c中209所示的界面,由用户确认放弃本次升级(更新)或是重新升级(更新)。又例如,手机当前展示如图2b中204所示的界面,用户使用聊天应用。如果s220执行失败,手机展示如图2c中207所示的界面,弹出提示通知“本次系统安装失败”。用户点击提示通知,进入如图2c中209所示的界面,由用户确认放弃安装(升级)或是重新安装(升级)升级。或者,用户打开下拉通知栏,手机展示如图2c中208所示的界面。在下拉通知栏中,用户点击提示通知,进入如图2c中209所示的界面,由用户确认放弃安装(升级)或是重新安装(升级)升级。186.为检测s220中是否存在静态分区升级失败的情况,在s220中,会对数据写入后的静态分区(b)进行数据校验以确认静态分区数据是否成功写入。187.例如,在一应用场景中,版本1.1升级到版本1.2的系统升级安装包包含版本1.2的静态分区的全量数据以及版本1.2的静态分区的全量数据的哈希值。设备将版本1.2的静态分区的全量数据覆写到静态分区(b)中。数据写入之后,设备计算静态分区(b)中数据的哈希值,校验静态分区(b)中数据的哈希值与版本1.1升级到版本1.2的系统升级安装包中版本1.2的静态分区的全量数据的哈希值是否一致。如果一致,则说明数据写入成功,可以进行后续的操作系统升级操作;如果不一致,则说明数据写入失败,升级失败。188.又例如,在一应用场景中,版本1.1升级到版本1.2的系统升级安装包包含版本1.1升级到版本1.2的静态分区的差分数据、版本1.1的静态分区的全量数据的哈希值以及版本1.2的静态分区的全量数据的哈希值。189.设备在向静态分区(b)写入数据之前,首先计算静态分区(a)中数据的哈希值,校验静态分区(a)中数据的哈希值与版本1.1升级到版本1.2的系统升级安装包中版本1.1的静态分区的全量数据的哈希值是否一致,如果一致,则说明当前静态分区(a)中数据为版本1.1的静态分区数据,版本1.1升级到版本1.2的静态分区的差分数据可用;如果不一致,则版本1.1升级到版本1.2的静态分区的差分数据不可用,升级失败。190.在设备确定版本1.1升级到版本1.2的静态分区的差分数据可用后,读取静态分区(a)中数据,使用版本1.1升级到版本1.2的静态分区的差分数据以及静态分区(a)中数据执行还原得到版本1.2的静态分区的全量数据,将版本1.2的静态分区的全量数据覆写到静态分区(b)中。数据写入之后,设备计算静态分区(b)中数据的哈希值,校验静态分区(b)中数据的哈希值与版本1.1升级到版本1.2的系统升级安装包中版本1.2的静态分区的全量数据的哈希值是否一致。如果一致,则说明数据写入成功,可以进行后续的操作系统升级操作;如果不一致,则说明数据写入失败,升级失败。191.以一个静态分区的子分区boot为例,在一应用场景中,版本1.1升级到版本1.2的系统升级安装包包含下述数据:192.name:boot(分区名称,表示当前数据为指向静态分区的子分区boot的升级数据)193.start:12222(相对于升级包数据块的数据块起始地址,表示静态分区的子分区boot的升级数据(差分数据delta1)的起始位置为12222)194.size:2410(数据大小,表示静态分区的子分区boot的升级数据(差分数据delta1)的大小为2410)195.原hash值:hash11(版本1.1的静态分区的子分区boot的数据的哈希值)196.镜像目标hash值:hash12(版本1.2的静态分区的子分区boot的数据的哈希值)197.差分数据delta:delta1(版本1.1升级到版本1.2的静态分区的差分数据)198.在s220中,设备通过common分区中的misc分区读取设备的固定挂载路径,如/dev/block/by-name/misc。从ufs器件中读取卡槽位(slot-b),替换得到个子分区路径,如/dev/block/by-name/boot_b。199.继续以子分区boot为例,设备首先计算/dev/block/by-name/boot_a下数据的哈希值,校验/dev/block/by-name/boot_a下数据的哈希值与哈希值hash11是否一致,如果一致,则delta1可用,如果不一致,则升级操作失败。200.当/dev/block/by-name/boot_a下数据的哈希值与哈希值hash11一致时,设备基于start:12222以及size:2410读取delta1,使用delta1与/dev/block/by-name/boot_a下数据执行还原得到版本1.2的静态分区的子分区boot的全量数据。设备将版本1.2的静态分区的子分区boot的全量数据写到/dev/block/by-name/boot_b下。201.数据写入后,设备计算/dev/block/by-name/boot_b下数据的哈希值,校验/dev/block/by-name/boot_b下数据的哈希值与哈希值hash12是否一致,如果一致,则静态分区的子分区boot升级成功,可以针对下一个静态分区子分区进行升级;如果不一致,则升级操作失败。202.在一应用场景中,设备根据系统升级安装包所包含的静态分区子分区升级数据对静态分区的子分区进行升级,具体的,如果系统升级安装包包含某个静态分区子分区升级数据,则按照上述boot子分区的升级流程对该静态分区(b)中的该子分区进行升级,如果系统升级安装包不包含某个静态分区子分区升级数据,则将静态分区(a)中该子分区的数据直接同步到静态分区(b)中该子分区中。在升级过程中,当一个子分区出现升级错误,哈希校验失败,则中断升级操作,升级失败;当所有子分区升级成功,则静态分区升级成功,可以执行后续步骤。203.一般的,当某个静态分区(静态分区(a)或静态分区(b))升级失败时,静态分区的数据无法用于顺利启动操作系统,为了避免在操作系统启动过程中加载升级失败的静态分区而导致操作系统启动错误,在一应用场景中,静态分区具备对应的状态标记(可启动或不可启动)。设备在加载静态分区数据之前首先读取静态分区状态标记,仅当静态分区的状态标记为可启动时才加载静态分区的数据。在升级静态分区的数据之前,会将静态分区标记为不可启动,在静态分区的数据升级成功后再将静态分区标记为可启动,这样,如果静态分区升级失败,则静态分区的状态会保持在不可启动。设备就不会加载升级失败的静态分区的数据。204.例如,在一应用场景中,在s220中,在升级静态分区(b)的数据之前,标记静态分区(b)为不可启动。具体的,静态分区的状态标记可以保存在common分区。在s220中,在升级静态分区(b)的数据之前,将common分区中静态分区的状态标记中slot-b标记为不可启动(unbootable)。205.当s220成功执行(所有的哈希校验均成功时)后,在设备重启(s232)之前,标记静态分区(b)为可启动。例如,在s220之后,在s230之前,将common分区中静态分区的状态标记中slot-b标记为可启动(bootable);或者,在s231中,将common分区中静态分区的状态标记中slot-b标记为bootable。206.在一个静态分区被标记为不可启动后,设备在启动操作系统的过程中不会加载该静态分区的数据。然而,在一个静态分区被标记为不可启动后,存在另一个静态分区出现数据错误无法启动操作系统的情况,此时两个静态分区均无法启动操作系统,设备无法顺利启动。207.例如,在s220中,在升级静态分区(b)的数据之前,common分区中静态分区的状态标记中slot-b被标记为unbootable。在之后的针对静态分区(b)的数据写入过程中,出现数据写入错误,哈希校验失败,操作系统升级失败,common分区中静态分区的状态标记中slot-b保持在unbootable。假如此时静态分区(a)中的数据出现错误(例如,硬件存储物理损坏、存储位bit跳变),设备重启后无法通过加载静态分区(a)来顺利启动操作系统;并且,由于common分区中静态分区的状态标记中slot-b为unbootable,设备也无法加载静态分区(b)启动操作系统,这就使得设备无法顺利启动。208.针对上述问题,本技术一实施例提出了一种操作系统数据调配方法,在某个静态分区升级失败后,重置该静态分区的状态标记并回滚该静态分区的数据,以使得设备可以通过加载该静态分区的数据顺利启动操作系统。209.图3a所示为根据本技术一实施例的操作系统数据调配流程图。当s220执行失败(静态分区(b)的数据升级失败)时,例如,静态分区数据写入失败(出现哈希校验失败),在s220后,设备执行如图3a所示的下述流程:210.s310,将静态分区(b)的状态标记设置为bootable;211.具体的,将common分区中静态分区的状态标记中slot-b标记为bootable。212.s320,将静态分区(a)的数据同步到静态分区(b)。213.根据图3a所示实施例的方法,可以在静态分区(b)升级失败时确保设备后续可以从静态分区(b)顺利启动操作系统,从而大大提高操作系统启动的成功率,确保设备稳定运行,提高用户的设备使用体验。214.进一步的,s310以及s320的执行并不会影响到当前启动的静态分区(a)的操作系统数据。因此,s310以及s320的执行过程中,用户可以正常使用设备;s310以及s320可以后台执行,并不会对用户的正常手机操作产生影响,从而大大提高了用户体验。215.进一步的,本技术对s320的具体实现方式不做具体限制,本领域的技术人员可以采用多种可行的实现方式实现s320。216.例如,图3b所示为根据本技术一实施例进行操作系统升级的部分流程图。设备执行如图3b所示的下述流程以实现s320。217.s1800,读取设备存储器上与分区表相关的描述数据(该参数在设备出厂时预存在设备中),合成存储器的总分区表。218.例如,以采用主引导记录(masterbootrecord,mbr)格式的通用闪存(universalflashstorage,ufs)。从ufs的mbr(主引导扇区,ufs的第一个扇区,即c/h/s地址的0柱面0磁头1扇区)中读取ufs上各个分区的大小及位置信息,获取分区表(dpt)。219.s1810,从总分区表中读取后缀名为_b的所有静态子分区,生成用于描述静态分区(b)各个子分区的列表1,列表1包括静态分区(b)中各个子分区的名称以及地址。例如:220.编号子分区名称子分区地址(文件路径)被选定状态1bootloader_b/dev/block/by-name/bootloader_b02boot_b/dev/block/by-name/boot_b03vendor_boot_b/dev/block/by-name/vendor_boot_b04dtbo_b/dev/block/by-name/dtbo_b05vbmeta_b/dev/block/by-name/vbmeta_b0221.表1222.s1820,从总分区表中读取后缀名为_a的所有静态子分区,生成用于描述静态分区(a)各个子分区的列表2,列表2包括静态分区(a)中各个子分区的名称以及地址。223.例如:224.编号子分区名称子分区地址(文件路径)1bootloader_a/dev/block/by-name/bootloader_a2boot_a/dev/block/by-name/boot_a3vendor_boot_a/dev/block/by-name/vendor_boot_a4dtbo_a/dev/block/by-name/dtbo_a5vbmeta_a/dev/block/by-name/vbmeta_a225.表2226.这里需要说明的是,在表1以及表2中,以文件路径的方式指代该子分区的地址,在实际应用场景中,本领域的技术人员可以使用多种不同的方式描述子分区的地址。例如,采用线性地址描述。227.s1830,在列表1中选定一个未被选定过的子分区(第一子分区),获取该子分区的名称(第一子分区名称)以及地址(第一文件路径)。228.具体的,在s1830之前,列表1中的子分区均未被选定。在s1830中,可以按照列表1中子分区的排列顺序(编号顺序)依次选定子分区,也可以从所有未被选定过的子分区中随机选定。229.进一步的,在选定一个子分区后,标记该子分区以便在后续确认该子分区是否被选定过。例如,如表1所示,在表1中增加被选定状态列,被选定状态的初始值为0,如子分区被选定,则被选定状态修改为1。230.s1840,将s1830中选定的子分区与列表2中的各个子分区做去后缀匹配;确定列表2中,去掉后缀后,与s1830中选定的子分区名称一致的子分区(第二子分区名称)以及在列表2中,该第二子分区名称对应的子分区地址(第二文件路径);231.s1841,读取第一文件路径下的数据;232.s1842,将读取到的数据覆写到第二文件路径下。233.s1850,判断列表1中是否还存在未被选定过的子分区;234.如果存在,返回步骤s1830,重新选定第一子分区;235.如果不存在,静态分区同步结束。236.以表1以及表2为例,在一应用场景中,设备执行下述流程:237.选定表1中被选定状态为0的第一个子分区(编号1的bootloader_b子分区),将编号1的被选定状态修改为1;238.使用bootloader_b在表2中的所有子分区名称中做去后缀匹配,bootloader_a与bootloader_b在分别去掉_a以及_b后一致,因此,根据bootloader_b匹配到bootloader_a(第二子分区);239.从表1中读取到bootloader_b对应的文件路径/dev/block/by-name/bootloader_b(第一文件路径);240.从表2中读取到bootloader_a对应的文件路径/dev/block/by-name/bootloader_a(第二文件路径);241.读取/dev/block/by-name/bootloader_b下的数据,将读取到的数据覆写到/dev/block/by-name/bootloader_a;242.表1中仍存在被选定状态为0的子分区,选定表1中被选定状态为0的第一个子分区(编号2的boot_b子分区),将编号2的被选定状态修改为1;243.使用boot_b在表2中的所有子分区名称中做去后缀匹配,boot_a与boot_b在分别去掉_a以及_b后一致,因此,根据boot_b匹配到boot_a;244.从表1中读取到boot_b对应的文件路径/dev/block/by-name/boot_b;245.从表2中读取到boot_a对应的文件路径/dev/block/by-name/boot_a;246.读取/dev/block/by-name/boot_b下的数据,将读取到的数据覆写到/dev/block/by-name/boot_a;247.表1中仍存在被选定状态为0的子分区,选定表1中被选定状态为0的第一个子分区(编号3的vendor_boot_b子分区),将编号3的被选定状态修改为1;248.使用vendor_boot_b在表2中的所有子分区名称中做去后缀匹配,vendor_boot_a与vendor_boot_b在分别去掉_a以及_b后一致,因此,根据vendor_boot_b匹配到vendor_boot_a;249.从表1中读取到vendor_boot_b对应的文件路径/dev/block/by-name/vendor_boot_b;250.从表2中读取到vendor_boot_a对应的文件路径/dev/block/by-name/vendor_boot_a;251.读取/dev/block/by-name/vendor_boot_b下的数据,将读取到的数据覆写到/dev/block/by-name/vendor_boot_a;252.表1中仍存在被选定状态为0的子分区,选定表1中被选定状态为0的第一个子分区(编号4的dtbo_b子分区),将编号4的被选定状态修改为1;253.使用dtbo_b在表2中的所有子分区名称中做去后缀匹配,dtbo_a与dtbo_b在分别去掉_a以及_b后一致,因此,根据dtbo_b匹配到dtbo_a;254.从表1中读取到dtbo_b对应的文件路径/dev/block/by-name/dtbo_b;255.从表2中读取到vendor_boot_a对应的文件路径/dev/block/by-name/dtbo_a;256.读取/dev/block/by-name/dtbo_b下的数据,将读取到的数据覆写到/dev/block/by-name/dtbo_a;257.表1中仍存在被选定状态为0的子分区,选定表1中被选定状态为0的第一个子分区(编号5的vbmeta_b子分区),将编号5的被选定状态修改为1;258.使用vbmeta_b在表2中的所有子分区名称中做去后缀匹配,vbmeta_a与vbmeta_b在分别去掉_a以及_b后一致,因此,根据vbmeta_b匹配到vbmeta_a;259.从表1中读取到vbmeta_b对应的文件路径/dev/block/by-name/vbmeta_b;260.从表2中读取到vendor_boot_a对应的文件路径/dev/block/by-name/vbmeta_a;261.读取/dev/block/by-name/vbmeta_b下的数据,将读取到的数据覆写到/dev/block/by-name/vbmeta_a;262.表1中不存在被选定状态为0的子分区,静态分区同步完成。263.进一步的,s310以及s320可以在s220之后执行,本技术对s310以及s320的具体执行时机并不做具体限制。264.例如,在一应用场景中,在s220执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框,如图2c的206或207所示)。在设备中断整个操作系统升级操作后,设备执行s310以及s320;在s310以及s320之后,设备向用户输出升级失败提示。265.又例如,在一应用场景中,在s220执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框),之后设备自动重新升级或者由用户确定是否重新升级或放弃升级。在设备向用户输出升级失败提示之后,设备执行s310以及s320;在s310以及s320之后,设备自动重新升级或者由用户确定是否重新升级或放弃升级。266.进一步的,s310以及s320在s220之后执行,并不意味着s310以及s320必须被执行。本技术对s310以及s320的触发条件并不做具体限制。267.例如,在一应用场景中,在s220执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框),之后设备自动重新升级。由于设备的重新升级会将静态分区(b)的状态标记由unbootable并向静态分区(b)写入数据,s310以及s320的执行结果会被设备的重新升级操作刷新,因此,在此状态下设备不执行s310以及s320。268.又例如,在一应用场景中,在s220执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框),之后设备放弃升级。在设备放弃升级后,静态分区(b)的状态标记以及静态分区(b)中的数据会维持。因此,在此状态下,设备在中断整个操作系统升级操作后执行s310以及s320;在s310以及s320之后,设备向用户输出升级失败提示。或者,设备在向用户输出升级失败提示后执行s310以及s320。269.又例如,在一应用场景中,在s220执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框),之后设备向用户请求确认是否重新升级或放弃升级。当用户确认重新升级时,设备不执行s310以及s320,重新执行升级;当用户确认放弃升级时,设备执行s310以及s320。270.在实际应用场景中,在s230的执行过程中,存在s230执行失败的情况(动态分区升级数据写入失败)。针对该情况,设备会中断整个操作系统升级操作,向用户输出升级失败提示信息(升级失败提示信息的输出方式可以参照图2c所示),自动重新升级或者由用户确定是否重新升级或放弃升级。271.具体的,当用户数据分区(userdata)的存储空间不足时会导致s230执行失败。在s230中,在设备根据操作系统升级安装包在用户数据分区(userdata)创建虚拟动态分区的过程中,虚拟动态分区的大小是由操作系统升级安装包中版本1.2的动态分区的数据的大小决定的。当用户数据分区(userdata)上的空余空间不足以创建虚拟动态分区时,s230执行失败。272.例如,在一应用场景中,设备从操作系统升级安装包中提取cow文件并将cow文件写入用户数据分区(userdata)的update文件夹中。操作系统升级安装包中包含cow文件内容以及cow文件大小。在s230中,设备首先根据操作系统升级安装包中的cow文件名称以及cow文件大小在用户数据分区(userdata)的update文件夹下创建空cow文件,然后从操作系统升级安装包中提取cow文件数据写入空cow文件。273.以system子分区为例,在操作系统升级安装包中,针对system子分区的cow文件被命名为system-cow-img.img.0000,system-cow-img.img.0000的大小为xxxx。设备在用户数据分区(userdata)的update文件夹下创建system_b-cow文件,system_b-cow文件的大小为xxxx,内容为空。在system_b-cow文件创建完成后,设备就可以从系统升级安装包中提取system-cow-img.img.0000,写入system_b-cow并改名为system_b-cow-img.img.0000。274.设备在用户数据分区(userdata)的update文件夹下依次创建空cow文件system_b-cow、system_ext_b-cow、vendor_b-cow、product_b-cow、cust_b-cow、odm_b-cow。当所有的空cow文件创建完成后,设备就可以从系统升级安装包中提取cow文件数据,写入空cow文件并改名。275.最终用户数据分区(userdata)的update文件夹中包含下述文件:276.system_b-cow-img.img.0000;277.system_ext_b-cow-img.img.0000;278.vendor_b-cow-img.img.0000;279.product_b-cow-img.img.0000;280.cust_b-cow-img.img.0000;281.odm_b-cow-img.img.0000。282.在创建空cow文件的过程中,设备每次创建一个空cow文件,在一个空cow文件创建成功后创建下一个。在此过程中,当一个空cow文件创建失败,则说明用户数据分区(userdata)的存储空间不足,s230执行失败,操作系统升级失败。283.进一步的,在s230中,cow文件的提取失败也会导致s230执行失败。具体的,在操作系统升级安装包中,以二进制代码形式保存cow文件,在将cow文件写入用户数据分区(userdata)时,首先需要从操作系统升级安装包中提取cow文件,将cow文件打开,将cow文件数据写入到用户数据分区(userdata)。在上述过程中,如果操作系统升级安装包存在数据错误,cow文件无法提取或打开,则s230执行失败,操作系统升级失败。284.进一步的,在s230中,cow文件的写入失败也会导致s230执行失败。为检测cow文件写入是否成功,在s230中,在将cow文件写入用户数据分区(userdata)后,还需要对动态分区(super) cow文件进行整体校验,校验动态分区(super) cow文件的有效性,验证当前版本的动态分区(super)数据 cow文件的合成结果是否为新版本的动态分区(super)数据。285.具体的,以从1.1版本升级到1.3版本为例,计算动态分区(super)中不需要升级的数据(从版本1.1到版本1.2未发生变化的数据)与cow文件中升级数据(从版本1.1到版本1.2需要升级的数据)的合成结果的哈希值,判断该哈希值与1.3版本中动态分区(super)的完整数据的哈希值是否一致,如果一致,则说明cow文件有效;如果不一致,则说明cow文件无效,升级失败,中断升级进程并报错;其中,1.3版本中动态分区(super)的完整数据的哈希值被保存在操作系统升级安装包中。286.具体的,在校验过程中,基于snapshot合并动态分区(super) cow文件。在snapshot的实现过程中,动态分区(super)与cow文件的合并并不是物理意义上的合并,而是将system子分区的整体文件地图与cow文件自身的cow文件地图进行合并,生成新版本的子分区数据的文件地图。287.例如,将system子分区的文件地图:288./system/app/a0.xxx:024010~024013;289./system/app/a1.xxx:024014~024017;290./system/app/a2.xxx:024018~024020;291./system/b0.xxx:024021~024026;292./system/b1.xxx:024027~024028;293./system/user/c0.xxx:024029~024032;294./system/user/c1.xxx:024033~024035;295./system/user/c2.xxx:024036~024040;296./system/user/c3.xxx:024041~024044。297.与cow文件地图:298./system/app/a2.xxx:045033~045035;299./system/user/c2.xxx:045036~045040。300.合并。则得到system子分区的新版本的文件地图:301./system/app/a0.xxx:024010~024013;302.(指向动态分区(super)中/system/app下的a0.xxx)303./system/app/a1.xxx:024014~024017;304.(指向动态分区(super)中/system/app下的a1.xxx)305./system/app/a2.xxx:045033~045035;306.(指向用户数据分区(userdata)中/update/system_b-cow-img.img.0000中的a2.xxx)307./system/b0.xxx:024021~024026;308.(指向动态分区(super)中/system下的b0.xxx)309./system/b1.xxx:024027~024028;310.(指向动态分区(super)中/system下的b1.xxx)311./system/user/c0.xxx:024029~024032;312.(指向动态分区(super)中/system/user下的c0.xxx)313./system/user/c1.xxx:024033~024035;314.(指向动态分区(super)中/system/user下的c1.xxx)315./system/user/c2.xxx:045036~045040;316.(指向用户数据分区(userdata)中/update/system_b-cow-img.img.0000中的c2.xxx)317./system/user/c3.xxx:024041~024044。318.(指向动态分区(super)中/system/user下的c3.xxx)319.在新版本的system子分区的文件地图中,/system/app/a2.xxx的保存地址并不是指向存储器上动态分区(super)上的/system/app/a2.xxx,而是指向存储器上用户数据分区(userdata)中system_b-cow-img.img.0000中的a2.xxx;/system/user/c2.xxx的保存地址并不是指向存储器上动态分区(super)上的/system/user/c2.xxx,而是指向存储器上用户数据分区(userdata)中system_b-cow-img.img.0000中的c2.xxx。320.在校验过程中,按照上述合成方式,获取动态分区(super)的所有子分区的新版本的文件地图(如果用户数据分区(userdata)中并未写入某个子分区的对应cow文件,则直接以该子分区的文件地图为新版本的文件地图)。将所有子分区的新版本的文件地图组合生成动态分区(super)的新版本的文件系统。321.基于动态分区(super)的新版本的文件系统读取数据,读取动态分区(super)的新版本的文件系统所包含的所有文件并计算哈希值。322.一般的,由于在升级动态分区(super)时,采用的是将cow文件写入用户数据分区(userdata)的方式,在落盘前,动态分区(super)的各个子分区的数据并未被改写。并且,s230是在s220成功执行(静态分区(b)升级成功)后执行的,s220成功执行(静态分区(b)升级成功)后,静态分区(b)上的数据是可以顺利加载的。因此,理论上,在s230执行失败时,如果静态分区(b)的状态标记被设置为bootable(执行s310),设备就可以从静态分区(b)启动操作系统。323.例如,设备在s220成功执行(静态分区(b)升级成功)后,在s230前执行s310;之后执行s230,当s230执行失败(动态分区升级失败)后,设备中断整个操作系统升级操作。设备向用户输出升级失败提示信息。324.又例如,设备在s220成功执行(静态分区(b)升级成功)后,执行s230,当s230执行失败(动态分区升级失败)后,设备中断整个操作系统升级操作。设备执行s310,并且,向用户输出升级失败提示信息。325.进一步的,在s220成功执行(静态分区(b)升级成功)后,存在升级成功的静态分区(b)与未升级的动态分区(super)不匹配的情况。即,在s230执行失败时,设备加载s220成功执行后的静态分区(b)无法顺利启动操作系统。因此,在s230执行失败后,需要将静态分区(b)的数据回滚到升级前的状态(执行s320),才可以使得设备可以从静态分区(b)启动操作系统。326.例如,设备在s220成功执行(静态分区(b)升级成功)后,在s230前执行s310;当s230执行失败(动态分区升级失败)后,设备中断整个操作系统升级操作。在设备中断整个操作系统升级操作后,执行s320;在s320之后,设备向用户输出升级失败提示信息。或者,设备在s220成功执行(静态分区(b)升级成功)后,执行s230;当s230执行失败(动态分区升级失败)后,设备中断整个操作系统升级操作。在设备中断整个操作系统升级操作后,执行s310以及s320;在s310以及s320之后,设备向用户输出升级失败提示信息。327.又例如,设备在s220成功执行(静态分区(b)升级成功)后,在s230前执行s310;当s230执行失败(动态分区升级失败)后,设备中断整个操作系统升级操作。在设备中断整个操作系统升级操作后,设备向用户输出升级失败提示,在设备向用户输出升级失败提示后,执行s320。或者,设备在s220成功执行(静态分区(b)升级成功)后,执行s230;当s230执行失败(动态分区升级失败)后,设备中断整个操作系统升级操作。在设备中断整个操作系统升级操作后,设备向用户输出升级失败提示;在设备向用户输出升级失败提示后,执行s310以及s320。328.又例如,在一应用场景中,在s230执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框),之后设备自动重新升级。在此状态下设备不执行s310以及s320。329.又例如,在一应用场景中,在s230执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框),之后设备放弃升级。在此状态下,设备在中断整个操作系统升级操作后执行s310以及s320;在s310以及s320之后,设备向用户输出升级失败提示信息。或者,设备在向用户输出升级失败提示信息后执行s310以及s320。330.又例如,在一应用场景中,在s230执行失败后,设备中断整个操作系统升级操作,向用户输出升级失败提示(例如,显示升级失败的对话框),之后设备向用户请求确认是否重新升级或放弃升级。当用户确认重新升级时,设备不执行s310以及s320,重新执行升级;当用户确认放弃升级时,设备执行s310以及s320。331.进一步的,在s230执行失败后,还恢复用户数据分区(userdata),删除用户数据分区(userdata)中已写入的动态分区升级数据。例如,删除用户数据分区(userdata)上创建的空cow文件以及删除已写入的cow文件。332.进一步的,在某些应用场景中,在s230中,设备不仅仅向用户数据分区(userdata)写入cow文件,还会刷新动态分区(super)的metadata中的分区信息。333.具体的,图4所示为一应用场景下设备出厂前进行系统烧录的烧录系统框架结构示意图。在采用虚拟a/b升级方式的安卓系统中,由于只有静态分区采用a/b方案,而动态分区采用升级时构造虚拟动态分区的方案。因此,为了静态分区与动态分区的匹配,如图4所示,在动态分区(super)的头部的元数据(/supermetadata)中,包含对应静态分区(a)的slot0(插槽一数据)以及静态分区(b)的slot1(插槽二数据)。slot0以及slot1用于保存super分区的分区表。334.例如,在ufs的mbr中,设备启动顺序描述中,配置slot0对应从静态分区(a)启动,配置slot1对应从静态分区(b)启动。在设备启动时,根据启动的静态分区的不同,选择从slot0或slot1中的一个中获取super分区的分区信息。例如,在设备由静态分区a启动时,在加载super分区时,设备首先读取slot0,以获取super分区的子分区地址;在设备由静态分区b启动时,在加载super分区时,设备首先读取slot1,以获取super分区的子分区地址。335.具体的,slot0以及slot1中包含多个子分区描述组,每个子分区描述组对应super分区的一个子分区。每个子分区描述组包含:336.名称(name)项,其值为子分区的名称;337.组(group)项,其值为子分区类型;338.属性(attributes)项,其值为分区读写属性,例如,只读属性(readonly);339.地址(extents)项,其值为子分区的地址(例如,分区大小、偏移量)。340.在name项以及group项中,值的后缀为_a,则对应静态分区(a);值的后缀为_b,则对应静态分区(b)。341.在由静态分区a启动,加载super分区时,首先读取slot0。在读取slot0时,由于后缀为_a对应静态分区(a),设备读取slot0中name项和/或group项后缀为_a的分区描述组中extents项的值,以获取super分区的子分区地址。342.在由静态分区b启动,加载super分区时,首先读取slot1。在读取slot1时,由于后缀为_b对应静态分区(b),设备读取slot0中name项和/或group项后缀为_b的分区描述组中extents项的值,以获取super分区的子分区地址。343.在s210所获取的操作系统升级安装包中,包含1.2版本的动态分区(super)的分区信息,在s230中,设备从操作系统升级安装包中提取1.2版本的动态分区(super)的分区信息,使用1.2版本的动态分区(super)的分区信息刷新静态分区(b)所对应的slot1中的分区信息。344.以system子分区为例,假设在s230之前,动态分区(super)的/supermetadata的slot1中包含如下内容:345.metadataversion:10.2(元数据版本)346.metadatasize:1300bytes(元数据数据量)347.metadatamaxsize:65536bytes(元数据最大数据量)348.metadataslotcount:3(元数据插槽数量)349.headerflags:virtual_ab_device(标题标志:虚拟a/b设备)350.partitiontable:‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑(分区表)351.name:system_b352.group:ry_dynamic_partitions_b353.attributes:readonly,updated354.extents:0..6995967linearsuper2048355.在s210所获取的操作系统升级安装包中,1.2版本的动态分区(super)的分区信息包含如下内容:356.name:system357.group:ry_dynamic_partitions358.extents:0..699xxxxlinearsuper2048359.在s230中,设备通过当前需要升级的静态分区为静态分区(b)定位到对应静态分区(b)的动态分区(super)的/supermetadata的slot1,使用1.2版本的动态分区(super)的分区信息刷新slot1中的内容。在s230之后,动态分区(super)的/supermetadata的slot1中包含如下内容:360.metadataversion:10.2361.metadatasize:1300bytes362.metadatamaxsize:65536bytes363.metadataslotcount:3364.headerflags:virtual_ab_device365.partitiontable:‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑366.name:system_b367.group:ry_dynamic_partitions_b368.attributes:readonly,updated369.extents:0..699xxxxlinearsuper2048370.假设s230执行失败,但是,在s230执行失败之前已完成了slot1的内容刷新,那么,s230执行失败时slot1版本就是1.2。这样,如果在s230执行失败后将静态分区(b)的内容回滚到版本1.1,静态分区(b)就与slot1的版本不匹配,设备很有可能无法从静态分区(b)顺利启动操作系统。371.针对上述问题,在本技术一实施例中,在升级动态分区(super)的过程中,在使用操作系统升级安装包中新版本的动态分区(super)的分区信息刷新动态分区(super)的/supermetadata的slot信息之前,备份动态分区(super)的/supermetadata的slot信息。当动态分区(super)升级成功(cow文件写入成功)时,丢弃备份的slot信息;当动态分区(super)升级失败(cow文件写入失败)时,使用备份的slot信息恢复动态分区(super)的/supermetadata的slot信息。372.图5所示为根据本技术一实施例的操作系统数据调配流程图。在s210所获取的操作系统升级安装包中,包含1.2版本的动态分区(super)的分区信息,在s220成功执行之后,设备还执行如下步骤:373.s501,读取动态分区(super)的/supermetadata的slot1信息,备份保存到common分区的metadata中(保存分区备份信息)。例如,保存到/metadata/ota/metadata_backup。374.s502,从操作系统升级安装包中提取1.2版本的动态分区(super)的分区信息(第一分区配置信息);375.s503,使用1.2版本的动态分区(super)的分区信息刷新动态分区(super)的/supermetadata的slot1信息;376.在s503之后,执行s504,在用户数据分区(userdata)写入动态分区(super)的升级数据;s503以及s504的执行参照s230;377.当s504执行成功时,执行s510,丢弃保存在common分区的metadata中的slot1的备份信息(分区备份信息);在s510之后,执行s230之后的后续步骤;378.当s504执行失败时,执行s520,使用保存在common分区的metadata中的slot1的备份信息,恢复动态分区(super)的/supermetadata的slot1;例如,使用保存在common分区的metadata中的slot1的备份信息,覆写动态分区(super)的/supermetadata的slot1中的数据;379.s530,将静态分区(b)的状态标记设置为bootable;380.s540,将静态分区(a)的数据同步到静态分区(b)。381.s530以及s540的执行可以参照s310以及s320。382.根据图5所示实施例的方法,可以在动态分区(super)升级失败时确保设备后续可以从静态分区(b)顺利启动操作系统,从而大大提高操作系统启动的成功率,确保设备稳定运行,提高用户的设备使用体验。383.进一步的,图5所示各个步骤的执行并不会影响到当前加载的静态分区(a)以及动态分区(super)的操作系统数据。因此,图5所示各个步骤的执行过程中,用户可以正常使用设备;图5所示各个步骤可以后台执行,并不会对用户的正常手机操作产生影响,从而大大提高了用户体验。384.可以理解的是,上述实施例中的部分或全部步骤或操作仅是示例,本技术实施例还可以执行其它操作或者各种操作的变形。此外,各个步骤可以按照上述实施例呈现的不同的顺序来执行,并且有可能并非要执行上述实施例中的全部操作。385.进一步的,一般的,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmablelogicdevice,pld)(例如现场可编程门阵列(fieldprogrammablegatearray,fpga))就是这样一种集成电路,其逻辑功能由访问方对器件编程来确定。由设计人员自行编程来把一个数字装置“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logiccompiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardwaredescriptionlanguage,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。386.因此,本技术实施例所提出的方法流程可以以硬件方式实现,例如,使用控制器,控制器控制触摸屏以实现本技术实施例所提出的方法流程。387.控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(applicationspecificintegratedcircuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。388.与上述实施例对应,本技术还提供了一种电子设备。电子设备包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发电子设备执行如本技术实施例所述的方法步骤。389.本技术还提供一种计算机程序产品,计算机程序产品包括计算机程序,当其在计算机上运行时,使得计算机执行本技术实施例提供的部分或全部步骤。390.本领域的技术人员可以清楚地了解到本发明实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。391.本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于装置实施例和终端实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例中的说明即可。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献