首页 > 代码库 > Android ROM移植

Android ROM移植

  我们关注的Android ROM的移植是从源码级别的编译,但是从零开始从AOSP源码中编译出能在自己使用的手机上运行的系统,却不是一件容易的事情,因为Google所提供的支持的机型太少。不过,我们可以利用现成的第三方ASOP开源项目来进行我们的Android ROM移植,他们已经适配了大量的第三方机型,并且也进行了自己的优化。最著名的第三方开源项目就是CyanogenMod,国内的小米的MIUI,也是基于CM来进行开发的。

  首先,我们要分析什么是ROM? ROM的本意其实是只读内存(Read Only Memory),而我们所说的ROM其实指的是手机的固件(firmware),它是把某个系统程序写入到特定的硬件系统中的flashROM。手机固件相当于手机的系统,刷新固件就相当于刷系统,也就是我们常说的刷ROM。

下面分析一下Android设备从硬件到系统的结构

技术分享

最底层的是各种硬件设备,往上一层是Bootloader,是一小段类似BIOS的程序。使用最广泛的Bootloader是一个叫uboot的程序,它支持非常多的体系结构。经过编译后,uboot 会生成一个uboot.bin镜像,将这个镜像烧到设备上的一个特定分区去,就可以作为Bootloader使用了。Bootloader支持交互式启动,也就是我们可以让Bootloader初始化完成硬件之后,不是马上去启动OS,而是停留在当前状态,等待用户输入 命令告诉它接下来该干什么。这种启动模块就称为Fastboot模式。可以通过adb reboot bootloader命令来让它重新启动并且进入到Fastboot模式中去。

 

通常,一个能够正常启动的嵌入式设备的ROM包含有以下四个分区:

1. Bootloader分区,也就是存放uboot.bin的分区

2. Bootloader用来保存环境变量的分区

3. Kernel分区,也就是存放OS内核的分区       

4. Rootfs分区,也就是存入系统第一个进程init对应的程序的分区

 

对于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程序都做了些什么事情。

用户正常使用Android设备时的系统,主要是包含有两个分区:System分区和Boot分区。System分区包含有Android运行时框架、系统APP以及预装的第三方APP等,而Boot分区包含有Kernel和Rootfs。刷入到System分区和Boot分区的两个镜像称为system.img和boot.img,我们通常将它们打包和压缩为一个zip文件,例如update.zip,并且将它上传到Android设备上的sdcard上去。这样当我们进入到Recovery模式时,就可以在Recovery界面上用我们之前上传到sdcard的zip包来更新用户正常使用Android设备时所用的系统了。这个过程就是通常所说的刷ROM了。

因此,一个完整的刷ROM过程,包含以下两个步骤:

1. 让设备进入到Fastboot模式,刷入一个recovery.img镜像

2. 让设备进入到Recovery模式,刷入一个包含system.img镜像和boot.img镜像的zip包

   

接下来分析一下刷入的update.zip压缩包里面的主要包含哪些文件?

1.boot.img 文件,这是编译内核源代码生成的内核映像,然后与android源码编译出来的ramdisk.img一起通过mkbootimg工具创建出来的。

2.META-INF 目录,这个目录是手工创建的,主要用来存放一个升级脚本update-script(这个脚本的内容与system目录中包含的文件有很大关联)以及保存若干刷机包内的apk文件的签名。

3.system目录,这个目录就是编译android的平台源代码生成的。

 

Android源码编译后,在out/target/product/generic下生成的三个镜像文 件:ramdisk.img,system.img,userdata.img以及它们对应的目录树root,system,data。 ramdisk.img是根文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,android加载 这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 data目录下。

要创建自己要创建自己的ROM,我们通常会涉及到以下的一些工作:

1. 编译内核生成内核映像。

2. ramdisk.img的修改。ramdisk.img 是根文件系统,里面包含了启动配置脚本。

3. update-script的修改。

4. System的修改。

我们已经对Android ROM的结构有了大致的了解,接下来就可以通过CM的源代码来进行编译并且定制自己的ROM了。CM官方支持的机型很多,设备列表参见(http://wiki.cyanogenmod.org/w/Devices),官方的发行版本现在分为两种,nightly(通常每24小时更新一次的实验版)和snapshot(基本稳定版)。当然,CM也为开发者提供了源代码,它包含了Device的源代码和Kernel的源代码。将对应机型的源代码下载好后,进行编译,就可以得到自己的Recovery和ROM了。具体的编译方法CM也给出了较为详细的说明,以小米2s为例,可以参考(http://wiki.cyanogenmod.org/w/Build_for_aries)

 

参考资料

1. http://wiki.cyanogenmod.org/w/About

2. http://blog.csdn.net/luoshengyang/article/details/29688041

Android ROM移植