ClockworkMod Recovery实现应用android一键化在线卡刷升级

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配置进行进程服务的加载)

clockworkmod CWM简单介绍_第1张图片

参考:http://blog.csdn.net/mu0206mu/article/details/7464987

BCBbootloaderRecovery的通信接口,也是BootloaderMain 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

<recoverycommand>\n

<recoverycommand>”

Ø 进入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相关的脚本见下:

http://pastebin.com/c7S8Nxu4

Ø 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");

效果图:

clockworkmod CWM简单介绍_第2张图片

附件代码的下载地址:

android一键recovery升级程序实例

更多相关文章

  1. Android 上的 Scala, 实战之路(三)——介个是数据库接口?
  2. Android系统Recovery工作原理之使用update.zip
  3. android ui线程和数据的分离
  4. android系统添加service与android层次分析
  5. Windows平板装Android双系统及建立UEFI引导全攻略(windows8.1+and
  6. Android 数据缓存-文件存储
  7. Android webview 实现h5中调用原生系统相册/相机并进行图片压缩
  8. android 保存Json数据到本地

随机推荐

  1. 六种最具视觉效果的Android(安卓)手机浏
  2. Android XMPP Service (Google Talk) + G
  3. 实现android图像识别的几种方法
  4. Android之——jni通用工具方法
  5. adb 发送文件到Android设备和从Android手
  6. Android Menu详解及示例代码
  7. Android中Snackbar的介绍以及使用
  8. Android系统启动流程(三)解析SyetemServer
  9. 极客学院Android视频分享
  10. Eclipse 配置 NDK