Fork me on GitHub

Android系统架构

Android系统架构统分为四层,从顶层到底层,分别是:

1、Application(应用程序层)

2、Application FrameWork(应用程序框架层)

3、Libraries & Android Runtime(系统运行库与Android运行环境)

4、Linux kernel(Linux内核)

示意图如下所示:

Application 应用程序层

这一层主要是随Android系统一同发布的系统内置核心应用程序,即System APP(系统级APP),如浏览器、地图、联系人管理程序、日历等等。通常开发人员均属于这一层。

当然,如果我们自己想写一些System App的话,就不只限于这一层了,这里就提一下,会在下面讲一些我的经历。

Application FrameWork 应用程序框架层

这一层也可以称为java API Framework。这一层提供了应用程序开发所需要的各种API,即隐藏在每个应用后的一系列服务和系统。通常所说的查看官方源码,指的就是这一层。这其中包括:

1、views(视图层):构建应用程序的界面,如文本框、按钮、列表,可嵌入的web浏览器等。

2、Content Providers(内容提供器):使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。这一部分基本存放的是系统级的数据。不过一般来讲,应用程序出于数据的私密性是不会将自己的数据放进里面的,除非是部分数据有二次开发和使用的可能性,才会放入。

3、Resource Manager(资源管理器):非代码形式资源的访问,如图片、布局文件等。

4、Notification Manager(通知管理器):应用程序的通知栏信息。

5、Activity Manager(活动管理器):管理应用程序activity的生命周期。

Libraries & Android Runtime

Libraries 系统运行库

这里包含很多C/C++库,为Android底层提供了一些比较关键的图形、音像,和其他的数据处理技术核心库。其中包括:

1、Webkit,LibWebCore:web浏览器引擎,支持Android浏览器与可嵌入的web视图。Apple Safari即采用此引擎。

2、SGL:底层2D图形引擎。

3、Surface Manager:对显示子系统的管理,并提供了2D与3D图层的无缝融合。

4、3D libraries:基于OpenGL ES 1.0 APIs实现;该库可以使用硬件3D加速或高度优化的3D软加速。

5、FreeType:bitmap(位图)和vector(矢量)字体显示。

6、媒体库:基于PacketVideo OpenCORE,支持多种常用图像、音频、视频。

7、SQLite:Android本地的一个轻型关系型数据库引擎。(啊,多次用到这个数据库,不适时的吐槽一下,轻度使用还行,深度使用,是个辣鸡)

还有部分没有显示出来的就是硬件抽象层,这里面包括了Android设备的部分驱动,Linux内核也并非包含了设备的所有驱动(深层原因见GPL协议)。

这一层涉及到两个东西,JNI与NDK。

JNI

JNI,全称Java Native Interface,即java本地接口。通过JNI,java可以与其他语言的代码,如c/c++代码,交互。

PS:JNI是Java语言的特效,与Android无直接关系。

以我仓促之间查到的资料来看,JNI在Android中的开发的表现形式是:将c/c++代码通过JNI将包含native方法的Java源文件javac,相继得到.class文件和.h文件,编译NDK产出的.so库,在Java代码中调用使用。

在Android开发的过程中,我经常用到jar或aar库,so文件倒是只用过一两次。不同与java编译的jar文件,so文件是由c/c++编译的动态链接库,是机器可以直接运行的二进制代码。相比java语言,c/c++代码运行效率会更高一些。

NDK

NDK,全称Native Development Kit,是Android的一个工具开发包。NDK在Android中的开发的表现形式是:快速开发c/c++的动态库,编译生成.so库,并且将so和应用一起打包成apk。

因为之前是自己写一个重启功能的System APP的,但发现没有自己想的那么简单。这其中有些东西还没有理清楚,只知道需要用到NDK、Android Build源码系统(暂只支持Ubuntu和mac编译,且整个源码系统大概需要60G,但Ubuntu虚拟机的那个盘剩余可用空间不够了,就还没下载)的编译。待之后做成功了,再回来补充。(感觉已经有好几篇博客这样挖坑了)

Android Runtime Android运行环境

在Android5.0系统之前,Android一直采用Dalvik虚拟机作为运行环境。它支持已转换为.dex格式的java应用程序的运行。不同于JVM的堆栈机器,Dalvik是寄存机器。Android5.0系统之后,Google正式将ART作为系统默认虚拟机。

相比于Dalvik,ART的不同是:Dalvik采用的是JIT(Just-in-time compilation,即时编译)技术,在程序运行的过程中,Dalvik不断地将字节码编译为机器码;ART采用的是AOT(Ahead-of-time,预编译)技术,在程序运行的过程中,ART就已经将所有的字节码编译为了机器码。由此可以看出,ART极大的提高了程序的运行效率,减少了系统的功耗,降低了手机的电量消耗,提高了续航能力。同时,ART也改善了垃圾回收、应用程序除错等性能。

Linux Kernel Linux内核

Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。 Linux内核也提供了硬件与软件栈之间的抽象层,其中有部分修改:

1、Binder(IPC):提供有效的进程间的通信。Android在Linux的基础上实现了自己的一套通信机制。

2、电源管理:移动设备毕竟还是要管理电源的。

-------------本文结束感谢您的阅读-------------