Android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。
Linux内核层
底部是Linux内核,Android系统建立在Linux内核上,提供类似进程管理,内存管理,摄像头,键盘设备管理,显示器等基本系统功能。同样包括网络和设备驱动。
作为基础移动计算环境下,Linux内核提供了对Android有几个关键的安全功能,包括:
一个基于用户的权限模型;
进程隔离;
可扩展的机制,安全的IPC;
去除内核不必要的和潜在的不安全部件的能力。
作为一个多用户操作系统,Linux内核的一个基本的安全目标是彼此隔离用户的资源,因此Linux内核会:
阻止用户A读取用户B的文件;
确保用户A不会耗尽B的内存、CPU、设备(电话、GPS、蓝牙等)。
硬件抽象层
硬件抽象层提供程序访问硬件资源的能力。
Android Runtime、Dalvik和第三方库文件,图示的库都非常必要,如Webkit用于浏览网页,SQLite用于维护数据库等。
Dalvik虚拟机,Android的开源项目,旨在执行申请Android.Each应用程序运行写在Android设备有自己的Dalvik虚拟机。
Android Runtime (ART)是Google Android平台上新的Java运行时环境,是Dalvik VM的替代品。它从Android 4.4(Kitkat)开始发布测试版,在Android5.0 (Lolipop)正式替代Dalvik VM。它的主要特点是有事先编译(Ahead-of-Timecompilation,简称AOT编译)功能,可以在安装APK或者动态加载DEX文件时将其中的Java方法编译为本地代码,运行程序的时候不需要再做JIT编译。
应用程序框架层
应用程序框架层中的Java类的应用提供了许多更高级别的服务。应用程序开发人员被允许在他们的应用程序使用这些服务。
Android应用层
应用分为2类:预装应用/system/app,用户安装应用/data/app,Android使用签名机制阻止未经授权的应用更新。
安装应用程序基本结构:
AndroidManifest.xml:该文件是控制文件,告诉系统如何处理应用顶级的组件(specifically activities, services, broadcast receivers, and contentproviders described below)。该文件还指定应用所需的权限,该文件在android里是二进制文件,不过可以使用apktool或androguard转换为可读的明文XML文件。
META-INF目录:包括
MANIFEST.MF:清单文件
CERT.RSA:应用程序的证书。
CERT.SF:资源在MANIFEST.MF文件中的相应行的名单和SHA-1的摘要
Lib:包含编译代码特定于处理器或软件层的目录,该目录被分成在其内多个目录:
armeabi:只为所有基于ARM的处理器编译代码
armeabi-V7A:只为所有ARMv7及更高版本的处理器编译代码
86:编译代码为X86
MIPS:只有MIPS处理器编译代码
Res:包含未编译resources.arsc的资源目录。
Assects:包含可以被AssetManager恢复的应用资产。
Classes.dex:包含可以被Dalvik虚拟机执行的二进制文件。
resources.arsc:包含预编译资源的目录,如二进制xml。
主要应用组件:
应用程序组件是一个Android应用程序的重要基础,每个组件都是系统进入APP的切入点。
AndroidManifest.xml
所有应用都包含的文件,这个文件的内容包括:
l 唯一的应用包名及版本信息;
l Activity、Service、BroadcastReceiver和插桩定义;
l 权限定义,包括应用请求的权限和应用自定义的权限;
l 关于应用使用并一起打包的外部程序库信息;
l 其他支持性的指令,如共用的UID信息,首选安装位置和UI信息。
Manifest文件经常由开发环境自动产生,在构建过程中由明文XML文件转换为二进制XML文件。
Intent
Intent是一种消息对象,包含一个要执行操作的相关信息,可选的将执行操作的目标组件信息,以及其他一些对接受方可能非常关键的标志位信息或支持性信息。几乎所有动作都都涉及在系统中传递Intent。
Activity
面向用户的应用组件或应用界面,底层是由Activity管理服务的组建进行处理的。
Broadcast Receiver
通常应用希望接受一个匹配特定标准的隐式Intent时出现。broadcast receiver是响应全系统广播通知的部分,如发起屏幕开启或关闭、电池电量低、拍照等,应用程序也可以发起广播,如向其他程序发送数据已经准备好的广播,广播也可以创建一个通知栏状态告知用户。
Service
一类在后台运行无需用户界面的应用组件,Service必须在Manifest文件中声明。Service的启动、停止、绑定由Intent触发。
ContentProvider
为各种通用、共享的数据存储提供结构化的访问接口,存储的数据可以放在SQLite、Web、或其他应用可以访问的存储位置,其他的应用可以查询甚至修改content provider的数据。