3.1 整包升级与差分升级
Android升级可分为两种,一种是整包升级,一种是差分升级,顾名思义,整包升级,即更新分区时,更新整个分区的镜像,差分升级,更新分区时,只更新差异部分。
简单的如下:
我们从A升级到C,如果是整包升级,则必须写入所有的数据C;如果是差分升级,只需要更新B即可。
3.2 优劣势对比
从上图我们很明显的看到,升级差分包相对于升级整包来说,更新包小,速度快,为什么还需要更新整包呢,其实差分包与整包各有优势,我们总结如下:
整包升级:
优点:可靠性高,适用范围广。
缺点:升级包一般比较大,下载以及更新过程时间较长。
差分升级:
优点:升级包较小,速度快。
缺点:升级范围有限,只能从某一个指定的版本升级。
由于差分升级,只能从某一个版本,升级到另外一个版本,有局限性,况且终端设备可能存在很多不同的版本,这样新版本推送无法覆盖所有的用户,由于对差分升级,需要管理好终端的版本,才可能针对性的升级,无形增加了管理成本,所以,虽然差分升级,在实现上具有优势,但是在管理上并无优势,所以,并没有得到大多数厂商的推广,常见的还是整包升级。
3.3 差分升级流程
mount("ext4", "EMMC", "/dev/block/system", "/system", "max_batch_time=0,commit=1,data=ordered,barrier=1,errors=panic,nodelalloc"); ui_print("Verifying current system..."); show_progress(0.100000, 0); apply_patch_check("/system/bin/bootplayer", "8a910dafc9210aaf4c467f4a6bd6f703ffd5d9ec", "ffcffb632e7ff1ba42514654ab29556c775c94db") || abort("\"/system/bin/bootplayer\" has unexpected contents."); apply_patch_check("/system/etc/recovery-resource.dat", "d0118acd2eb92a2bc250ff0dc28ee845f7072955", "7411ec9e9e4adac4a5165d303676934b8a5df675") || abort("\"/system/etc/recovery-resource.dat\" has unexpected contents."); apply_patch_check("/system/lib/libamplayer.so", "9879ebc68bf0e69b6d682b09ba1e3c35967a12d9", "01453b9f4b3ca3c025a04cb9a1123e8070931140") || abort("\"/system/lib/libamplayer.so\" has unexpected contents."); apply_patch_check("/system/lib/libdig.so", "bac83f48370be8d204823b44ef596b2076b50ac7", "2cf8c81cf9f54ee3e791da048abbc87c1b40aadc") || abort("\"/system/lib/libdig.so\" has unexpected contents."); apply_patch_space(6604128) || abort("Not enough free space on /system to apply patches."); ui_print("Patching system files..."); apply_patch("/system/bin/bootplayer", "-", 8a910dafc9210aaf4c467f4a6bd6f703ffd5d9ec, 6136336, ffcffb632e7ff1ba42514654ab29556c775c94db, package_extract_file("patch/system/bin/bootplayer.p")); set_progress(0.275669); apply_patch("/system/etc/recovery-resource.dat", "-", d0118acd2eb92a2bc250ff0dc28ee845f7072955, 1014496, 7411ec9e9e4adac4a5165d303676934b8a5df675, package_extract_file("patch/system/etc/recovery-resource.dat.p")); set_progress(0.321245); apply_patch("/system/lib/libamplayer.so", "-", 9879ebc68bf0e69b6d682b09ba1e3c35967a12d9, 6604128, 01453b9f4b3ca3c025a04cb9a1123e8070931140, package_extract_file("patch/system/lib/libamplayer.so.p")); set_progress(0.617929); apply_patch("/system/lib/libdig.so", "-", bac83f48370be8d204823b44ef596b2076b50ac7, 38372, 2cf8c81cf9f54ee3e791da048abbc87c1b40aadc, package_extract_file("patch/system/lib/libdig.so.p")); set_metadata("/system/bin/bootplayer", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:bootvideo_exec:s0"); set_metadata("/system/bin/clatd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:clatd_exec:s0"); set_metadata("/system/bin/debuggerd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:debuggerd_exec:s0"); set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0); unmount("/system");
mount ----------------------- 挂载需要差分文件的分区
apply_patch_check ----------------------- 检查是否符合升级条件,判断sha值,确认是A状态或者C状态
apply_patch_space ---------------------- 确认有足够的空间打patch
apply_patch ---------------------- 打差分补丁
set_metadata ----------------------- 设置权限
umount ---------------------- 卸载分区
3.4 掉电问题
差分升级的条件决定了,只能从A升级,或者C状态,如果不是这两个状态,那么是不允许升级的,假如我们在差分升级过程掉电了,在打patch的过程掉电了,即从A变成C的过程掉电了,那么此时我们假定为D状态,即A打patch还未完成掉电,那么此时D状态是无法继续进行差分升级的,那么这种极限状态下,差分掉电了是不是不能继续差分升级了呢?这是否是一种设计缺陷?