Android被称为”运行在Linux上的Java“,并非完全正确。
总体架构分为5个层次:Android应用层,Android框架层,Dalvik虚拟机层,用户空间原生代码层,Linux内核层。
Android应用层允许开发者无需修改底层代码就能对设备的功能进行扩展和提升,框架层提供大量的访问Android设备所需的API,两者都是由Java开发,并且在DalvikVM中运行。
DalvikVM是一种基于寄存器的虚拟机,为底层操作系统提供了一个高效的抽象层,可以解释执行Dalvik至此的(DEX)字节码,同时依赖于一些支持性原生代码程序库提供的功能。
用户原始代码组件包括:系统服务,网络服务,程序库。一些服务与程序库会与内核级服务与驱动进行交互,二其他的则只是便利底层原生操作管理代码。
Android底层是Linux,对内核源码树做了大量的增加与修改。特别需要注意Binder驱动,它实现了进程间通信机制(IPC)。
信任边界:系统中分割不同信任级别的特殊区域。比如内核空间与用户空间的边界。
Android继承了Linux的进程隔离机制与最小化权限原则。
Android沿用了Linux的UID/GID权限模型。但是并没有使用传统的passwd和group文件来存储用户与用户组凭证,取而代之,Android定义了从名称到独特标识符的Android ID(AID)映射表,除此之外,还使用了辅助用户组机制,一允许进程访问共享和受保护的资源。
Android的权限模型包括多个方面:API权限,文件系统权限,IPC权限。
API权限,用于控制访问高层次的功能,存在于Android API,框架层,以及以及某种情况下的第三方框架。
文件系统权限,默认情况下,应用的唯一UID和GID只能访问文件系统上相应的数据存储路径,应用创建的文件也会用于相应的权限,子目录和文件的属主和权限都只设置给该应用的UID和GID.
IPC权限,直接涉及应用组件之间的通信。
Android应用层的主要组件:AndroidManifest.xml,Intent,Activity,Broadcast Reciver.Service,Content Provider。
Manifest.xml,包含应用唯一的包名,版本信息;Activity,Service,BoradcastReciver,和插桩定义;权限定义,关于应用使用及一起打包的外部程序信息;其他支持性的指令,比如公用的UID,首选的安装位置等。
Intent,应用间通信的关键组件。一种消息对象,包含要执行的操作信息,和将执行操作的目标组件信息(可选),以及其他接收方的关键信息。
Activity,一种面向用户的应用组件或者用户界面(UI),底层由ActivityManager组件进行处理,处理应用之间或者应用内部调用SActivity的Intent。
Broadcast Reciver,通常在应用希望接收一个匹配某种特定标准的隐式Intent时出现。权限设置表示,哪些应用可以向这个端点发送Intent。
Service,后台运行,没有用户界面的组件,可以接收和发送Intent,停止,启动,和绑定,都通过Intent触发。
ProviderContent,为各种通用,共享的数据存储提供结构化的访问接口,读写通过权限控制。
Android框架层,应用和运行时之间的纽带,为开发者提供了执行通用任务的组件,程序包及其类。
框架层的包都位于android.*名字空间中。框架层服务包括:Acitivity管理器,视图系统,程序包管理器,电话管理器,资源管理器,位置管理器,通知管理器。
DalvikVM,基于寄存器而不是栈,不是Java,开发流程如下:
1)开发者基于Java进行编码
2)源码被翻译为.class文件
3)得到的.class文件被翻译成Dalvik字节码
4)所以类文件被合并为一个Dalvik可执行文件(.DEX)
5)字节码被Dalvik加载并解释执行
Zygote,设备启动时,Zygote是最先启动的进程之一,负责启动其他服务及加载Android框架所需的程序库。启动system_server,这个进程包含所有的系统核心服务。
用户原生空间代码层,主要由程序库和核心系统服务组成。
程序库,Android框架中较高层次类所依赖的底层服务都是通过共享程序库实现的,并通过JNI进行访问。
核心服务,建立基本操作系统环境的服务与Android原生组件。
init服务,通过一系列命令对用户空间进行初始化。Android使用自定义的init来实现,基于从/init.rc中找到指令来执行。
Property服务,位于Android初始化服务中,提供一些持续性的,内存映射的,基于键值对的配置服务。在Android设备中运行getprop命令,可以看到包含Dalvik配置,当前设置壁纸,网络接口配置,厂商特定的更新URL等。
ADB(调试桥),由几个部件组成,包括Android设备上的adbd守护进程,在宿主工作站上运行的adb服务器,以及相应的adb命令行客户端。
Volume守护进程,时Android系统上负责安装和卸载各种文件系统的服务。
内核,一个Linux分支,因为许多添加和修改已经和Linux主代码树不兼容了。
Binder,时以恶搞基于OpenBinder修改版本的IPC 机制,作为一个架构,以客户端-服务器的模型运行,允许一个进程调用多个“远程”进程中的多个方法。Binder将底层细节经常了抽象,使得这些方法调用起来像是本地函数调用。使用进程ID和UID信息作为标识调用进程的手段。
ashmem,匿名共享内存服务,提供了基于文件,通过引用计数的共享内存接口。能够自动收缩内存缓存,并且在全局可用内存较低时回收内存区域。非常适合低内存环境。
pmem,管理1-16MB的大块物理上连续的内存区块。pmem需要分配一个进程,为pmem内存堆保留一个文件描述符,直到所有其他索引都关闭。
日志记录器,用于查看日志缓冲区,提供四个独立的日志缓冲区:mian(主缓冲区),radio(无线电缓冲区),envent(事件缓冲区),system(系统缓冲区)。
Paranoid Networking,辅助用户组限制网络操作的调用进程。在高层次上,这个模块将一个AID映射到应用层的权限声明或者请求上。