Android系统到底是什么样子的?app为什么能够在Android系统中运行,怎样运行的。

下图是官方标准的Android系统架构图:

fdio vpp 软件架构 app软件架构图_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内核层):提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。作为一个应用层开发者,这一层可以不太深入研究。