Linux内核镜像包含了内核二进制(zImage)和内存磁盘镜像(ramdisk.img),一般对应的镜像文件是boot.img(也可以是任何其他的名字)。由于ramdisk.img中包含的init命令是与Linux内核第一个交互的程序,所以在boot.img中需要同时包含Linux内核(zImage)和ramdisk.img。当Linux内核调用init后,系统就会根据init.rc及其相关文件的代码对整个Android系统进行初始化。其中主要的初始化工作就是建立如/system、/data、等系统目录,然后使用mount命令将相应的镜像挂载到这些目录上。
Android源代码经过编译后,也可以在其中找到对boot.img解压和生成boot.img文件的命令。
其中unpackbooting 为解压命令,mkbooting命令可以将zImage和ramdisk.img文件合并成boot.img。下面先来用unpackbooting命令将boot.img解压,再看看boot.img是不是有zImage和ramdisk.img文件组成的。
假设boot.img文件(我们可以使用从其他Rom压缩包中获得的boot.img,也可以使用通过Android源代码生成的boot.img)在当前目录中,使用下面的命令可以将boot.img文件解压到boot目录中。
mkdir boot
cd boot
unpackbootimg -i ../boot.img
执行完上面的命令后,会发现boot目录中多了几个文件,其中有两个主要的文件:
boot.img-zImage 和boot.img-ramdisk.gz。前者是Linux 内核文件(与zImage文件完全一样),后者是内存磁盘镜像(与ramdisk.img完全一样)。为了证明boot.img-ramdisk.gz 与ramdisk.img文件完全相等,可以使用下面的命令将boot.img-ramdisk.gz 解压到ramdisk目录。
mkdir ramdisk
cd ramdisk
gunzip -c ../boot.img-ramdisk.gz | cpio -i
目录结构与ramdisk.img 一样
、如果想向init.rc或娶她文件中添加新的内容,或在内存磁盘镜像中添加新的命令,可以修改刚才由boot.img-ramdisk.gz 文件解压生成的ramdisk目录中的相应文件和目录的内容,然后使用下面的命令重新将ramdisk目录中的相应文件和目录的内容,然后使用下面的命令重新将ramdisk打包成boot.img-ramdisk.gz.new(当前目录是ramdisk)。
mkbootfs . " minigzip > ../boot.img-ramdisk.gz.new
接下来推到上一层目录,然后使用下面的命令将boot.img-zImage 和boot.img-ramdisk.gz.new
文件合并成boot.img.new 文件(为了区分boot.img,这里生成了boot.img.new 文件)。
mkbootimg --kernel boot.img-zImage --ramdisk boot.img-ramdisk.gz.new -o boot.img.new
如果想修改Linux内核,需要下载Linux内核源代码(官方和CM都提供了相应Android设备的Linux内核源代码)
接下来退到上一层目录,然后使用下面的命令将boot.img-zImage 和boot.img-ramdisk.gz.new
现在可以使用下面的命令重新刷Linux内核(加上Android系统处于正常启动状态,并通过USB线和PC相连)。不过要注意的是Linux内核必须与当前Android设备匹配,否则刷完后Android设备有可能起不来。刷Linux内核不会对系统(system.img)和用户数据(userdata.img)造成任何影响。
adb reboot bootloader
fastboot flash boot boot.img,new
fastboot reboot
重启Android设备后,如果我们修改了Linux内核和内存磁盘镜像,就会立刻生效
注意:
(boot.img解压后,除了生成boot.img-zImage和boot.img-ramdisk.gz文件外,还会生成一些其他的文件,如boot.img-base、boot.img-cmdline、boot.img-pagesize等,这些文件都是一些配置文件。例如,boot.img-cmdline文件中包含了Linux内核启动时传入的参数。通常并不需要管这些文件,只需要保持默认值即可)。