1、android设备系统简介
android 设备在内置的Flash设备划分了很多分区。每个分区有不同的功能作用,介绍几个主要的:
boot:
这个分区装载的是linux kernel这个就是操作系统的镜像,系统从bootloader起来以后就是通过加载boot镜像来启动和管理整个手机的硬件和软件的,比如挂载其他分区,SD卡,加载系统APK应用等等一系列工作,他就是整个手机的大脑。
recovery:
这个分区也包含了linux kernel镜像,只不过启动之后只加载一些简单的分区,提供简单的界面提供给用户进行卡刷、清除数据、清除缓存以及分区数据备份的功能。本人之后介绍的一键在线升级就是通过recovery模式进行加载的;
system:
这个分区存储了主要的系统应用,以及系统启动所有必要的服务的执行bin文件。这个分区被挂载以后是RO写保护的,如果需要对这个分区进行处理的话是需要一些重挂载的操作的。
cache: 这个分区存储了缓存数据,一般都是不重要的数据;
data: 这个分区是所有应用的数据主要存储区,在data/data目录中按照每个应用的包名存放数据,android中每个应用的共享数据、SQLITE数据都是默认存储在这里。比如说常用的设置、短信、联系人等等都是如此。
Adb shell
Cat /proc/mtd
可以看到挂载的设备
dev: size erasesize name
mtd0: 00080000 00020000 "obm"
mtd1: 00080000 00020000 "bootloader"
mtd2: 00040000 00020000 "ramdisk"
mtd3: 00040000 00020000 "imei"
mtd4: 00700000 00020000 "arbelbinary"
mtd5: 00100000 00020000 "msabinary"
mtd6: 00400000 00020000 "kernel"
mtd7: 00400000 00020000 "maintenance"
mtd8: 00500000 00020000 "recovery"
mtd9: 00040000 00020000 "misc"
mtd10: 03d40000 00020000 "cache"
mtd11: 0be00000 00020000 "system"
mtd12: 0d200000 00020000 "userdata"
mtd13: 00800000 00020000 "nvm"
mtd14: 00800000 00020000 "telephony"
mtd15: 00200000 00020000 "reserved"
mtd16: 00a00000 00020000 "MRVL_BBM"
2、recovery 流程介绍
我们不谈论如何下载升级包的过程,从卡上存放了一个update.zip作为前提。
系统是如何知道我们在界面选择了升级包后并帮我们一键升级的呢
Ø 正常主系统在启动进入bootload的时候会检查一个BCB数据块的命令,如果有reboot-recovery命令标志的话则加载recovery.img系统镜像,如果没有的话则正常加载boot.img系统就是我们手机的正常启动过程了(挂载设备、按照init.rc配置进行进程服务的加载)
参考:http://blog.csdn.net/mu0206mu/article/details/7464987
BCB是bootloader与Recovery的通信接口,也是Bootloader与Main system之间的通信接口。存储在flash中的MISC分区,占用三个page,其本身就是一个结构体,具体成员以及各成员含义如下:
struct bootloader_message{
char command[32];
char status[32];
char recovery[1024];
};
①command成员:其可能的取值我们在上文已经分析过了,即当我们想要在重启进入Recovery模式时,会更新这个成员的值。另外在成功更新后结束Recovery时,会清除这个成员的值,防止重启时再次进入Recovery模式。
②status:在完成相应的更新后,Bootloader会将执行结果写入到这个字段。
③recovery:可被Main System写入,也可被Recovery服务程序写入。该文件的内容格式为:
“recovery\n
<recovery command>\n
<recovery command>”
Ø 进入recovery模式后,系统会从cache/recovery/command文件读取执行命令(清除数据、缓存,备份,卡刷升级等等操作)
cache/recovery/command文件的来历:
在一键升级的时候,系统首先将“--update_package=root:path”写入cache/recovery/command文件
/cache/recovery/command:这个文件保存着主系统传给Recovery的命令行,每一行就是一条命令,支持一下几种的组合。
--send_intent=anystring //write the text out to recovery/intent 在Recovery结束时在finish_recovery函数中将定义的intent字符串作为参数传进来,并写入到/cache/recovery/intent中
--update_package=root:path //verify install an OTA package file Main system将这条命令写入时,代表系统需要升级,在进入Recovery模式后,将该文件中的命令读取并写入BCB中,然后进行相应的更新update.zip包的操作。
--wipe_data //erase user data(and cache),then reboot。擦除用户数据。擦除data分区时必须要擦除cache分区。
--wipe_cache //wipe cache(but not user data),then reboot。擦除cache分区。
Ø 根据读取的命令recovery系统使用/sbin/recovery执行文件来执行命令(清除数据、缓存,备份,卡刷升级等等)
做完之后系统reboot,同时删除BCB控制块reboot-recovery命令标志,并且删除cache/recovery/command文件(如果不这样做的话,系统进一直循环进入recovery模式)
当然了,升级过程中有任何问题,可以在cache/recovery/log文件查看,该文件存储了升级过程中的所有打印LOG
3、第三方Recovery镜像介绍
http://wiki.cyanogenmod.com/wiki/Howto:_Using_the_Recovery
一下两个是比较有名的recovery工具,如果需要使用的话,要去官网看下支持的机型,不能乱用的哦,小心你的手机变砖。
http://www.clockworkmod.com/rommanager这个网址是ClockworkMod Recovery配套的ROM Manager应用支持的机型,一般这个支持的话,你的手机肯定是支持ClockworkMod Recovery的。
ClockworkMod Recovery和 Amon_Ra's Recovery都是很有名的第三方 Recovery,功能都很强大,不过前者的使用者更多。它们两者包括的功能与区别如下。
ClockworkMod Recovery功能包括:
1. reboot system now:重启系统
2. apply update from sdcard:从SD卡升级update.zip升级包
3. wipe data/factory reset:擦除数据/恢复出厂设置
4. install zip from sdcard:从SD卡安装zip升级包
5. backup and restore:备份与恢复
6. mounts and storage:装载于卸载各个区与存储器
7. advanced:高级,如对SD卡进行分区,清除 Dalvik缓存等
8. power off:关机
Amon_Ra's Recovery 功能包括:
1. Reboot system now:重启系统
2. USB-MS toggle:把手机和外置SD卡当做USB大容量存储器
3. Backup/Restore:备份与恢复
4. Flash zip from sdcard:从SD卡刷zip升级包
5. Wipe:擦除数据
6. Partition sdcard:对SD卡进行分区
7. Mounts:装载或卸载各个分区
8. Other:其他,如修复APK UID错误
9. Power off:关机
4、利用Clockwork Mod进行扩展一键升级升级
http://wifihack.net/blog/2012/04/android-clockworkmod-recovery-system-updat/
与android原生的recovery升级流程不一样的是,Clockwork Mod可以进行扩展定制升级并取消签名验证(CWM如果要取消签名验证进行升级,不能使用Android默认的)
删除 /cache/recovery/command文件,确保没有该文件
在 /cache/recovery/extendedcommand写入相关的升级命令。
同时要在 /sdcard/clockworkmod/.recoverycheckpoint文件做相关的标记。
Clockwork Mod相关的脚本见下:
Ø ui_print("ROM Manager Version 4.2.0.2");
Ø restore_rom("/sdcard/clockworkmod/backup/2011-05-13-13.03.52", "boot", "system", "data", "cache", "sd-ext");
Ø backup_rom("/sdcard/clockworkmod/backup/2011-05-13-13.23.20");
Ø install_zip("/sdcard/DRockstar.Clean.Kernel.EC05.v1.04.zip");
Ø backup_rom("/sdcard/clockworkmod/backup/2011-05-13-13.30.09");
Ø run_program("/cache/dowipedalvikcache.sh");
Ø format("/cache");
Ø format("/data");
Ø format("/sd-ext");
包含了打印、备份、恢复、升级、格式化。
是不是迫不及待的想看看我们的源码了,下面贴出主要的部分,具体可以参见本文章的结尾处的附件代码
FileWritercheckpoint =newFileWriter(CLOCK_WORK_MOD_CHECKPOINT_FILE);
try {
checkpoint.write("1");
checkpoint.write("\n");
} finally {
checkpoint.close();
}
FileWritercommand =newFileWriter(EXTENDED_FILE);
try {
command.write("ui_print(\"ZPad ROM Manager Version:\"); ");
command.write("\n");
command.write("ui_print(\"2012.4.18\");");
command.write("\n");
command.write("ui_print(\"Preparing to install ROM...\");");
command.write("\n");
//assert(install_zip("/sdcard/update/kvbian-rom-signed-20120417-2112.zip"));
command.write("format(\"/cache\");");
command.write("\n");
command.write("assert(install_zip(\"" +ROMPATH +"\"));");
command.write("\n");
} finally {
command.close();
}
/**
* boot-recovery
* recovery
*/
// Having written the command file, go ahead and reboot
PowerManagerpm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
//pm.reboot("recovery");
pm.reboot("recovery");
效果图:
附件代码的下载地址: