随便做一个

基础知识

先来看一下Android设备的系统架构图:

随便做一个_第1张图片
最底层是各种硬件设备,往上一层是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

随便做一个_第2张图片

选择线刷包下载即可

解压和打包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

随便做一个_第3张图片

解压完之后会发现多出来两个文件:boot.img-kernel和boot.img-ramdisk.gz,这就是解压出来的boot.img,其中:
  • boot.img-kernel : 这就是内核
  • boot.img-ramdisk.gz : 是ramdisk,对应的源码编译目录为out/target/product/generic/root/

分解ramdisk

随便做一个_第4张图片


打包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库文件。


你可能感兴趣的:(随便做一个)