recovery可以移动叔叔更新recoveryy吗

经验38286 米
威望161 米
在线时间2432 小时
MIUI ROM 发布
机型小米手机3
签到次数210
MIUI版本5.8.4
先说一个事情,MIUI所有机型的开发节奏说明:
版本号命名规则
开发版 日期命名例如2.1.13即日(左图)
稳定版 2.3.5X或2.3.7X,2.3.5j字母后面有有数字的2.3.5j5为内测版本(右图)
device--115141.png (28.03 KB, 下载次数: 82)
device--115113.png (42.41 KB, 下载次数: 104)
对于所有会员:开发版 每周五下午五点准时更新(节假日特殊情况除外)
对于所有会员:稳定版 不定期更新,最短是一个月更新
对于所有会员:基于原厂适配版 更新节奏请关注扫地僧每周发布说明
然后说下特殊用户组包括的用户组(版主、资源组、解答组、主题组、内测组、荣誉开发组、荣誉顾问团)
对于特殊用户组:开发版 每周二、三、四、五下午更新请关注开发专区我每天的发布说明
对于特殊用户组:稳定版 不定期更新请关注开发专区我每天的发布说明
对于特殊用户组:基于原厂适配版 不定期更新
对于机型内测组:请关注该QQ交流群群社区发布帖子 不定期更新
行了开始步入正题,小米手机对于特殊用户组Recovery现在已经更新1.1.0.,所有会员将会在2.3.5K见到,我们会在
春节前发布请大家期待,接下来就说说1.1.0.和1.0.0.两个版本的Recovery有什么不同包括新版本的Reovery有什么
新特性请听我细细道来首先看看两个版本Recovery版本有何不同
device--113157.png (19.05 KB, 下载次数: 31)
device--113030.png (21.23 KB, 下载次数: 63)
相信细心的人已经赶出来了,除了版本号不同之外,新版的Recovery还增加了一个新功能,这个功能是做什么用的呢?
相信大家都很期待小米手机的MIUIV4 这个功能就是专门为V4设计的,步入4.0时代原来的分区是明显是不够使用的,
现在又出现一个问题,如何分辨自己手机系统分区是已经更新了的呢?请看下图(左为旧分区,中图、右为新分区)
device--114916.png (65.46 KB, 下载次数: 22)
device--115057.png (62.82 KB, 下载次数: 32)
device--115023.png (49.8 KB, 下载次数: 27)
相信细心的人已经看出来有什么不同了,内部存储,总共的大小为2.xxGB的都是新分区,为3.xxGB的为旧分区
这样一来,大家应该我们的4GB ROM 其他的都去哪里了吧,相信不用我说你懂的
最后说明一下,新的分区将不会兼容旧版的Rcovery1.0.0所以我们可以这样认为,
已经刷了最新版本2.3.5j/3/4/5/K的系统并且更新了系统分区,请勿降级,
2.3.5ABDEFGHIJ都算降级,Recovery很生气,后果很严重
最后再次说明一下,有些朋友存在侥幸心理,以为从工厂出的版本是比较省电和问题比较少的,这你就错了,开发组的
各位童鞋每天都在完善代码,包括底层驱动,以及调整我们硬件参数,优化摄像头的成像效果,耗电,我就不说了完全是
看个人的使用习惯,另外,希望对大家有帮助,如果越老的版本越好那
我们整天写代码出新版本又有什么意义呢?当然最新最好也是错误心理,新不代表好,选择自己需要并且适合自己的版本
才是王道,但是我可以肯定的说稳定版只要是公测版本字母越靠后的我们做的修复最多,可能以后我们会终结2.3.5Z到那
个时候请不要选择其它版本。作为发烧友的你怎么可能放弃新版本?
读完了这篇帖子是否希望对你有帮助?如果有你懂的!!
————————————————————————————————————————
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
请问更新了recovery以后能不能刷公测的原生4.0呢?&
我升级了之后miflash到了2.3.5c使用正常。。&
學習一下~~~&
除了详细介绍了软件的升级外,还给小白扫盲了,不错。&
为什么我刷完recovery之后只有2.87G,另外的0.02G跑到哪里去了!!!??&
已有&31&人评分
MIUI 因你更精彩!
MIUI 因你更精彩!
如果有帮助就得给你加分是吧,我懂.
小白来学习了!!!
最后说明一下,新的分区将不会兼容旧版的Rc.
學習一下~~~
刷过4.0后,再用新版本的recovery,能刷回2.
明白了,期待4.0
备份在系统里面有 笨蛋
为什么小米的Recovery没有备份系统功能?.
为什么我发现只有2.87G还有0.02G哪里去啦?.
技术贴,神马都不说了
希望快点到V4~~~~期待
为发烧而生
经验766 米
在线时间55 小时
积分 838, 距离下一级还需 1162 积分
积分 838, 距离下一级还需 1162 积分
机型小米手机1/1S
签到次数31
MIUI版本4.1.3
积分啊积分
已有&2&人评分
为什么小米的Recovery没有备份系统功能?.
沙发奖励!
经验903 米
在线时间114 小时
版本5.7.16
积分 1048, 距离下一级还需 952 积分
积分 1048, 距离下一级还需 952 积分
机型小米手机3/4 WCDMA版
签到次数66
MIUI版本5.7.16
貌似明白了许多
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
经验1583 米
在线时间146 小时
积分 1820, 距离下一级还需 180 积分
积分 1820, 距离下一级还需 180 积分
机型小米手机1/1S
签到次数69
MIUI版本3.9.6
{:1_1:}能理解,尽快出MIUI4.0,加油啊
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
经验5107 米
在线时间299 小时
积分 5392, 距离下一级还需 14608 积分
积分 5392, 距离下一级还需 14608 积分
机型红米Note 4G版
签到次数166
MIUI版本5.6.2
关注中& &支持小米
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
经验3898 米
在线时间352 小时
版本5.1.16
积分 4963, 距离下一级还需 37 积分
积分 4963, 距离下一级还需 37 积分
机型小米手机3/4 WCDMA版
签到次数115
MIUI版本5.1.16
前排一下。。。。。。
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
& &今日之因,就是明日之果& &
经验3348 米
在线时间551 小时
版本JMACNBH14.0
我是一个包子
积分 4224, 距离下一级还需 776 积分
积分 4224, 距离下一级还需 776 积分
机型小米手机1/1S
签到次数19
MIUI版本JMACNBH14.0
好帖子!果断学习!
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
经验54080 米
威望644 米
在线时间5695 小时
机型小米手机3/4 WCDMA版
签到次数199
MIUI版本5.8.4
本帖最后由 风起云落 于
12:52 编辑
忘记抢沙发了。。
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
经验31869 米
威望183 米
在线时间5984 小时
版本5.7.16
独自向天笑
机型小米手机2/2S
签到次数221
MIUI版本5.7.16
还在前排!
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
我和谁都不争,和谁争我都不屑。
经验856 米
在线时间76 小时
积分 980, 距离下一级还需 1020 积分
积分 980, 距离下一级还需 1020 积分
机型小米手机1/1S
签到次数44
貌似明白了许多
已有&1&人评分
为什么小米的Recovery没有备份系统功能?..
MIUI 3000万
MIUI 3000万发烧友纪念勋章
MIUI 2000万
MIUI 2000万发烧友纪念勋章
MIUI三周年
MIUI三周年纪念勋章
已关注微信
1000万用户纪念勋章
MIUI1000万用户纪念勋章
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
MIUI 100周
100周发布纪念勋章
小米手机元器件合体活动勋章
小米求合体勋章
一周年纪念勋章
一周年纪念勋章
做出特别贡献
已关注极客秀微信
小米手机2终身荣誉勋章
小米手机2终身荣誉勋章
小米手机3终身荣誉勋章
小米手机3终身荣誉勋章
小米平板首发纪念勋章
小米平板首发纪念勋章
MIUI五周年
MIUI五周年纪念勋章
小米手机1终身荣誉勋章
小米手机1终身荣誉勋章
MIUI6 荣誉勋章
MIUI6 荣誉勋章
社区VIP贵宾专属
百万壁纸评审纪念勋章
MIUI俱乐部发烧友
MIUI俱乐部发烧友
Copyright (C) 2015 MIUI
京ICP备号 | 京公网安备5号 | 京ICP证110507号&好评度 405
&如果你如果您觉得此软件好,请
&如果你如果您觉得此软件差,请
&&本地下载地址:
&『 点击下面的地址下载 』
&&软件介绍:
recovery是一种工程模式,一般用home键+开机键进入,在这个界面你可以直接用sd卡上的zip的rom升级或者备份你的系统。小编这里提供的recovery.img刷机包,它是CWM Recovery 2.5.1.3版本,目前固件管家最新的正式版!recovery使用方法:1、解压缩2、复制所有的文件到手机sd卡中。3、进Recovery直接刷就好了,就像刷Rom一样!
&&相关软件:
我喜欢这个软件 我不喜欢这个软件
应用软件小类
快用苹果助手2014是一款苹果不越狱安装软件,中国大陆市场唯一一款苹果不越
Adobe在10月份发布了新一代AcrobatX软件家族,其中包括PDF创建编辑软件Acro
流行好用的压缩工具,支持鼠标拖放及外壳扩展,完美支持ZIP档案,内置程序可
懒人听书电脑版是小编通过安卓模拟器BlueStacksBeta-1实现的pc版本,能够帮
lingoes灵格斯词霸是一款简明易用的翻译与词典软件,支持全球超过60多个国家
软件下载排行
软件详细资料已被复制到粘贴板,直接粘贴既可。
 |  |  |  |  | 
版权所有 Copyright &> 手机 > 正文
recovery刷机教程,recovery模式刷机
recovery刷机教程,recovery模式刷机  知道recovery模式刷机的步骤吗?其实方法很简单,现在小编就为大家提供详细的recovery刷机教程图文详解。  1.准备好你对应的的.img文件  2.把下载好的recovery文件改名字,改成简单点的就好。如:11.img 注意扩展名是否被隐藏  3.将改好名字的recovery文件放到内存卡根目录 不要连接数据线 不要挂载usb  4.打开超级终端  -----输入su回车(最好用谷歌输入法,进入超级终端后按住menu键打开输入法)  -----输入_image recovery /sdcard/你刚刚改好的文件名字.img 回车 (注意recovery前后都有个空格 其它地方都没空格)  这里说下,有人问&_&怎么打出来的,装输入法,竖屏,长按左键调出输入法就可以打符号了&  5.出现#时表示刷recovery完毕 关机 进入recovery看看是不是刷上了 如有其它提示请看看是否输入错误了  末了附个比较新的recovery版本:&  手机的Recovery版本是2.5.1.2的,论坛中很多教程都不是针对该版本的,个人经过多次刷机后整理了一下针对该版本的刷机步骤。  1. 首先,在刷机前手机关机,按住手机的【往返键】或【音量-】键不放,再按手机的【电源键】,如果你是按【往返键】的将进入FASTBOOT界面;按的是【音量-】键的将进入的是界面。前者再按一次【电源键】后就进入到了HBOOT界面;后者将直接进入到HBOOT界面。在这个界面中,  2. 使用【音量+】或【音量-】键可以选择菜单项目。我们要刷机或要进行分区当然要选择第二项的Recovery了。选择好后,按手机的【电源键】后就进入到Recovery界面了。针对2.5.1.2的Recovery有8个选项菜单,每个主菜单中都有下一级菜单。2.5.1.2的Recovery对应的菜单如下:  版本Recovery 2.5.1.2的全部菜单中英文注释:  -reboot system now 重启系统  -apply sdcard:update.zip 使用SD卡根目录的update.zip更新系统  -wipe data/factory reset 清空data分区并恢复出厂设置  -wipe cache partition 清空cache分区  -install zip f sdcard 从SDcard选择文件更新系统  --apply sdcard:update.zip 使用SD卡根目录的update.zip 更新系统  --choose zip f sdcard 从SD卡选择zip格式升级包  --toggle signature verification 切换签名验证  --toggle script asserts 切换升级脚本检查  -backup and restore 备份和恢复  --Backup 备份  --Restore 恢复  --Advanced Restore 高级恢复  -mounts and storage 挂载和存储  --mount /system 挂载/system分区(系统分区)  --mount /data 挂载/data分区(数据分区)  --mount /cache 挂载/cache分区(缓存分区)  --mount /sd-ext 挂载/sd-ext分区(A2SD分区)  --format boot 格式化内核分区  --format system 格式化系统分区  --format data 格式化数据分区  --format cache 格式化缓存分区  --format sdcard 格式化存储卡  --format sd-ext 格式化内存卡SD  --mount USB storage 挂载SD卡为U盘模式  -advanced 高级  --Reboot Recovery 重启Recovery  --Wipe Dalvik Cache 清空Dalvik缓存  --Wipe Battery Stats 清空电池状态  --Report Error 报告错误  --Key Test 键位测试  --Partition SD Card 对SD卡分区  --Fix Permissi** 修复权限  启手机在等待一会就可以看到最新的成果了,哈哈!!~~~一切都完成了~~OK!!!  3. 分区操作  在执行分区和刷机前,备份你的手机数据,这个分重要。  1). 使用【音量键】或手机【房子键】来移动光标来选择advanced( 高级)项后,按下【房子键】来确定进入下一级菜单,再选择Partition SD Card (对SD卡分区),按下【房子键】或确定。  2). 进入到设置Ext Size窗口,这里输入你要的Eet分区大小(这里要说明一下,每个版本的rom要求不同的Eet分区大小,一般在1G一下)。移动光标后,再按【房子键】来确定。  3). Ext分区后,按了【房子键】会自动进入到下一个S Size窗口,这里就是设置你的S分区大小的界面了,大小一般在32MB~512MB之间就可以了,同样选择大小后按【房子键】来确定。  4). 上面的Eet分区、Swap分区都确定后,SD卡剩下的空间系统会自动分配给FAT格式的分区,不需要理会它。  5). 按了【房子键】后,系统就开始自动分区并格式化分区了,这时你不需要任何操作,耐心等待手机完成操作。当手机提示完成分区操作后,你只要按一下【电源键】,返回Recovery主菜单后,选择reboot system now (重启系统),再按【房子键】来确定,手机重启后就进入到桌面了,分区操作就完成了。  4. 刷新rom  1). 首先,将你要准备安装的rom选择好后放到SD卡的FAT分区中。(刷机用的rom下载后的文件不要解压)  2). 关手机后,操作进入Recovery界面与分区的操作相同。  3).选择 wipe data/factory reset( 清空data分区并恢复出厂设置)和wipe cache partition (清空cache分区)这2个选项来清空手机的数据(很重要,必须要操作)。当然操作是完成一项后再选择另一项,同样是按下【房子键】来确定操作。  4). 这2项完成后,选择install zip from sdcard( 从SDcard选择文件更新系统),按【房子键】后进入下一级菜单,选择choose zip from sdcard (从SD卡选择zip格式升级包),按【房子键】后进入到SD根目录后,选择你已经在电脑上操作过的存在SD卡上的rom文件(你要记得你的rom文件名啊),按下【房子键】来确定操作。  5). 这是就不需要你操作了,你只要仔细观察手机中的安装进度条就可以了,等待几分钟后,手机提示完成安装后自动重启手机在等待一会就可以看到最新的成果了,一切都完成了,这就是recovery模式刷机。  编后语:Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式,也叫工程模式,只要懂得如何使用Recovery模式,我们就可以刷新的安卓系统,或者对已有的系统进行备份或升级等一系列操作,是手机刷机必不可少的模式。相关阅读:&
最热手机词条排行
热门手机专区排行Android系统Recovery工作原理之使用update.zip - j2eedengzhangtao - ITeye技术网站
博客分类:
为了方便客户日后的固件升级,本周研究了一下android的recovery模式。网上有不少这类的资料,但都比较繁杂,没有一个系统的介绍与认识,在这里将网上所找到的和自己通过查阅代码所掌握的东西整理出来,给大家一个参考!
Android启动过程
在这里有必要理一下android的启动过程:
图1 android启动过程
系统上电之后,首先是完成一系列的初始化过程,如cpu、串口、中断、timer、DDR等等硬件设备,然后接着加载boot default environmet,为后面内核的加载作好准备。在一些系统启动必要的初始完成之后,将判断是否要进入recovery模式,从图1中可以看出,进入recovery模式有两种情况。一种是检测到有组合按键按下时;另一种是检测到cache/recovery目录下有command这个文件,这个文件有内容有它特定的格式,将在后面讲到。
下面来看看uboot中lib_arm/board.c这个文件中的start_armboot这个函数,这个函数在start.s这个汇编文件中完成堆栈等一些基础动作之后被调用,进入到c的代码中,start_armboot部分代码如下:
void start_armboot (void)
for (init_fnc_ptr = init_ *init_fnc_ ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
#ifdef CONFIG_ANDROID_RECOVERY
check_recovery_mode();
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();
init_sequence是一个函数结构体指针,里面存放的是一些必备的初始化函数,其代码如下:
init_fnc_t *init_sequence[] = {
#if defined(CONFIG_ARCH_CPU_INIT)
arch_cpu_init,
/* basic arch cpu dependent setup */
board_init,
/* basic board dependent setup */
#if defined(CONFIG_USE_IRQ)
interrupt_init,
/* set up exceptions */
timer_init,
/* initialize timer */
/* initialize environment */
init_baudrate,
/* initialze baudrate settings */
serial_init,
/* serial communications setup */
console_init_f,
/* stage 1 init of console */
display_banner,
/* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo,
/* display cpu info (and speed) */
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard,
/* display board info */
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
init_func_i2c,
dram_init,
/* configure available RAM banks */
#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)
arm_pci_init,
display_dram_config,
我们来看看env_init这个函数,其代码如下:
int env_init(void)
/* use default */
gd-&env_addr = (ulong)&default_environment[0];
gd-&env_valid = 1;
#ifdef CONFIG_DYNAMIC_MMC_DEVNO
extern int get_mmc_env_devno(void);
mmc_env_devno = get_mmc_env_devno();
mmc_env_devno = CONFIG_SYS_MMC_ENV_DEV;
可以看出在这里将default_environment加载进入系统,default_environment对应的部分代码如下:
uchar default_environment[] = {
CONFIG_EXTRA_ENV_SETTINGS
CONFIG_EXTRA_ENV_SETTINGS
而CONFIG_EXTRA_ENV_SETTINGS则是在我们对应的BSP的头文件中定义了,如下:
CONFIG_EXTRA_ENV_SETTINGS
"netdev=eth0\0"
"ethprime=FEC0\0"
"bootfile=uImage\0"
"loadaddr=0x"
"rd_loadaddr=0x70D00000\0"
"bootargs=console=ttymxc0 init=/init " \
"androidboot.console=ttymxc0 video=mxcdi1fb:RGB666,XGA " \
"ldb=di1 di1_primary pmem=32M,64M fbmem=5M gpu_memory=64M\0" \
"bootcmd_SD=mmc read 0 ${loadaddr} 0x800 0x2000;" \
"mmc read 0 ${rd_loadaddr} 0x\0" \
"bootcmd=run bootcmd_SD; bootm ${loadaddr} ${rd_loadaddr}\0" \
再来看看check_recovery_mode这个函数中的代码,具体代码如下:
/* export to lib_arm/board.c */
void check_recovery_mode(void)
if (check_key_pressing())
setup_recovery_env();
else if (check_recovery_cmd_file()) {
puts("Recovery command file founded!\n");
setup_recovery_env();
可以看到在这里通过check_key_pressing这个函数来检测组合按键,当有对应的组合按键按下时,将会进入到recovery模式,这也正是各大android论坛里讲到刷机时都会提到的power+音量加键进入recovery模式的原因。那么check_recovery_cmd_file又是在什么情况下执行的呢?这个也正是这篇文章所要讲的内容之处。
先来看看check_recovery_cmd_file这个函数中的如下这段代码:
int check_recovery_cmd_file(void)
switch (get_boot_device()) {
case MMC_BOOT:
case SD_BOOT:
for (i = 0; i & 2; i++) {
block_dev_desc_t *dev_desc = NULL;
struct mmc *mmc = find_mmc_device(i);
dev_desc = get_dev("mmc", i);
if (NULL == dev_desc) {
printf("** Block device MMC %d not supported\n", i);
mmc_init(mmc);
if (get_partition_info(dev_desc, CONFIG_ANDROID_CACHE_PARTITION_MMC,
printf("** Bad partition %d **\n",CONFIG_ANDROID_CACHE_PARTITION_MMC);
part_length = ext2fs_set_blk_dev(dev_desc, CONFIG_ANDROID_CACHE_PARTITION_MMC);
if (part_length == 0) {
printf("** Bad partition - mmc %d:%d **\n", i, CONFIG_ANDROID_CACHE_PARTITION_MMC);
ext2fs_close();
if (!ext2fs_mount(part_length)) {
printf("** Bad ext2 partition or "
"disk - mmc %d:%d **\n",
i, CONFIG_ANDROID_CACHE_PARTITION_MMC);
ext2fs_close();
filelen = ext2fs_open(CONFIG_ANDROID_RECOVERY_CMD_FILE);
ext2fs_close();
主要来看看下面这个ext2fs_open所打开的内容,CONFIG_ANDROID_RECOVERY_CMD_FILE,这个正是上面所提到的rocovery cmd file的宏定义,内容如下:
#define CONFIG_ANDROID_RECOVERY_CMD_FILE
"/recovery/command"
当检测到有这个文件存在时,将会进入到setup_recovery_env这个函数中,其相应的代码如下:
void setup_recovery_env(void)
char *env, *boot_args, *boot_
int bootdev = get_boot_device();
boot_cmd = supported_reco_envs[bootdev].
boot_args = supported_reco_envs[bootdev].
if (boot_cmd == NULL) {
printf("Unsupported bootup device for recovery\n");
printf("setup env for recovery..\n");
env = getenv("bootargs_android_recovery");
/* Set env to recovery mode */
/* Only set recovery env when these env not exist, give user a
* chance to change their recovery env */
setenv("bootargs_android_recovery", boot_args);
env = getenv("bootcmd_android_recovery");
setenv("bootcmd_android_recovery", boot_cmd);
setenv("bootcmd", "run bootcmd_android_recovery");
在这里主要是将bootcmd_android_recovery这个环境变量加到uboot启动的environment中,这样当系统启动加载完root fs之后将不会进入到android的system中,而是进入到了recovery这个轻量级的小UI系统中。
下面我们来看看为什么在uboot的启动环境变量中加入bootcmd_android_recovery这些启动参数的时候,系统就会进入到recovery模式下而不是android system,先看看bootcmd_android_recovery相应的参数:
#define CONFIG_ANDROID_RECOVERY_BOOTARGS_MMC \
"setenv bootargs ${bootargs} init=/init root=/dev/mmcblk1p4"
"rootfs=ext4 video=mxcdi1fb:RGB666,XGA ldb=di1 di1_primary"
#define CONFIG_ANDROID_RECOVERY_BOOTCMD_MMC
"run bootargs_android_"
"mmc read 0 ${loadaddr} 0x800 0x2000;bootm"
可以看到在进入recovery模式的时候这里把root的分区设置成了/dev/mmcblk1p4,再来看看在系统烧录的时候对整个SD卡的分区如下:
sudo mkfs.vfat -F 32 ${NODE}${PART}1 -n sdcards
sudo mkfs.ext4 ${NODE}${PART}2 -O ^extent -L system
sudo mkfs.ext4 ${NODE}${PART}4 -O ^extent -L recovery
sudo mkfs.ext4 ${NODE}${PART}5 -O ^extent -L data
sudo mkfs.ext4 ${NODE}${PART}6 -O ^extent -L cache
这里NODE = /dev/mmcblk1为挂载点,PART = p或者为空,作为分区的检测。可以看出上面在给recovery分区的时候,用的是/dev/mmcblk1p4这个分区,所以当设置了recovery启动模式的时候,root根目录就被挂载到/dev/mmcblk1p4这个recovery分区中来,从而进入recovery模式。
关于android的recovery网上有各种版本的定义,这里我总结一下:所谓recovery是android下加入的一种特殊工作模式,有点类似于windows下的gost,系统进入到这种模式下时,可以在这里通过按键选择相应的操作菜单实现相应的功能,比如android系统和数据区的快速格式化(wipe);系统和用户数据的备份和恢复;通过sd卡刷新的rom等等。典型的recovery界面如下:
图2 recovery界面
Recovery的源代码在bootable/recovery这个目录下面,主要来看看recovery.c这个文件中的main函数:
Int main(int argc, char **argv) {
ui_init();
ui_set_background(BACKGROUND_ICON_INSTALLING);
load_volume_table();
while ((arg = getopt_long(argc, argv, "", OPTIONS, NULL)) != -1) {
switch (arg) {
case 'p': previous_runs = atoi(optarg); break;
case 's': send_intent = break;
case 'u': update_package = break;
case 'w': wipe_data = wipe_cache = 1; break;
case 'c': wipe_cache = 1; break;
case 'e': encrypted_fs_mode = toggle_secure_fs = 1; break;
case 't': ui_show_text(1); break;
LOGE("Invalid command argument\n");
device_recovery_start();
if (update_package)
// For backwards compatibility on the cache partition only, if
// we're given an old 'root' path "CACHE:foo", change it to
// "/cache/foo".
if (strncmp(update_package, "CACHE:", 6) == 0)
int len = strlen(update_package) + 10;
char* modified_path = malloc(len);
strlcpy(modified_path, "/cache/", len);
strlcat(modified_path, update_package+6, len);
printf("(replacing path \"%s\" with \"%s\")\n",
update_package, modified_path);
update_package = modified_
//for update from "/mnt/sdcard/update.zip",but at recovery system is "/sdcard" so change it to "/sdcard"
//ui_print("before:[%s]\n",update_package);
if (strncmp(update_package, "/mnt", 4) == 0)
//jump the "/mnt"
update_package +=4;
ui_print("install package from[%s]\n",update_package);
printf("\n");
property_list(print_property, NULL);
printf("\n");
int status = INSTALL_SUCCESS;
// Recovery strategy: if the data partition is damaged, disable encrypted file systems.
// This preventsthe device recycling endlessly in recovery mode.
if (update_package != NULL)
status = install_package(update_package);
if (status != INSTALL_SUCCESS)
ui_print("Installation aborted.\n");
erase_volume("/data");
erase_volume("/cache");
} else if (wipe_data) {
if (device_wipe_data()) status = INSTALL_ERROR;
if (erase_volume("/data")) status = INSTALL_ERROR;
if (wipe_cache && erase_volume("/cache")) status = INSTALL_ERROR;
if (status != INSTALL_SUCCESS) ui_print("Data wipe failed.\n");
} else if (wipe_cache) {
if (wipe_cache && erase_volume("/cache")) status = INSTALL_ERROR;
if (status != INSTALL_SUCCESS) ui_print("Cache wipe failed.\n");
status = INSTALL_ERROR;
// No command specified
if (status != INSTALL_SUCCESS) ui_set_background(BACKGROUND_ICON_ERROR);
//Xandy modify for view the install infomation
//if (status != INSTALL_SUCCESS || ui_text_visible())
if(status != INSTALL_SUCCESS)
prompt_and_wait();
// Otherwise, get ready to boot the main system...
finish_recovery(send_intent);
ui_print("Rebooting...\n");
reboot(RB_AUTOBOOT);
return EXIT_SUCCESS;
在这里首先完成recovery模式轻量级的UI系统初始化,设置背景图片,然后对输入的参数格式化,最后根据输入的参数进行相应的操作,如:安装新的ROM、格式化(wipe)data及cache分区等等;值得注意的是刷新ROM的时候,要制作相应的update.zip的安装包,这个在最后一章节讲述,这里遇到的一个问题是在recovery模式下sd卡的挂载点为/sdcard而不是android系统下的/mnt/sdcard,所以我在这里通过:
//for update from "/mnt/sdcard/update.zip",but at recovery system is "/sdcard" so change it to "/sdcard"
//ui_print("before:[%s]\n",update_package);
if (strncmp(update_package, "/mnt", 4) == 0)
//jump the "/mnt"
update_package +=4;
这样的操作跳过了上层传过来的/mnt这四个字符。另外一个值得一提的是,传入这里的这些参数都是从/cache/recovery/command这个文件中提取。具体对command文件的解析过程这里不再讲述,可能通过查看recovery.c这个文件中的get_args函数。
那么command这个文件是在什么情况下创建的呢?下面我们就来看看吧!
恢复出厂设置和固件升级
在android的系统设备中进入“隐私权-&恢复出厂设置-&重置手机”将为进入到恢复出厂设置的状态,这时将会清除data、cache分区中的所有用户数据,使得系统重启后和刚刷机时一样了。另外为了方便操作我们还可在“隐私权-&固件升级-&刷新ROM”这里加入了固件升级这一项。
在讲述这些内容之前,我们有必要来看看/cache/recovery/command这个文件相应的一些recovery命令,这些命令都由android系统写入。所有的命令如下:
--send_intent=anystring ―― write the text out to recovery.intent
--update_package=root:path —— verify install an OTA package file
--wipe_data —— erase user data (and cache), then reboot
--wipe_cache —— wipe cache (but not user data), then reboot
5.1 恢复出厂设置
在frameworks/base/services/java/com/android/server/masterClearReceiver.java
这个文件中有如下代码:
public class MasterClearReceiver extends BroadcastReceiver {
private static final String TAG = "MasterClear";
public void onReceive(final Context context, final Intent intent) {
if (intent.getAction().equals(Intent.ACTION_REMOTE_INTENT)) {
if (!"".equals(intent.getStringExtra("from"))) {
Slog.w(TAG, "Ignoring master clear request -- not from trusted server.");
Slog.w(TAG, "!!! FACTORY RESET !!!");
// The reboot call is blocking, so we need to do it on another thread.
Thread thr = new Thread("Reboot") {
public void run() {
if (intent.hasExtra("enableEFS")) {
RecoverySystem.rebootToggleEFS(context, intent.getBooleanExtra("enableEFS", false));
RecoverySystem.rebootWipeUserData(context);
Log.wtf(TAG, "Still running after master clear?!");
} catch (IOException e) {
Slog.e(TAG, "Can't perform master clear/factory reset", e);
thr.start();
当app中操作了“恢复出厂设置”这一项时,将发出广播,这个广播将在这里被监听,然后进入到恢复出厂设置状态,我们来看看rebootWipeUserData这个方法的代码:
public static void rebootWipeUserData(Context context) throws IOException {
final ConditionVariable condition = new ConditionVariable();
Intent intent = new Intent("android.intent.action.MASTER_CLEAR_NOTIFICATION");
context.sendOrderedBroadcast(intent, android.Manifest.permission.MASTER_CLEAR,
new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
condition.open();
}, null, 0, null, null);
// Block until the ordered broadcast has completed.
condition.block();
bootCommand(context, "--wipe_data");
我们可以看到在这里参入了“--wipe_data”这个参数,并把这条命令写入到command这个文件中去了,在进入recovery模式的时候解析到这条命令时就会清除data和cache中的数据了。
再来看看bootCommand这个方法里的代码:
private static void bootCommand(Context context, String arg) throws IOException {
RECOVERY_DIR.mkdirs();
// In case we need it
COMMAND_FILE.delete();
// In case it's not writable
LOG_FILE.delete();
FileWriter command = new FileWriter(COMMAND_FILE);
command.write(arg);
command.write("\n");
} finally {
command.close();
// Having written the command file, go ahead and reboot
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
pm.reboot("recovery");
throw new IOException("Reboot failed (no permissions?)");
其中COMMAND_FILE这个成员的定义如下:
/** Used to communicate with recovery.
See bootable/recovery/recovery.c. */
private static File RECOVERY_DIR = new File("/cache/recovery");
private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");
至此恢复出厂设置的命令就写入了recovery cmd file中去了,通过pm.reboot(“recovery”);重启系统,系统就自动进入到recovery模式自动清除用户数据后再重启系统。
5.2 固件升级
固件升级的流程和恢复出厂设置差不多,不同之处是入command这个文件中写入的命令不一样,下面是恢复出厂设置时的写命令的代码:
public static void installPackage(Context context, File packageFile)
throws IOException {
String filename = packageFile.getCanonicalPath();
Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!");
String arg = "--update_package=" +
bootCommand(context, arg);
这里的packageFile是由上层app传入的,内容如下:
File packageFile = new File("/sdcard/update.zip");
RecoverySystem.installPackage(context, packageFile);
这样当系统重启进入到recovery模式时将会自动查找sdcard的根目录下是否有update.zip这个文件,如果有将会进入到update状态,否则会提示无法找到update.zip!
至此我们已经明白了android的整个recovery流程,下面将讲讲update.zip也就是各大论坛里讲到的ROM的制作过程。
我们解压update.zip这个文件,可发现它一般打包了如下这几个文件:
ROM包中的内容
或者没有updates而是system这个目录,不同的原因是我这里在updates里放置的是system.img等镜像文件,这些文件都由源码编译而来。而如果是system目录,这里一般放的是android系统的system目录下的内容,可以是整个android系统的system目录,也可以是其中的一部分内容,如一些so库等等,这样为补丁的发布提供了一个很好的解决办法,不需要更新整个系统,只需要更新一部分内容就可以了!
来看看META-INF/com/google/android这个目录下的内容,在这里就两个文件,一个是可执行的exe文件update-binary,这个文件在进入update状态的用于控制ROM的烧入,具体的代码在recovery下的install.c文件中的try_update_binary这个函数中;另一个是updater-script,这个文件里是一些脚本程序,具体的代码如下:
# Mount system for check figurepoint etc.
# mount("ext4", "EMMC","/dev/block/mmcblk0p2", "/system");
# Make sure Check system image figurepoint first.
# uncomment below lines to check
# assert(file_getprop("/system/build.prop", "ro.build.fingerprint") == "freescale/imx53_evk/imx53_evk/imx53_evk:2.2/FRF85B/eng.b14.145340:eng/test-keys");
# assert(getprop("ro.build.platform) == "imx5x");
# unmount("/system");
show_progress(0.1, 5);
package_extract_dir("updates", "/tmp");
#Format system/data/cache partition
ui_print("Format disk...");
format("ext4","EMMC","/system");
format("ext4","EMMC","/data");
format("ext4","EMMC","/cache");
show_progress(0.2, 10);
# Write u-boot to 1K position.
# u-boot binary should be a no padding uboot!
# For eMMC(iNand) device, needs to unlock boot partition.
ui_print("writting u-boot...");
sysfs_file_write(" /sys/class/mmc_host/mmc0/mmc0:0001/boot_config", "1");
package_extract_file("files/u-boot.bin", "/tmp/u-boot.bin");
#ui_print("Clean U-Boot environment...");
show_progress(0.2, 5);
#simple_dd("/dev/zero","/dev/block/mmcblk0",2048);
simple_dd("/tmp/u-boot.bin", "/dev/block/mmcblk0", 2048);
#access user partition,and enable boot partion1 to boot
sysfs_file_write("/sys/class/mmc_host/mmc0/mmc0:0001/boot_config", "8");
#Set boot width is 8bits
sysfs_file_write("/sys/class/mmc_host/mmc0/mmc0:0001/boot_bus_config", "2");
show_progress(0.2, 5);
ui_print("extract kernel image...");
package_extract_file("files/uImage", "/tmp/uImage");
# Write uImage to 1M position.
ui_print("writting kernel image");
simple_dd("/tmp/uImage", "/dev/block/mmcblk0", 1048576);
ui_print("extract uramdisk image...");
package_extract_file("files/uramdisk.img", "/tmp/uramdisk.img");
# Write uImage to 1M position.
ui_print("writting uramdisk image");
simple_dd("/tmp/uramdisk", "/dev/block/mmcblk0", 6291456);
show_progress(0.2, 50);
# You can use two way to update your system which using ext4 system.
# dd hole system.img to your mmcblk0p2 partition.
package_extract_file("files/system.img", "/tmp/system.img");
ui_print("upgrading system partition...");
simple_dd("/tmp/system.img", "/dev/block/mmcblk0p2", 0);
show_progress(0.1, 5);
相应的脚本指令可在说明可对应源码可在recovery包中的install.c这个文件中找到。
在bootable/recovery/etc下有原始版的脚本代码update-script,但在recovery下的updater.c这个文件中有如下定义:
// Where in the package we expect to find the edify script to execute.
// (Note it's "updateR-script", not the older "update-script".)
#define SCRIPT_NAME "META-INF/com/google/android/updater-script"
所在使用这个原版的脚本的时候要将update-script更成updater-script,需要注意!
我们可以发现在bootable/recovery/etcMETA-INFO/com/google/android目录下少了一个update-binary的执行文件,在out/target/product/YOU_PRODUCT/system/bin下面我们可以找到updater,只要将其重名字为update-binary就可以了!
有了这些准备工作,我们就可以开始制作一个我们自己的ROM了,具体步骤如下:
Xandy@ubuntu:~$ mkdir recovery
Xandy@ubuntu:~$ cd recovery 然后将上面提到的bootable/recovery/etc下的所有内容拷贝到当前目录下并删掉init.rc这个文件
编译./META-INF/com/google/android/updater-script这个文件使达到我们想要的烧写控制,如果是烧写system.img这样的镜像文件,可以直接用我上面提到的updater-script这个脚本代码。
拷贝相应的需要制作成ROM的android文件到updates目录或者system目录下,这个得根据系统的需要决定。
Xandy@ubuntu:~/recovery$ mkdir res
Xandy@ubuntu:~/recovery$ ~/myandroid/out/host/linux-x86/framework/dumpkey.jar ~/myandroid/build/target/product/security/testkey.x509.pem & res/keys 这里创建一个目录用于存储系统的key值
zip /tmp/recovery.zip -r ./META-INF ./updates ./res 将所有文件打包
java -jar ./tools/signapk.jar -w ./tools/testkey.x509.pem ./tools/testkey.pk8 /tmp/recovery.zip update.zip 我在recovery目录下创建了一个tools目录,里面放置了sygnapk.jar、testkey.pk8、testkey.x509.pem这几个文件用于java签名时用
经过上面这几步之后就会在recovery目录生成一个update.zip的文件,这个就是我们自己制作的ROM文件,将它拷到sdcard的根目录下,在系统设置里操作进入到“固件升级状态”,等到系统重启时,就会看到已经开始自行格式化data和cache分区,稍后就开始出现进度条向相应分区里烧写uboot、kernel、android system的文件了!
图4 烧入新ROM
dengzhangtao
浏览: 252987 次
来自: 上海
楼主,我这里有个问题!我这里有个自己制作的font.ttf,这 ...
既然springMVC比struts好那么多的话那struts ...
楼上的很给力啊。。3Q
目前收集了160多个不错的Android开源项目汇总到 htt ...

我要回帖

更多关于 recovery可以删除吗 的文章

 

随机推荐