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目录下。
system目录下的内容如下所示:
在app的目录下是所有的apk包,即包含了Android源码自身所发布的应用程序,又包含了用户自己编译的应用程序apk包,bin目录下是基本的命令,系统的本地程序,主要是Linux系统自带的组件,etc目录包含了一些配置文件和脚本文件,比如APN接入点设置等核心配置,framework目录下包含了系统运行所需要众多的jar包,lib目录存放了所有的库,文件系统底层库,如平台运行时库,xbin中也包含了多种命令,usr目录中有用户文件夹,包含共享、键盘布局、时间区域文件等。
root目录下的内容如下所示:
在root目录下,有个Android最重要的进程——init,这是Android启动运行的的第一个进程,还有两个非常重要的脚本文件:init.fs100.rc和init.rc这是Android在刚开始启动时,需要首先加载的两个启动脚本,根据脚本里的内容,来完成一系列的启动工作,data目录是userdata.img镜像要挂载的目录,system即为system.img镜像需要挂载的目录,dev目录是系统启动后,系统的设备文件目录。
data目录在系统编译完成后是空的。
虽然整个Android的编译系统生成了三部分内容,但是我们也可以将这三部分组合在一起,然后直接做成一个镜像,烧到开发板当中,就可以启动系统了!具体的操作就是,将system下所有的东西直接放在root目录下的system目录里,将用户的数据直接放在data下,这样做成一个目录fs100_root,然后将此目录直接使用工具来做成镜像,如下所示:
最后将fs100_root.img烧到nand flash当中,这样即可启动开发板。
而recover.img和boot.img相比较,区别如下:
1)recovery.img其实已经是进入了Linux系统。
(2)recovery.img为了具有恢复系统的能力,比普通的boot.img目录结构中:
1、多了/res/images目录,在这个目录下的图片都是恢复时我们看到的背景画面。
2、多了/sbin/recovery二进制程序,这个就是恢复用的程序。
3、/sbin/adbd不一样,应该和恢复有关。
(3)Android系统中的初始化程序(init)和初始化配置文件(default.prop、init.trout.rc、init.rc、init.goldfish.rc、)都不一样。这就是系统没有进入图形界面而进入了类似文本界面,并可以通过简单的组合
键进行恢复的原因。
通过查阅相关资料,对android的recovery模式有了一定的了解:
Android可以通过Recovery模式,实现恢复出厂设置、OTA升级、patch升级及firmware升级。在关机后,同时按下home + power键可以进入recovery模式。
大部分升级(包括刷机)都可以通过一个SD卡中的"updata.zip"文件升级包进行傻瓜式升级(步骤简单的升级)。而这一过程就是在系统进入Recovery模式后,通过升级程序运行升级包中“META-INF/com/google/android/update-script脚本来执行各种不同的自定义升级,脚本中是一组recovery模式下系统能识别的UI控制命令和文件系统操作命令,例如write_raw_image(烧写FLASH分区)、copy_dir(复制目录)等等。