Android系统到底是什么样子的?app为什么能够在Android系统中运行,怎样运行的。
下图是官方标准的Android系统架构图:
(蓝色:java程序,java代码编写;黄色:运行JAVA程序而实现的虚拟机;绿色:C/C++语言编写的程序库;红色:linux内核+driver)
由上图我们知道Android系统分为四层:
1、Applications(应用程序层):就是我们的app层,各种app。
2、Framework(应用程序架构层):提供开发Android应用程序所需的一系列类库,使开发人员可以进行快速的应用程序开发。Activity、Service、Notification等等都是framework提供给我们的。
应用程序框架层类库名称 | 功能 |
活动管理器(Activity Mananger) | 管理各个应用程序生命周期并提供常用的导航回退功能,为所有程序的窗口提供交互的接口 |
窗口管理器(Window Manager) | 对所有开启的窗口程序进行管理 |
内容提供器(Content Provider) | 提供一个应用程序访问另一个应用程序数据的功能,或者实现应用程序之间的数据共享 |
视图系统(View System) | 创建应用程序的基本组件,包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons),还有可嵌入的web浏览器。 |
通知管理器(Notification Manager) | 使应用程序可以在状态栏中显示自定义的客户提示信息 |
包管理器(Package Manager) | 对应用程序进行管理,提供的功能诸如安装应用程序,卸载应用程序,查询相关权限信息等。 |
资源管理器(Resource Manager) | 提供各种非代码资源供应用程序使用,如本地化字符串,图片,音频等 |
位置管理器(Location Manager) | 提供位置服务 |
电话管理器(Telephony Manager) | 管理所有的移动设备功能 |
XMPP服务 | 是Google在线即时交流软件中一个通用的进程,提供后台推送服务 |
我们可以称Framework层才真正是Java语言实现的层,在这层里定义的API都是用Java语言编写。但是又因为它包含了JNI的方法,JNI用C/C++编写接口,根据函数表查询调用核心库层里的底层方法,最终访问到Linux内核。那么Framework层的作用就有2个。
1.用Java语言编写一些规范化的模块封装成框架,供APP层开发者调用开发出具有特殊业务的手机应用。
2.用Java Native Interface调用core lib层的本地方法,JNI的库是在Dalvik虚拟机启动时加载进去的,Dalvik会直接去寻址这个JNI方法,然后去调用。
3、Libraries(系统运行时库层):从系统结构图,这层有两个部分。
3.1、Librares:核心库提供了Java5 se API的多数功能,并提供Android的核心API,如android.os,android.net,android.media等。C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。各类库说明如下:
系统类库名称 | 说明 |
Surface Manager | 执行多个应用程序时,管理子系统的显示,另外也对2D和3D图形提供支持 |
Media Framework | 基于PacketVideoOpenCore的多媒体库,支持多种常用的音频和视频格式的录制和回放,所支持的编码格式包括MPEG4,MP3,H264,AAC,ARM |
SQLite | 本地小型关系数据库,Android提供了一些新的SQLite数据库API,以替代传统的耗费资源的JDBC API |
OpenGL|ES | 基于OpenGL ES 1.0API标准实现的3D跨平台图形库 |
FreeType | 用于显示位图和矢量字体 |
WebKit | Web浏览器的软件引擎 |
SGL | 底层的2D图形引擎 |
Libc(bionic l ibc) | 继承自BSD的C函数库bionic libc,更适合基于嵌入式Linux的移动设备 |
SSL | 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议 |
3.2、Android runtime(Core Librares + Dalvik虚拟机):
Dalvik虚拟机:Dalvik虚拟机是基于apache的java虚拟机(JVM),并被改进以适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调试管理,安全和异常管理,垃圾回收等重要功能。(这里提到java虚拟机,简单叙述一下与Dalvik虚拟机区别:a、java虚拟机运行的是.class,Dalvik虚拟机运行的是.dex;b、java虚拟机基于栈架构。程序在运行时虚拟机需要频繁的从栈上读取或写入数据。Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式快的多)
关于Dalvik虚拟机这是比较低版本4.4以下的了,从android4.4开始就出现了ART(android runtime),用来代替Dalvik的新型运行环境。当然在4.4的正式环境中用的还是Dalvik,真正开始用ART取代Dalvik是从android5.0开始的。在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升(这里不进行详细讨论)。
这里还有个重点,在上一层(Framework层:java代码)与这一层(系统运行时库层:C\C++代码)他们又是怎么能调用的呢?这里就涉及到了一个JNI:
JNI:Java本地接口(Java Native Interface),它是一个协议。用来沟通Java代码和外部的本地C/C++代码, 通过该协议 Java代码可以调用外部的本地代码, 外部的C/C++ 代码可以调用Java代码。
涉及到JNI的开发,又要说NDK了。
NDK:Google开发的一套开发和编译工具集, 主要用于Android的JNI开发,是一个用于开发JNI的工具。
这里涉及到的JNI与DNK不进行详细,只是简单叙述一下感念。
4、Linux Kernel(linux内核层):提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。作为一个应用层开发者,这一层可以不太深入研究。