基础知识
先来看一下Android设备的系统架构图:
最底层是各种硬件设备,往上一层是Bootloader。Bootloader是什么概念呢?我们都知道,PC主板上有一段小程序叫做BIOS,主板加电时它是第一个跑起来的程序,负责初始化硬件,以及将OS启动起来。在嵌入式世界里(手机也属于嵌入式设备),也有一段类似BIOS的程序,不过它不叫BIOS,而是叫Bootloader。使用最广泛的Bootloader是一个叫uboot的程序,它支持非常多的体系结构。经过编译后,uboot会生成一个uboot.bin镜像,将这个镜像烧到设备上的一个特定分区去,就可以作为Bootloader使用了。
Bootloader支持交互式启动,也就是我们可以让Bootloader初始化完成硬件之后,不是马上去启动OS,而是停留在当前的状态,等待用户输入命令告诉它接下来该干什么。这种启动模式就称为Fastboot模式。对于Android设备来说,我们可以通过adb reboot bootloader命令来让它重新启动并进入Fastboot模式中去。
在讨论Fastboot模式之前,我们先了解一下嵌入式设备的ROM结构。通常,一个能够正常启动的嵌入式设备的ROM包含以下四个分区:
1. Bootloader分区,也就是存放uboot.bin的分区。
2. Bootloader用来保存环境变量的分区。
3. Kernel分区,也就是存放OS内核的分区。
4. Rootfs分区,也就是存入系统地一个进程init对应的程序的分区。
当设备处于Fastboot模式时,我们可以通过另一个工具fastboot来让设备执行指定的命令。对搞机者来说,最常用的命令就是刷人各种镜像文件了。例如,往Kernel分区和Rootfs分区刷人指定的镜像。
对于Android设备来说,当它处于Fastboot模式时,我们可以将一个包含有Kernel和Rootfs的Recovery.img镜像通过fastboot工具刷入到设备上一个称为Recovery的分区去,这个过程就叫做刷Recovery了,它也是属于刷ROM的一种。由于Recovery分区包含有Kernel和Rootfs,因此将Recovery.img刷入到设备后,我们就可以让设备正常的启动起来了。这种启动方式就称为Recovery模式。对于Android设备来说,我们可以通过adb reboot recovery命令让它进入到Recovery模式中去。
当设备处于Recovery模式时,我们可以做些什么呢?答案是取决于刷人的Recovery.img所包含的Rootfs所包含的程序。更准确地说,是取决于Rootfs镜像里面的init程序都做了些什么事情。不过顾名思义,Recovery就是用来恢复系统的意思,也包含有更新系统的意思。这里所说的系统,是用户正常使用的系统,里面包含有Android运行时框架,使得我们可以在上面安装和使用各种APP。
用户正常使用Android设备时的系统,主要是包含两个分区:System分区和Boot分区。System分区包含有Android运行时框架、系统APP以及预装的第三方APP等,而Boot分区包含有Kernel和Rootfs。刷入到System分区和Boot分区的两个镜像称为system.img和boot.img。
下载米2s的标准版rom
选择线刷包下载即可
解压和打包boot.img
解压完成后,在aries_images_4.7.4_4.1_cn/images目录下可以得到system.img文件和boot.img文件
tar -zxvf aries_images_4.7.4_4.1_cn_3cb6d39979.tgz
解压boot.img
解压工具地址:http://code.google.com/p/zen-droid/downloads/detail?name=split_bootimg.pl ,我存放在~/bin/目录下
在rom解压出来的images目录下执行如下命令:
~/bin/split_bootimg.pl boot.img
解压完之后会发现多出来两个文件:boot.img-kernel和boot.img-ramdisk.gz,这就是解压出来的boot.img,其中:
- boot.img-kernel : 这就是内核
- boot.img-ramdisk.gz : 是ramdisk,对应的源码编译目录为out/target/product/generic/root/
分解ramdisk
打包boot.img
替换完ramdisk的内容就可以进行打包操作了,打包需要用到三个工具,分别是unpackbootimg、mkbootfs和mkbooting。下载地址可以直接google搜索
unpackbootimg获取boot.img参数
1. 使用方法
usage: unpackbootimg -i | --input boot.img [-o | --output output_directory]
2. 示例
mkbootfs打包ramdisk
mkbootfs ramdisk/ | gzip >ramdisk-new.gz
mkbooting生成boot.img
1. 使用方法
usage: mkbootimg
--kernel <filename>
--ramdisk <filename>
[ --second <2ndbootloader-filename> ]
[ --cmdline <kernel-commandline> ]
[ --board <boardname> ]
[ --base <address> ]
[ --pagesize <pagesize> ]
-o | --output <filename>
2. 示例
解压和打包system.img
接下来,会讲到另一个重要的img文件,system,img
解压system.img
解压system.img使用的是simg2img工具,命令如下:
simg2img system.img system.img.ext4
为system.img.ext4创建挂载目录tmp
mkdir tmp
挂在system.img.ext4到tmp目录
sudo mount -t ext4 -o loop system.img.ext4 tmp/
修改system目录
一般是根据移植rom的init.rc文件进行对比,然后修改system目录
打包system.img
使用如下命令将tmp目录重新打包成system.img文件
make_ext4fs -s -l 1024M -a system system-new.img tmp/
参数注解:
- -s : 生成ext4的s模式
- -l : 指定system的分区大小
- -a : 指定这个img用于android系统,挂载分区为system
解压和打包userdata.img
最后一步,解包和打包userdata.img文件,这个跟解包打包system.img文件是类似的操作
解压userdata.img
解压userdata.img文件也是使用simg2img工具,命令如下:
simg2img userdata.img userdata.img.ext4
为userdata.img创建挂载目录data
mkdir data
挂在userdata.img.ext4到data目录
sudo mount -t ext4 -o loop userdata.img.ext4 data/
打包userdata.img
还是使用make_ext4fs工具,注意挂载点是data分区
Rom移植经验
说实在的,我移植rom到大神F1将近一个星期了,目前连开机画面都看不到,很伤心有没有!!但是还是要分享一下Rom移植过程中学到的知识点。
/system/app目录
存放内置软件的地方,在移植上除了USB.apk必须用自己的版本之外,其他的都可以用相应rom包的apk进行替换。
/system/framework目录
系统架构结构文件目录,这个目录下是系统服务和系统界面所在地,一般不可以单独替换,要移植的话必须全部替换,不然会卡在开机动画那里。
/system/font目录
字体文件夹,建议只增加不删除
/system/lib目录
该文件夹是系统所需要用到的驱动,库文件的所在,如果卡在开机画面了,一般是lib替换的问题,这里介绍一下我目前了解的lib库文件。