常州互联网圈|Android手机开发过程中的升级流程和方法


1.升级流程
在Android应用层部分 , OTA系统大概升级流程图如下所示:

常州互联网圈|Android手机开发过程中的升级流程和方法
本文插图

2.防变砖机制
主要策略是针对两个情况:
第一种针对升级包升级失败的情况 , 一般是由于升级包下载下来是坏包 , 或者本地上传过程中出现问题 , 可能导致md5值不对等 , 这种情况的升级失败 , recovery会在升级过程中显示升级失败 , 之后会需要用户重启 , 但重启后由于misc分区没有清除 , 将会继续进入recovery模式 , 无法进入main system 。
因此 , 在recovery裁减完毕后 , 不需要用户去操作重启;在这个基础上 , 会存放一个可升级的update_back.zip的备份升级包 , 当升级包升级失败以后 , 会直接对此备份升级包进行升级 , 升级成功后 , 可以正常进入main system 。
潜在问题:关于这个备份升级包 , 如果升级后 , 用户可能不知道自己是升级失败用的备份升级 , 这块需要加提示逻辑;第二点,备份升级包是否需要一个阶段进行厂商提供较新的代替 。 因此这部分的策略还需要讨论 , 寻求一个满意的机制 。
第二种情况 , 针对升级过程中 , 突然断电 , 在升级包中如果在升级recovery.img 或者boot.img的时候 , 突然间断电 , 有低概率会导致recovery系统启动不出来 。 这种情况下 , 如果后期对recovery系统不做改动 , 建议在OTA升级包中 , 不加入recovery.img;这样可以大大避免升级过程中断电 , recovery起不来的现象 。 至于在boot.img断电也可能会影响recovery系统 ,
也由于bootloader不会在OTA升级中更新 , 因此策略如下:
1.添加一个boot.img 的备份分区(如果recovery.img加入到OTA升级包中 , 建议也可以加入recovery.img 备份分区)
2.修改fastboot逻辑
理由:由于bootloader在开机后在recovery之前 , 会先检验kernel情况 , 因此在fastboot这块对boot分区做判断 , 如果boot分区校验失败 , 就改用备份的boot分区进入 。
3.差分包升级
又称增量包(Increment OTA),主要是对某一节点的内容进行升级,但是过程中要进行严格把控,维护起来比较麻烦 。 比如说节点A->节点B的差分包 , 用户必须是A的版本;
差分包的优势在于 , 由于不是整包 , 只做差分部分的升级 , 相对于整包升级包要小很多 , 也比较安全 , 因为必须是特定节点才能升级 。
劣势主要在于 , 制作以及维护 , 因为Android差分包制作主要是通过ota_from_target_files脚本 , python脚本 。 制作的版本如果有涉及到selinux权限 , 可能会出现问题 。
首先 , 不同版本新增的权限 , 需要在init.rc去增加 , 涉及到有些权限加完以后系统仍然挂死时 , 通常做法 , 通过更新google的最新ota_from_target_files脚本以及修改py脚本的内容 , 才能修改问题 。
其次 , 每次升级过程中 , 如果是差分包升级 , 即使增加了init.rc,还需要fastboot烧录一次boot.img后再进行差分包升级才能生效 。
【常州互联网圈|Android手机开发过程中的升级流程和方法】因此建议:对于有selinux的user版本 , 再出厂前版本 , 能够做到所有权限都能够加好 , 达到稳定的效果 。 (有些selinux权限会导致CTS跑不过 , 也需要暂时不加 , 这些也需要考虑) 。 因此 , 每个大版本之间作一次差分包升级 , 然后如果出现权限问题 , 一次性加全 , 出厂前每个小版本作一次差分包升级验证 。


    推荐阅读