Android的ROM结构相比传统的bootloader+kernel+filesystem的嵌入式架构略复杂一些,通常我们从手机官方网站上下载的升级包都是zip格式,如果解压后你会发现里面有几个img或者bin后缀的文件。
这里说明一下,因为手机的厂商对自己的保护,在手机上的bootloader通常不是开源的,即使我们获得了源码但也是不允许公开的,而且再没有jtag调试器的情况下刷bootloader风险是非常大的,所以我们跳过bootloader来介绍一下其他的镜像文件。
当编译完成Android后会在./out目录下生成几个img文件,它们将用于启动Android:
1. recovery.img:recovery这个名词如果您之前有过Android的刷机经验应该不难理解,Bootloader启动后可以两条路径,一条是正常的启动内核,然后启动Android系统;一条是启动recovery然后进入到recovery界面,可以清除缓存或者升级。recovery是一个最小系统,其实自带了一个linux内核。
2. ramdisk.img:内存磁盘镜像,存储了Linux内核启动时要装载的核心文件,通常这个文件只有在源码编译后的目录可以看到,因为发布时它被整合到了boot.img中,ramdisk.img是一个经过zip压缩的cpio文件,如果想解压这个文件需要运行:
mkdir ramdisk
cd ramdisk
gunzip -c ../ramdisk.img | cpio -i
3. boot.img:内核镜像文件,它通常包含一个内核镜像文件zImage和ramdisk.img文件,Android源码编译过程中通过mkbooting命令生成boot.img,当然,我们也可以使用unpackbooting来解压:
mkdir boot
cd boot
unpackbootimg -i ../boot.img
4.system.img:Android系统文件,启动后挂载到/system目录下。
5.userdata.img:用户镜像文件,我们安装的第三方APP都是存到这个位置。
6.cache.img:缓存镜像,用于存储用户或者系统产生的临时数据,cache.img实际上是一个空的ext4格式的系统镜像文件。
我们来用实践分析一下Android的ROM结构,通常我们刷机时有卡刷和线刷两种,当然这是通俗的说法,其实线刷就是指在fastboot模式下进行刷机,而卡刷是指在recovery模式下刷机。
大多数安卓手机,都可以在关机状态下,然后同时按住【电源键】+【音量-】键,大约2-3s后,就可以进入Fastboot模式。
fastboot是bootloader后期进入的一个特殊阶段。可以通过数据线与电脑连接,然后在电脑上执行一些命令,如刷系统镜像到手机上。fastboot可以理解为实现了一个简单的通信协议,接收命令并更新镜像文件,其他什么的干不了。
fastboot 主要是用来与bootloader的USB通讯的PC命令行工具。他一般主要也用来向bootloader传送刷机文件进行文件分区重烧。 因此在使用时,必须有一个PC机并且USB线要始终联着。所以这种方式称为线刷。 用fastboot需要bootloader 支持,所以不是每一家公司产品都支的这个功能的。
下面是常用的fastboot 命令
fastboot devices #列出当前可用的fastboot设备
fastboot getvar all #获取手机全部信息
fastboot reboot-bootloader #重启到fastboot
fastboot reboot #重启
fastboot flash system system.img #写入system分区
fastboot flash boot boot.img #写入boot分区
fastboot flash recovery recovery.img #写入recovery分区
fastboot oem unlock #解锁bootloader
fastboot oem lock #锁定bootloader
fastboot erase {partition} #删除指定分区
大多数安卓手机,都可以在关机状态下,然后同时按住【电源键】+【音量+】键,大约2-3s后,就可以进入recovery模式。
如果想对Android的Rom结构有一个感性的认识,最好的方法是通过shell连接到Android系统内部,然后通过各种方法分析它的组织结构,Android为我们预留了这样的功能--adb,下面我们来讲解一下通过adb连接手机的方法,我这里以Ubuntu系统举例,首先将手机通过usb连接线与PC连接,通常情况下由于linux系统的安全机制,我们没有手机连接的usb设备的访问权限,需要添加一条udev规则来增加对设备的访问权限。使用lsusb来查看新连接设备的ID,比如 05c6:0368 , 然后:
sudo vi /etc/udev/rules.d/70-android.rules
在里面写入:
SUBSYSTEM=="usb", ATTRS{idVendor}=="06c6", ATTRS{idProduct}=="0368",MODE="0666"
保存退出后执行 sudo chmod a+rx /etc/udev/rules.d/70-android.rules
然后重启udev : sudo service udev restart
执行完上述步骤后将手机的USB重新连接一次就可以使用 adb shell 命令进入到Android shell 中查看具体文件结构了。
如果adb不在系统变量里面可以使用 sudo apt-get install android-tools-adb 来安装adb。
上面我只是浅浅的谈了一下了解Android目录结构的方法,很多细节还需要去动手实践才能真正掌握。