(三)android recovery差分升级过程掉电分析

时间:2023-01-15 00:26:32

3.1 整包升级与差分升级

 

        Android升级可分为两种,一种是整包升级,一种是差分升级,顾名思义,整包升级,即更新分区时,更新整个分区的镜像,差分升级,更新分区时,只更新差异部分。

 

简单的如下:

                   (三)android recovery差分升级过程掉电分析

        我们从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状态,即Apatch还未完成掉电,那么此时D状态是无法继续进行差分升级的,那么这种极限状态下,差分掉电了是不是不能继续差分升级了呢?这是否是一种设计缺陷?