android系统是一个典型的嵌入式linux,基础是linux kernel,整个android框架运行于一个称为dalvik的虚拟机之上,因此app是平台无关的,如果没有使用特殊的硬件,在armv6上运行的app可以直接放在android on mips中一致运行。事实上android为常用的硬件(gps,加速度感应等)提供了jni的接口,移植时只要重新把硬件操作包裹成.so供框架调用。

flash分为几个block:

boot存放kernel和ramdisk,dump出来后需要split_bootimg.pl或者unpack-H.pl来把两者分离出来。boot区的结构如下:

header中存放kernel和ramdisk的偏移信息:

unsigned kernel_size;  /* size in bytes */ unsigned kernel_addr;  /* physical load addr */

unsigned ramdisk_size; /* size in bytes */ unsigned ramdisk_addr; /* physical load addr */

unsigned second_size;  /* size in bytes */ unsigned second_addr;  /* physical load addr */

unsigned tags_addr;    /* physical addr for kernel tags */ unsigned page_size;    /* flash page size we assume */ unsigned unused[2];    /* future expansion: should be 0 */

unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */

unsigned char cmdline[BOOT_ARGS_SIZE];

unsigned id[8]; /* timestamp / checksum / sha1 / etc */ };

这样系统就可以在启动时找到kernel和ramdisk。

ramdisk结构如下

android不使用init.d管理启动过程,init读取init.xxx直接管理启动过程,主要完成重要目录、文件、环境变量的建立,挂载block,启动服务等。

system block存放系统目录,启动的时候ro挂载在ramdisk的/system下:

framework存放android框架文件,app存放系统自带的apps,以.apk的形式,不可由用户卸载。其他的目录沿袭linux传统。

userdata block存放用户数据,启动的时候rw挂载到/data,用户安装的apps存放于这里,apps的配置文件也在此目录中。

recovery block 存放一个小型的rootfs,recovery模式启动的时候会挂载此区域,此时系统一些基本的功能用于备份还原等管理功能。recovery模式下init过程较为简单,启动adbd服务后就执行recovery程序接受用户操作: