Android OTA是断电安全的,也就是说,在Recovery模式下升级的任意一步,如果突然断电,后续还是能恢复。
当执行差分升级包时,为了能断电恢复,需要先计算出目标文件,并保存到一个临时位置,然后再用目标文件覆盖源文件。 因此,在差分升级过程中,需要一个持久性的(断电不丢失的)存储区。
其逻辑在 “bootable/recovery/applypatch/”中。 其中分了两块处理:
1.) 如果目标是一个分区(如boot), 会把 target文件写在cache中
2.) 如果目档是文件(如更新system时), 会要求target所在的文件系统有 enough_space,
enough_space =
(free_space > (256 << 10)) && // 256k (two-block) minimum
(free_space > (target_size * 3 / 2)); // 50% margin of error
如果target所在的文件系统没有 enough_space,会试图备份source到 cache, 然后删除source。然后再检查target所在的文件系统是否有足够空间(不考虑文件碎片的话,一般来讲都会有的,要不然target image也编译不成功了。)
好吧,上面说的很乱ÿ