一个诡异的升级数据包出错问题

我们都知道在Android系统中APP的升级或者OTA包的升级,从后台下载完成的文件,下载完成后我们会去通过md5和字节大小是否和后台服务器挂的包匹配去校验文件是否下载正常,有没有中途出错。
如下载正常的话,我们会去走升级流程;如下载出错,会去删除掉错误的文件,重新下载。
一般文件下载数据出错的原因可能是由于网络中断,重新断点续传时引起的。

最近遇到一个很诡异的问题,
现象如下描述:OTA升级包在下载完成后,已经通过md5和文件字节大小校验,确认和服务器后台的挂网包一致,软件校验完成,会进入5S倒计时提示用户系统马上要更新,此时在倒计时界面马上人为手动断电Android设备,Android系统重启进入recovery升级的时候,会提示升级包数据损坏错误;而如果升级包下载完成,软件做校验通过后,等一小会再断电,重启升级则正常。

Opening update package...
I:read key e=3 hash=20
I:1 key(s) loaded from /res/keys
Verifying update package...
E:footer is wrong
I:verify_file returned 1
E:signature verification failed
Installation aborted.

和维护recovery的同事沟通后,他们说这种情况一般是下载的升级包数据损坏,或者要升级的文件不是升级包导致 footer is wrong。

在查此问题的时候,通过log日志发现下载完的OTA升级包的md5和文件大小校验都是正确的呀,快速断电后怎么升级时数据包会异常呢?
但是recovery报数据损坏的时候,手动去看升级包数据大小确实比后台完整的升级包小了几M,而且校验完成后断电越快,下次升级时升级包和完整的升级包差的大小越大,断电慢一点的话,差的大小就小一些。

下载的数据包损坏,这个问题的定位可以分为两部分:
1、断电前升级包没有下载完成;
2、断电前下载完成了,开机升级前此数据包被重新读写了,导致数据出错。

思路:
在升级包下载完成后立马改变升级包的权限为ro只读,看能否升级成功,
能升级成功,说明断电前升级包确认已经下载完成,是开机后升级前数据包被重新读写导致;否则,断定是升级包数据未下载完成。

操作实践:
下载升级包完成后,在断电前去升级包目录通过ls -l命令查看文件大小是对的,本来想手动将升级包权限chmod 400 *.zip,但发现文件操作不了,比较诡异;
断电开机升级前通过在升级包目录查看发现还是差几M。
没法改变升级包属性为只读,瞬间又没思路了。

怎么可能,明明一个文件已经下载完成,而且校验过了,开机后你又说文件损坏,晕死~

和同事沟通后,打住,还有一种可能,就是虽然下载完成了,虽然已经过了md5校验,虽然文件大小也是匹配的,但是通过命令读的时候或者软件校验的时候数据并没有完全同步到flash,因为丢失数据是和断电的快慢有关的,哈哈~
想到这,感觉很有可能就是这样子的。
立马实验,断电前,手动执行一下sync命令,发现开机后数据包正常,
而且sync动作完成后,chmod 400 *.zip改变为只读的动作也可以执行了,看来确实是系统没有完全将数据同步到flash,此时才不允许我们去改变文件权限的。
多次实验,发现都正常了。太激动了,有没有~

最后软件对此种情况增加了保护,
在文件校验完成后,增加了sync的动作,修复了此诡异的问题。

你可能感兴趣的:(Android)