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

 

 

参考: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

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

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

 

 

效果图:

 

 

附件代码的下载地址:

android一键recovery升级程序实例

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值