★
1、背景知识Android手机的文件系统有许多存储器组成,以下是在adb shell下面的输出:
#cat /proc/mtddev: size erasesize name
mtd0: 00040000 00020000"misc"
mtd1: 00500000 00020000"recovery"
mtd2: 00280000 00020000"boot"
mtd3: 04380000 00020000"system"
mtd4: 04380000 00020000"cache"
mtd5: 04ac0000 00020000"userdata"
**************************************
注意,不同的手机在上述存储设备的顺序可能会各不相同!一定要检查您的手机,
确定在以下的操作中选择正确的设备号(mtdX,这个X的序号一定要检查清楚),Z1i高阶教程个性RO制作教程
。
**************************************
在本向导中,我们主要描述对"recovery"和"boot"的存储设备进行操作;
"system"存储设备保存了android系统目录的所有数据
(在系统启动后会挂载到“system/”目录);
“userdata”存储设备将保存了android数据目录中的所有数据
及用户的preference之类的配置数据)。
从上面的输出可以看出来,
recovery和boot分区对应着/dev/mtd/mtd1和/dev/mtd/mtd2,
在你您开始做任何修改之前一定要做两件事情,第一件事情,一定要先对这两个分区进行备份。
可以使用如下命令进行备份:
# cat /dev/mtd/mtd1 > /sdcard/recovery.img
# cat /dev/mtd/mtd2 > /sdcard/boot.img
(注意added by lxros,
只有手机获取了ROOT权限以后才能够执行上述的备份命令)
第二件事情,你您应该把你您最喜欢的update.zip刷机包放置到你您的sd卡的根目录上面。
如此一来,即使你您在后续的操作中出了问题,也可以启动到recovery模式进行恢复。
另外一个你您需要知道的重要文件是在android系统目录下的/system/recovery.img,
此文件是mtd1存储设备的完全拷贝。这个文件在每次关机的时候,会自动地被写回到mtd1存储
设备里面。
这会意味着两个事情:
(1)任何对/dev/mtd/mtd1中数据的直接修改都会在下一次重启手机以后消失。
(2)如果希望对/dev/mtd/mtd1进行修改,
最简单的做法是用你您自己的recovery.img替换掉/system/recovery.img。
当你您创建自己的update.zip刷机包的时候(特别是在做刷机包的适配的时候),
如果你您忘记替换这个/system/recovery.img,
这个recovery.img就会在关机的时候被烧写到mtd1里面去或许会变砖。
一定要注意这一点!(译者的话,关于这个/system/recovery.img文件,
在2.1的android的平台里面并没有找到,或许这个机制已经out了?!
或者偶本人对这段话的理解不够深入?!希望明白的朋友不吝斧正)
2、boot和recovery映像的文件结构boot和recovery映像并不是一个完整的文件系统,
它们是一种android自定义的文件格式,该格式包括了2K的文件头,
后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,
然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分),电脑资料
《Z1i高阶教程个性RO制作教程》(https://www.unjs.com)。
此类文件的定义可以从源代码android-src/system/core/mkbootimg找到
一个叫做bootimg.h的文件。(译者的话,原文是一个叫做mkbootimg.h的文件,
但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。
/*
** +-----------------+
** | boot header | 1 page
** +-----------------+
** | kernel | n pages
** +-----------------+
** | ramdisk | m pages
** +-----------------+
** | second stage | o pages
** +-----------------+
**
** n = (kernel_size + page_size - 1) / page_size
** m = (ramdisk_size + page_size - 1)/ page_size
** o = (second_size + page_size - 1) / page_size
**
** 0. all entities are page_size aligned in flash
** 1. kernel and ramdisk are required(size != 0)
** 2. second is optional (second_size== 0 -> no second)
** 3. load each element (kernel, ramdisk, second) at
** the specified physical address (kernel_addr, etc)
** 4. prepare tags at tag_addr. kernel_args[] is
** appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
** else: jump to kernel_addr
*/
**************************************
ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,
例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。
如果你您希望了解更多关于此文件的信息可以参考以下网址:
http://git.source.android.com/?p=kernel/common.git;a=blob;
f=Documentation/filesystems/ramfs-rootfs-init