进入Recovery之前的关机流程
作者:李志强 2016-02-22
欢迎转载,请注明出处 http://www.cnblogs.com/kaios/p/5208523.html
Recovery模式和Android的正常模式是独立的,通常在Recovery模式中完成的工作包括,Fota升级,SD卡升级,以及恢复出厂设置这三个功能。这三个功能中Fota升级的升级包通常上由Fota的上层应用来下载的,而存放的位置一般上/cache分区或者/data分区。如果是存放在cache分区,那么没有问题,正常升级即可。如果升级包是被存放在了data分区,在android引入了data分区加密功能之后,这个就会有问题。如果data分区被加密过,那么在recovery下说无法通过文件系统来直接访问存放中data分区中的升级包的。那么在data分区被加密的情况下,recovery是怎么读取存放中data分区中的升级包呢?这就是本文要讲述的,这进入Recovery模式之前的关机流程中,其实还做了一些额外的处理。如果要重启进入recovery模式进行sd卡升级或者恢复出厂设置,则会走的是正常的关机进入recovery流程,如下流程图:
Fota应用在下载完Fota升级包之后是通过调用RecoverySystem提供的installPackage接口来启动升级。在这个接口中首先会创建一个文件/cache/recovery/uncrypt_file这个文件是一个标志文件,创建这个文件则表示该次关机流程是为了fota升级而启动的。并且这个文件中保存着升级包的路径,这个路径会中uncrypt服务中被用到。这里提到了uncrypt服务,如上流程图所示,这个服务就是为了解决中data区加密的情况下,recovery读取data分区存放的升级包的问题。
uncrypt是一个可执行的程序,编译后生成在out/.../system/bin/目录下,对应的代码为bootable/recovery/uncrypt/*,而和这个可执行程序有关的服务有两个如下:
1 ... 2 3 service uncrypt /system/bin/uncrypt 4 class main 5 disabled 6 oneshot 7 8 service pre-recovery /system/bin/uncrypt --reboot 9 class main 10 disabled 11 oneshot 12 13 ...