linux如何给手机刷recovery,教你修改RECOVERY文件教程---转帖原作者为小秋

编程知识 更新时间:2023-04-11 07:22:12

本帖最后由 旋律2014 于 2014-3-28 08:58 编辑

自从我root了A6390之后,就一直在想手机备份和刷机的问题.连续奋斗两周了,反复的在原生的recovery+第三方recovery上做修改、杂交、合成,测验,几乎把自己的recovery分区刷爆了,总算功夫不负有心人,至今大功告成!自制合成的第三方recovery功能强大,并能顺利通过S-on校验,备份rom,刷非官方包,升级非签名zip再无困难。从此之后,A6390界再无大战。

小秋   2011-11-15 23:50

######

前言

######

自从我发布A6390一键root之后,大家root的越来越多了,权限越大危险就越大,删错东西的人越来越多,手机变砖的也越来越多,连htc的客服都越来越忙了,开句玩笑话,我会不会被暗杀啊?呵呵,怎么办啊?强大的权力之下必须要有强大的保护措施与之相适应,把所有的rom的备份起来,删错了手机变砖了我们就再刷回来。然而官方自带的原生recovery功能太弱,根本做不到这些,所以为了保护大家的爱机一个功能强大的recovery出台实在是迫在眉睫啊!

大家都知道电脑用winCE做系统的ghost备份吧?启动另外一个小的系统,然后把电脑上的系统备份下来,当出了问题的时候再ghost回去。我们手机上的recovery其实就相当于这个小系统。

先说A6390自带的这个官方原生的recovery:

######################################官方原生的recovery  功能太少,简直*

######################################1。[进入recoery的方法]:

a.手机完全关机(即关机后拔电池3秒,然后再装上),或者先把设置-应用程序-快速启动的钩去掉然后关机。

b.按住音量下键,再按电源键。这时手机会进入Hboot模式。音量上下是选择,电源键是确定。

c.选择进入recovery。这时你会看到一个三角叹号。有人会被这个图形吓住,不敢动。我告诉你就算你等一天还是这个图形,因为还要按键。

d.按住音量上键,然后再按电源键。现在进入recovery见面了,界面标题是:Android system recovery <3e>,有四个选项依次是:重起,从SD卡更新,擦除DATA区和擦除cache区。

2。原生recovery的功能及局限:

可以看到原生的recovery,唯一可能有用的是“从SD卡更新”。这里我试过,局限很大:

a.文件名必须是updata.zip,并且放在SD根目录。

b.这个updata.zip必须是官方发布的,也就是要进行官方签名认证。有心的人肯定试过,哪怕是官方发布的包,只要对里面内容做一点修改,签名就破坏掉了,也就不能用了。据我所知,除了1.8升2.0官方还没有其他的升级包可用,更何况就算这个包也没泄露出来过。

c.只能升级,不能降级。这就是为什么有的人升成2.0的了,想用官方1.8的包救命救不了的原因。##############################第三方recovery 没有A6390能用的

##############################

既然原生的recovery不好用,那我们装第三方的recovery把,网上到处都是,最著名例如:recovery-clockwork和4EXTRecovery等等,这些可不可以直接拿来用呢?有心的人又会发现,这些recovery不是通用的,不同的机型对应着不同的recovery,可是网上任何地方都找不到A6390可用的啊!但是,不试试我是不会死心的,于是我试了网上不同机型的2、3十个不同的版本,最后彻底死了直接用第三方recovery的心。

这里要说一下,怎么[刷第三方recovery]:

1。因为我们A6390依然是s-on,所以不能通过fastboot直接刷recovery。

2。因为我们原生的recovery只认官方签名的升级包,所以我们不能通过recovery来升级到第三方recovery。

3。所以我们剩下一个办法了,用root权限刷recovery。

a.首先是取得root权限咯,(怎么取得?看我另外一个帖子。)

b.下载解压刷写程序:flash_image(见附件),并放到adb所在目录中,以我的一键root包为例,既放到adbtools中。

c.下载第三方recovery放在相同目录下,假设文件名为:recovery.img。

d.连接手机到电脑,并打开调试模式,在电脑上运行cmd命令,cd到相关目录下,然后运行:E:\adbtools>adb push .\flash_image /sdcard/E:\adbtools>adb push .\recovery.img /sdcard/E:\adbtools>adb shell$su              (有的可能此处需要到手机确认赋予root权限)#mount -o remount rw /system

#cat/sdcard/flash_image>/system/bin/flash_image

#rm/sdcard/flash_image

#chmod 755 /system/bin/flash_image

#chown root.shell/system/bin/flash_image

#cd /sdcard

#flash_image recovery recovery.img

然后回现实刷写进程,几秒之后回到# 。我按照上述方法刷过2、3十个不同的第三方recovery,都可以正常刷入,重起进入recovery时停在G3第一屏。如果要恢复官方的recovery可以按照上诉方法把官方的recovery.img刷入即可,可以正常的恢复到三角叹号。最后的结论是:在root权限下,recovery可以刷入,问题是刷入的第三方recovery都不适合我们的A6390,所以我们只能自制属于我们A6390recovery了。

######################################

#####    自制A6390的recovery  ########

#########################################背景知识####

boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用 gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。boot是正常引导手机系统的,recovery是在boot的基础上增加了一些功能。他们的img结构如下:

** +-----------------+

** | boot header | 1 page

** +-----------------+

** | kernel | n pages

** +-----------------+

** | ramdisk | m pages

** +-----------------+

** | second stage | o pages

** +-----------------+

**

其中ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。

如果你您很擅长使用16进制编辑器的话,你您可以打开boot.img或者recovery.img,然后跳过开始的2K的头数据,然后寻找一大堆0的数 据,在这一堆0的数据后面,紧跟着1F 8B这两个数字(1F 8B是gzip格式的文件的结束标记)。从此文件开始的地方(跳过2K的头),一大堆0后面紧跟着到1F 8B这两个数字为止的全部数据,就是gzip压缩过的linux内核。从1F 8B后面紧跟着的数据一直到文件的结尾包含的全部数据,就是ramdisk内存盘的数据。你可以把把内核和ramdisk两个文件分别保存下来,在进行 分别的修改和处理。###自制recovery的方法####

这里我在附件里提供了几个方便的函数,(程序来自于:北京理工大学 20981 陈罡chinaunix博客。这些函数是在linux下面用的,当然也有对应的windows下的程序大家可以自己找,由于windows的文件名不区分大小写,不支持软连接,所以我建议大家最好还是在linux环境下改写recovery.img.

下载split_bootimg.zip文件,在此zip文件中包含一个perl文 件,split_bootimg.pl脚本,该脚本可以读取recovery.img头将kernel和 ramdisk读取出来,此脚本也会输出内核命令行和板子名字。下面是一个仅是一个解包recovery.img的例子:% ./split_bootimg.pl recovery.img

Page size: 2048 (0x00000800)

Kernel size: 1388548 (0x00153004)

Ramdisk size: 141518 (0x000228ce)

Second size: 0 (0x00000000)

Board name:

Command line: no_console_suspend=1

Writing recovery.img-kernel ... complete.

Writing recovery.img-ramdisk.gz ... complete.

解包ramdisk的命令如下:

% mkdir ramdisk

% cd ramdisk

% gzip -dc ../recovery.img-ramdisk.gz | cpio -i

% cd ..

解码完毕后,就可以修改了,主要的工作在这里,这里是自制的地方。(例如,在default.prop设置ro.secure=0等等)

使用mkbootfs工具来重新创建ramdisk,可以使用如下命令来操作:

% mkbootfs ./ramdisk | gzip > ramdisk-new.gz

使用mkbootimg来重新创建recovery-new.img:

% mkbootimg --cmdline ´no_console_suspend=1 console=null´ --kernel recovery.img-kernel --ramdisk ramdisk-new.gz -o recovery-new.img

到此我们就得到了一个新的recovery-new.img,然后我们按照上面讲的刷入第三方recovery的方法刷入就可以验证刚做的recovery了。###自制A6390的recovery####

接着开始自制我们A6390的recovery吧,下面步骤写起来简单其实每一步在这两周内我都反复的做了无数次,经过反复的试验才总结出来的真的是辛苦啊:

1。从官方包,解压出原生的recovery.img。(1.8的官方包在群共享里面有)

2。按照上面解img的方法,解出原生recovery包的内核recovery.img-kernel和ramdisk内存镜像,再把ramdisk内存镜像解包,我们要在这个基础上作修改。

3。找到合适的功能比较好的第三方recovery包,比如以G6的recovery-clockwork-5.0.2.0.img为例,同样解出其内核kernel和ramdisk内存镜像,再把ramdisk内存镜像解包,我们需要这个包内的有用文件。

4。准备新recovery的内核,我们使用官方原生包的recovery.img-kernel,只有原生的内核才能跟匹配我的手机硬件。

5。修改ramdisk内存盘,其内文件列表大致如下:./init.trout.rc

./default.prop

./proc

./dev

./init.rc

./init

./sys

./etc

./init.goldfish.rc

./sbin

./system

./data

1)default.prop,是一定要改的,可以参照第三方的改,最关键的:

ro.secure=0                      关闭保护

ro.allow.mock.location=1

ro.debuggable=1                  调试模式开

persist.service.adb.enable=1     adb远程开

2)/sbin里面所有的文件都替换成第三方包里面的,特别是其中有个recovery文件,所有的第三方功能都在这个recovery中实现。

3)/etc里的recovery.fstab,是挂载表,可以提供sd卡ext分区支持。

4)/init可以用原生的,我试过第三方的也行。

6。按照上面打包ramdisk的方法打包新改的ramdisk内存盘。

7。按照上面打包img的方法打包生成新的recovery-new.img。

正常情况下,到这一步我们自制的recovery.img就做好了,可是按上面刷recovery的方法刷入手机了,可是别忘了我们的A6390依然是S-ON。这就意味着Hboot会对recovery进行校验,如果校验不对,那么对不起,你别想启动手机。我就是在这里点上跌倒了,爬起来,奋斗的吐了血!最终我发现了HTC A6390 S-ON验证的秘密:

还记得上面说img的2K的文件头么?秘密就在这里,可惜不能直接贴图,具体操作如下:[——现在看来这段话以及下面的8、9、10三步的分析是有问题的,但是操作虽然怪异结果却是正确的,正确的分析以及正常的操作,请看下面我11.27日的补充。小秋 2011.11.29 注]

8。用UltraEdit-32(或者其他16进制编辑器)打开刚改好生成的recovery-new.img,记住第二行的前三个字节(10h的0、1、2三个),一会儿有用。

9。再打开手机原生的recovery.img。对比来两个文件的文件头,把原生的前16行(000h-100h)复制到新的recovery上覆盖。这个就是S-on校验的内容,直接生成的img启动不了就是因为这里通不过校验。

10。最后把新的recovery-new.img,第二行的前三个字节改回到刚才记下的三个值,保存就OK了。这一步很关键,我一直是在此处徘徊的,最初我只保留前两个字节,造成只要对原生img一改动得稍大一点就启动不了。总之这里的三个值很关键,好像跟img的大小有关系,如果不对的话新的recovery绝对启动不了。

###刷入自制的A6390-recovery####

1。关于怎么刷入新的recovery,往上面看,按照[刷第三方recovery]的方法刷。

2。关于怎么进recovery模式,也往上看,按照官方原生的[进入recoery的方法]进。

3。授人以鱼不如授人以渔,说了这么多无非是想让大家知道怎么自己做自己的recovery,不一定是A6390的,其他的也照例能做。但是考虑到有些小白们看了也不会做,我把自制的A6390的recovery放到附件里面,供大家使用哦。

#####其他####

再说一点,关于解S-ON的问题:

1。这可是HTC的最后一道关,加密得很严的,哪有那么容易的。

2。除非是硬解,拆开机子,到也不是很难。

3。我个人觉得,既然recovery搞定了,要备份能备份,要刷机能刷机,所有想干的都能干了,还在乎s-on,干什么阿。

4。s-on还是有好处的,再怎么折腾,也能保修,呵呵##### 小秋 2011.11.27 最新补充 ####

关于基址 base的计算方法

boot.img recovery.img还有一个重要的参数,基址 base,用于告诉手机从哪个地址开始,是准备给内存盘的入口,哪个地址是给kernel的入口。如果你对不上号,对不起,不能不能启动手机。

在android系统ROM的boardconfig.h中存在地址偏移的define:

#define PHYSICAL_DRAM_BASE 0x00200000                                    //这就是定义基址,各手机是不一样的

#define KERNEL_ADDR (PHYSICAL_DRAM_BASE + 0x00008000)          //内核地址

#define RAMDISK_ADDR (PHYSICAL_DRAM_BASE + 0x01000000)       //散存盘地址

#define TAGS_ADDR (PHYSICAL_DRAM_BASE + 0x00000100)

#define NEWTAGS_ADDR (PHYSICAL_DRAM_BASE + 0x00004000)

boot.img是怎么打包在一起的呢?找到bootimg.c文件,看吧。 header + padding + kernel + padding + ramdisk + padding + ...

所以一个boot.img或者recovery.img开头的结构具体如下:

4 * 2, magic,固定为"ANDROID!"

4 * 1, kernel长度,小端unsigned类型

4 * 1, kernel地址,应为base + 0x00008000

4 * 1, ramdisk长度,小端unsigned

4 * 1, ramdisk地址,应为base + 0x01000000

4 * 1, second stage长度,小端unsigned,为0

4 * 1, second stage地址,应为base + 0x00f00000

4 * 1, tags地址,应为base + 0x00000100

4 * 1, page大小,小端unsigned, 为2048或者4096

4 * 2, 未使用,固定为0x00

4 * 4, 板子名字,一般为空

4 * 128, 内核命令参数,一大串

4 * 8, id,不知道啥玩意,0x00

以我们官方原生的recovery为例,如下图:

1.jpg (80.38 KB, 下载次数: 84)

2014-2-18 10:33 上传

从图中我们可以知道: 41 4E 44 52 4F 49 44 21 就是Magic Number ,内容是固定的ANDROID!。一一对应

kernel_size就是D4 C9 31 00 -->0x0031C9D4。注意,小端读法。是Byte内,顺读,整个类型中,逆读。

kernel_addr即00 80 40 80 -->0x 80408000。根据 KERNEL_ADDR (PHYSICAL_DRAM_BASE + 0x00008000),所以PHYSICAL_DRAM_BASE=0x80400000.

ramdisk_size是:D3 25 10 00 -->0x001025D3。

ramdisk_addr即00 00 40 81 -->0x81400000。根据RAMDISK_ADDR (PHYSICAL_DRAM_BASE + 0x01000000),所以PHYSICAL_DRAM_BASE=0x80400000.

second_stage size:00000000

second_stage addr:00 00 30 81 -->0x81300000.根据RAMDISK_ADDR (PHYSICAL_DRAM_BASE + 0x00f00000),所以PHYSICAL_DRAM_BASE=0x80400000.

tags_addr:00 01 40 80 -->0x80400100.根据TAGS_ADDR (PHYSICAL_DRAM_BASE + 0x00000100),所以PHYSICAL_DRAM_BASE=0x80400000.

page_size:00 80 -->0x0800.这是页长。页长一般都为1K(1024)的整数倍吧,此处页长是0x0800,转为十进制,则是2048

根据上面的计算咱们A6390/A6388的基址为:PHYSICAL_DRAM_BASE=0x80400000

同时我们在图上还能看到,传入内核的参数为:

´rootwait console=ttyS2,115200n8 videoout=omap24xxvout omapfb.vram=0:2M omap_vout.vid1_static_vrfb_alloc=y omap_vout.video1_numbuffers=6 omap_vout.vid2_static_vrfb_alloc=y omap_vout.video2_numbuffers=6´

综上,我们在打包A6390/A6388的boot.img或recovery.img时,使用mkbootimg的具体参数为:

./mkbootimg --cmdline ´rootwait console=ttyS2,115200n8 videoout=omap24xxvout omapfb.vram=0:2M omap_vout.vid1_static_vrfb_alloc=y omap_vout.video1_numbuffers=6 omap_vout.vid2_static_vrfb_alloc=y omap_vout.video2_numbuffers=6´ --kernel recovery.img-kernel --ramdisk ramdisk-new.gz --base 0x80400000 -o boot-new.img

其中recovery.img-kernel为新内核;ramdisk-new.gz为新的内存盘;boot-new.img为生成的新img.

按照此方法打包的boot.img或recovery.img因为基址和内核参数都正确可以直接在A6390/A6388上使用,不用做任何修改.

即不用做上面"自制A6390的recovery"的第8、9、10步。这三步在当时做的时候虽然可用了,但是不知为啥可用,现在总算解释清楚了

更多推荐

linux如何给手机刷recovery,教你修改RECOVERY文件教程---转帖原作者为小秋

本文发布于:2023-04-10 01:28:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/3886b5a842d724bbbdcc2b3494cd3c39.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:小秋   转帖   教你   原作者   文件

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 62970文章数
  • 14阅读数
  • 0评论数