分析一次OTA App和Image导致数据库文件丢失过程

  • 目前我听着歌,心里预约,发现bug,到解决Bug,总共费时3天,心情如过山车一样,便有此文

我们App是一个LAUNCHER应用,就是一个安卓系统搭载我们APP,我们App作为启动的应用,在OTA的时候没有发现数据库丢失,但是更新系统的时候,发现所有数据丢失,这是QA反馈的情况

  • 1、首先怀疑是系统的问题,因为我们的系统是定制化的,有些特定的程序,特定的分区给我们App独特使用,同时我们App是没有权限限制,也就是说代码没有做动态权限的申请,所以有可能是系统更新后,导致某个权限没有了,然后导致读取文件的失败
和供应商的聊天记录
  • 所以我先排除了是权限的问题,但是这个时候,还是不明白为什么OTA APP正常,OTA Image不正常,同时也反馈情况给leader,说明情况
image.png

回到问题的本身,我们数据如何处理,我们App本身内置了一个数据库文件,这个数据库文件主要是确定用户在没有网络的情况下,也能够正常的使用内置的数据,同时我们把资源文件(主要是图片)放在专门的一个分区,apd分区

apd分区

OTA 系统会改动这个分区的数据么?不会,这个可以算是用户分区,同时"/data/data/" + context.getPackageName()这个也是用户空间,OTA App或者是系统是不会丢失这里面的文件的

App的数据库加载流程

  • 1、首次启动APP。App会判断是否有数据库文件,如果有,不做任何处理
  • 2、如果没有数据库文件,那么通过流的操作,把App的资源文件写入到"/data/data/" + context.getPackageName(),也就是原始的数据库文件,这个文件,会跟着APP一生,也就是这个产品的一生

问题是数据库文件丢失?观察原始系统下的 db文件大小,和ota完成以后的大小

这个时候数据库有844k

但是当ota成功后,这个数据库变为166k,所以问题是数据库文件丢失

image.png

到这里明白数据文件的丢失了,但是为什么OTA APP正常呢?为什么呢?这个问题困扰我一直到第二天,我的理解就是两个都有问题,然后就可以去找数据库文件为什么丢失

  • 到这里我第一个思路,就是替换原来的DB文件到最新版本,同时资源文件也是,因为我们有新增的数据,在没网的情况下,用户能够看到数据,但是显示不了图片,同时我在这里忽略了一个极其重要的问题,用户原来的数据库文件怎么办?

  • 由于发的是正式版本,需要对每一条数据库文件检查,同时每一条数据都在APP上实际操作,这个过程在我们发第一个版本,足足弄了一周,而且还有不确定的问题产生,所以这个解决很大问题,同时还要备份原来的数据库文件,实际操作的时间远大于解决这个问题的意义

  • So,我不太能够说服我自己,同时心里开始产生怀疑,应该OTA都有问题,但是我今天加班,QA的小伙伴不在公司

由于系统集成的app都是system分区的,自己可以通过push模拟OTA的操作,通过模拟的结果:开始怀疑,QA的测试结果有问题,应该是OTA App 和 Image 都是有问题的,对的,这次更加的确定

放弃幻想,开始战斗,开始怀疑数据库的更新关键是有问题的,由于这块逻辑不是我写的
所以,大胆假设,小心求证

DB的更新流程如下:

  • 1、备份数据,如果是新表的话,其实是不需要备份数据的,需要做些判断

  • 2、删除表

  • 3、创建表

  • 4、恢复数据,同第一点一样,如果备份数据表的中间表不存在,也是不需要的

  • 通过以上流程的分析,这块代码没有问题,只不过是我们Pro的版本,有个跨表升级的问题,最后修复了,跨表升级的问题

  • 我们App分为好多个版本,但是数据版本是一直在增加,所以有可能出现,Rro的线上版本需要从1升级到9这种情况,需要特定处理

第二天正式上班,第一件事情,就是让QA复现他的情况,为什么OTA App是正常的,最后看了测试视屏,终于明白,OTA App 是保持有网络的状态,所以当更新到最新版本,发现本地没有数据,就回去网络上获取,到这里终于真想大白。

解决这个问题,我的心态是变化是:迷茫--->清晰--->困惑---->怀疑--->解决--->多方求证--->验证答案,皆大欢喜

image.png

最后感谢我们公司的QA小伙伴不离不弃,哈哈

我的聊天群

你可能感兴趣的:(分析一次OTA App和Image导致数据库文件丢失过程)