张炎高
摘 要 Android最初是由Android Inc.开发的。2005年,谷歌收购了移动操作系统Android并在2007年首次向公众展示。2008年10月,Android正式发布了1.0版本,每个厂商都可以使用这个操作系统。Android作为一个开源操作系统被进一步开发广泛应用与手机、平板电脑和其他嵌入式设备。越来越多的中小企业,采用Android系统来开发产品。产品发布后,增加新功能、修补漏洞,都需要更新固件,随着功能的增加,Android系统的固件也越来越大,小小的修改却要升级整个固件,这不仅浪费网络资源,同时也增加了升级需要的时间,于是增量升级成为一种好的解决方法。
关键词 Android;安卓;OTA;增量升级;差分升级
1增量升级的原理
Android OTA升级分全量升级、增量升级(也叫差分升级)。增量升级,将旧版本固件与新版本固件进行比较,得到更新部分的补丁,并生成OTA升级zip压缩包。将OTA升级zip压缩包放到服务器上。设备连接到服务器,检查是否需要更新,需要更新则通过网络从服务器下载OTA升级zip压缩包到本地,重启进入recovery系统,通过应用补丁形式,完成boot、system分区的升级,完成boot、system分区的升级再次重启进入正常系统,正常系统启动过程中,以补丁形式完成recovery系统的升级。在recvoery系统中升级boot、system分区,在正常系统中升级recovery分区,这样可以保证正常系统与recovery系统至少有一个是可以正常工作的。增加了系统的健壮性[1]。
2增量升级不足之处
增量升级并非十全十美,存在不足之处。
(1)Android原生增量升级,升级包管理复杂。随着发布版本的增多,所需提供的增量升級包会越来越多。理论上,发布第n个版本时,需要提供n-1个增量升级包,才能满足现有用户通过一次升级,升级到版本n。否则用户需要升级多次才能升级到版本n。例如:当前处于第1个版本的用户,需要升级n-1次才能升级到第版本n,这将会是糟糕的用户体验。
(2)需要保留每个版本的中间文件,用于增量升级包的生成。小小的改动,也需要保留整个系统的中间文件,其中的大部分文件是冗余的。随着版本的增加,消耗的磁盘空间也会越来越大。
(3)实际应用中,固件对外发布后,系统层面的代码很少改动,主要修改是APP相关的修改。APP的小小修改,也需要重新编译整个Android系统,大大降低开发效率。
(4)不修改源码的情况下,全量升级只允许从编译时间较早的版本升级到编译时间较新的版本。增量升级则没有这个限制,实际应用中却有这样的限制需求[2]。
3增量升级改进
中小企业为了加快产品上市,往往会先发布一版相对稳定的固件,然后在实际应用过程中不断改进,版本迭代频繁。开发调试过程中,一天可能出几个调试版本固件,甚至更多。安卓系统原生的差分升级,在这样环境下的应用,不足之处就会更加突出。对此,进行改进,改进后的差分升级,对中小企业更加实用、高效。
3.1 固件打包方式修改
固件打包目录由编译好的kernel文件、root目录、recovery目录、system目录组成。root目录用于生成正常系统ramdisk.img(根文件系统一部分,与system组成Android的整个根文件系统),ramdisk.img与编译好的kernel生成boot.img。recovery目录用于生成recovery系统的ramdisk.img(一个小的根文件系统),再与编译好的kernel生成recovery.img。system目录,存放Android系统的文件及目录,用生成system.img。每个镜像增加镜像头,镜像头包含版本、大小、MD5校验和、版本兼容性等信息。增加固件头,包含boot system recovery的版本、MD5校验和、大小、偏移。固件头后是boot.img、recovery.img、system.img等镜像。system分区以文件或目录为单位为最小单元,在镜像文件头部存放system分区的文件列表,文件列表项由文件名(或目录)、MD5校验和、偏移、大小组成。改进后,打包与Android源码分离。这样只修改APP应用时无须重新编译Android源码,加快了固件发布。
3.2 升级数据下载改进
与原生的OTA升级下载整个OTA升级包不同,先下载固件头部分数据,比较固件头中的版本、MD5校验和信息。固件头中对应镜像的版本、MD5校验和都相同则无须下载此部分镜像,不同则继续下载镜像头进行比较。boot、recovery分区根据版本、MD5校验和比较结果进行下载,版本、MD5校验和相同,无须升级则不进行下载,否则下载固件中相应部分的数据,减少数据下载。system分区数据的下载,则进一步比较当前版本固件中system分区的文件列表与最新版本固件中system分区的文件列表,可以知道新版本固件system分区中哪些文件(或目录)是新增加的,哪些文件(或目录)需要删除的,哪些文件(或目录)需要修改的。只下载增加、修改的数据,记录删除的文件(或目录),就可以升级。增量升级数据的生成在设备端进行,这样不需要事先制作好2个版本间的增量升级包,服务器上只需发布完整的固件即可。固件版本的维护,相对简单。设备当前无论处于哪个固件版本,都可以通过一次更新升级到最新版本。system分区文件列表包含成千上万个文件或目录,为了加快比较速度,对本地文件列表根据文件名进行快速排序,然后对最新版本的system分区文件列表项,用2分查找法在本地文件列表中进行搜索,这样可以快速生成新增、修改、删除表。
3.3 数据升级
与Android原生系统一样,同样启动进recovery系统进行增量升级,不同改用挂载system分区,进行文件增加、删除。
4结束语
综上所述,改进后的差分升级方式,更易维护,更节省时间、空间,更适合中小企业快速迭代的需求。
参考文献
[1] 林学森.深入理解Android内核设计思想[M].北京:人民邮电出版社,2014:335.
[2] 佚名.android维基百科[ED/OL].https://en.droidwiki.org/wiki/Android,2020-5-2.