本帖最后由 旋律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文件教程---转帖原作者为小秋相关推荐

  1. Linux下Android手机刷机指南

    本指南将会以Moto Defy为例告诉你关于Android刷机的一切相关知识,我会尽全力来向你解释这款手机如何工作,怎么去Root,怎么安装SBF.最重要的是:这些固件如何起作用,这样你就不会因为安装 ...

  2. linux如何给手机刷recovery,给安卓手机刷Recovery的方法

    给安卓手机刷Recovery的方法 给安卓手机刷Recovery(恢复模式)的方法有许多,一般采用的都是通过数据线连接电脑完成.这次带来的则是完全不用连接电脑的安卓手机卡刷Recovery教程. 卡刷 ...

  3. linux系统的手机刷机包,自己动手制作个性化Linux操作系统手机刷机包

    自己动手制作个性化Linux操作系统手机刷机包 本程序用于编辑 Linux 操作系统手机刷机包,运行环境为 Windows XP/2003/Vista.使用该程序可以对 Linux 操作系统手机刷机包 ...

  4. 小米5升级Linux内核,小米5 刷机LineageOS 14.1的详细教程

    小米5 刷机LineageOS 14.1的详细教程 1,准备 platform-tools Mac/Linux/windows 会简单的命令行命令 2,解锁你的小米设备 3,Installing a ...

  5. 三星手机如何分屏_三星安卓手机如何刷机 三星安卓手机刷机通用方法介绍【图文教程】...

    三星安卓手机,通用刷机教程,希望对大家能有所帮助! 工具/原料 电脑.数据线.手机电源充足 步骤/方法 首先要在你的电脑上安装好对应手机的驱动 驱动安装完毕,这时候要确认你的手机是处于关机状态.(建议 ...

  6. linux误修改文件名恢复,如何在 Linux 中找出最近或今天被修改的文件-linux修改文件名...

    Linux 用户在命令行上遇到的常见问题之一是定位具有特定名称的文件,如果你知道确定的文件名则可能会容易得假设你忘记了白天早些时候创建的文件的名称(在你包含了数百个文件的 home 文件夹中),但现在 ...

  7. LG su760手机刷机,降级,救砖教程

    su760 4.0官方测试版ROM已流出,版本代号V29B.马上刷机,可没想到开机时卡在开机动画,而且RE也无法进入.昨天研究了一上午终于可以进系统了,但发现不能刷会旧版的系统,心有不甘.今天下午灵感 ...

  8. linux系统修改hosts文件教程

    用管理员帐号登录linux系统(默认是root帐号) 输入如下命令,编辑hosts文件 vi /etc/hosts 按下Insert键,可以见到窗口左下角有"Insert"字样,表 ...

  9. linux 在终端修改文件,linux命令行学习(42):修改.bashrc文件

    可以通过修改启动文件改变环境. 下面通过修改.bashrc来改变环境,具体地说,就是在.bashrc中加入四条命令. 一..bashrc文件中原有的内容 我的centos系统中,普通用户主目录中的.b ...

最新文章

  1. 流网络的最小割问题c语言,「网络流24题」最小路径覆盖问题
  2. REST API出错响应的设计(转)
  3. linux adb 点击屏幕,ADB 操作命令(二)
  4. 内存中原码,反码,补码,查看数值范围,,或,异或,取反,左右移位操作
  5. the server did not provide any additional information
  6. linux 修改jmeter内存溢出,jmeter本机内存溢出如何修改?
  7. Win11系统怎么取消登录密码 Win11取消登录密码图文教程
  8. Async/Await FAQ
  9. mysql盲注ascii_[翻译]关于通过对8bit的ascii做右位移提高mysql盲注效率
  10. Alfred Remote初体验
  11. LODOP不同电脑打印效果不同排查
  12. 获取客户端访问的ip地址
  13. App Store、Steam、Google Play等出海应用、游戏如何收款到国内账户
  14. java坦克大战墙_坦克大战 - java代码库 - 云代码
  15. 反爬虫策略分析及处理
  16. SylixOS移植Redis库总结
  17. 蓝桥杯入门练习题斐波那契数列
  18. Heterogeneous Graph Neural Network(异质图神经网络)
  19. Laravel Collect集合用pluck取多维数组中某个字段值
  20. vue vue-element-ui组件 eltable 表头背景颜色

热门文章

  1. matlab如何仿真斜坡信号,单斜坡ADC的Matlab/Simulink建模问题
  2. MySQL导入数据库1118错误解决方案[ERR] 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB
  3. B-ICE-EDA/SOPC FPGA创新电子教学实验平台
  4. 刷机升级Android版本,ROM之家简析:Android手机系统怎么升级
  5. 安卓机更新系统会卡吗_手机经常提示系统升级,到底要不要升级,看完你就明白了!...
  6. 自媒体平台大鱼号怎样开通视频原创保护,原创证明材料如何写?
  7. android 粗暴简单仿美团/大众点评搜索方式,详细标注
  8. GPS从入门到放弃(六) --- 开普勒轨道参数
  9. 夏目友人帐之撸猫动作倒放
  10. B2G:来自Web平台的挑战者