一、Android的系统架构图
1.APP层
应用程序层,该层配备了一套核心应用程序,例如电子邮件、短信、日历、互联网浏览、联系人等等。包括在平台上的应用程序在用户选择安装的应用程序中没有特殊的状态。因此,第三方应用程序可以成为用户默认的Web浏览器、SMS,甚至是默认的键盘(一些例外适用,例如系统的设置app)。
系统应用程序既为用户提供日常生活中常用应用程序,又为提供开发人员提供了可以直接调用系统应用的关键功能。
2.Framework层
Framework为上层应用层提供各种 APIs、组件和服务,又叫Java API框架层。
Android OS的整个功能集可以通过用Java语言编写的API来获得。这些API构成了通过简化核心模块化系统组件和服务的重用来创建Android应用程序所需的构建模块,其中包括:
- View System: 可以使用它来构建应用程序的UI,包括列表,网格,文本框,按钮,甚至可嵌入的Web浏览器;
- Resource Manager: 提供对非编码资源,如本地字符串,图形,和布局文件;
- Notification Manager: 为应用程序提供在状态栏中显示自定义的消息提醒;
- Activity Manager: 负责管理应用程序的生命周期并提供一个通用的导航返回栈;
- Content Providers: 可让应用访问其他应用的数据,例如通讯录应用,或共享自己的数据。
开发人员可以完全访问Android系统应用程序,从而复用系统提供的框架API。
3.Native C/C++ Libraries
用于支持应用框架层的各个组件的。就是说当开发人员使用android应用框架层时,android系统会通过一些C/C++库来支持对我们使用的各个组件,使其能更好地为开发者服务。
许多核心的Android系统组件和服务(如ART和HAL)都是使用本地代码构建的,需要使用C和C ++编写的本机库。 Android平台提供Java框架API以将这些本地库中的一些功能展示给应用程序。 例如,您可以通过Android框架的Java OpenGL API访问OpenGL ES,以添加对在应用程序中绘制和操作2D和3D图形的支持。
4.HAL层
硬件抽象层(HAL)提供了将设备硬件功能展示给更高级Java API框架的标准接口。 HAL由多个库模块组成,其中每个模块都为特定类型的硬件组件(如相机或蓝牙模块)实现接口。 当框架API调用访问设备硬件时,Android系统会自动为该硬件组件加载库模块。
5.Linux Kernel层
android的核心系统服务如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于Linux内核,Linux内核同时也作为硬件和软件栈之间的抽象层。
二、App层与framework层交互方式
app层调用framework层代码主要是依靠framework层提供的API。Android SDK就对应着framework层中的API文件。
framework的类分为对外的API和内部的类:
- …/java/android/:Android.*包中的内容,其中包括API;
- …/java/com/:com.*包中的内容,其中都是内部类。
其中…/java/android/:Android.*包中标记为hide的文件,不对外公开。
framework层代码结构:
frameworks/base/core/,android核心包:
- core/java/android中很多类是作为Android框架层标准的API;Android核心包及其子包;
- core/java/com:则是核心内部的内部包,com/android/下主要是一个internal子包,com/google/目录为com.google.*包及其子包;
frameworks/base/media/,多媒体和音频相关内容;
frameworks/base/graphics/,图形处理包;
frameworks/base/opengl/,Android OpenGL 3D实现;
frameworks/base/location/,定位相关的内容;
frameworks/base/telephony/,电话相关的内容;
frameworks/base/wifi/,无线局域网相关内容;
三、Java Framework层和C++ Libraries层的交互方式
JAVA Framework层和C++ Libraries层的交互是通过JNI实现的,最主要的Jni源代码路径:/frameworks/base/core/jni,这里面的代码编译会生成一个libandroid_runtiem.so的动态库,
framework层就是根据Jni方式去调用C++ Libraries层的代码的。
列举常用且比较重要的C/C++程序库所在的目录位置:
/frameworks/av/media,系统媒体库;
/frameworks/native/opengl,第三方图形渲染库;
/frameworks/native/services/surfaceflinger,图形显示库,主要负责图形的渲染、叠加和绘制等功能;
external/sqlite,轻量型关系数据库SQLite的C++实现;
下面这张图可以很清晰的看出framework层和C++ Libraries层的交互方式,主要通过Jni向下调用:
四、C++ Library层跟HAL层的交互
Android 8.0之前,最初大量采用HAL旧版方式,表现为framework直接加载*.so并依赖,主要集中在网络、蓝牙等模块;
新的交互引进了HIDL接口层,代码主要在:\hardware\interface…里面。
从图中可以看出:HIDL接口方式,不同芯片厂商修改的HAL层使用标准的HIDL接口,不影响Libraries和framework层的代码,从而减少直接耦合,提升了Android系统的稳定性和可兼容性。
五、HAL层跟Kernel层交互
HAL层是运行在user space,即用户控件的代码;Kernel是运行在内核的中的代码;
所以HAL层跟Kernel层的交互设计到芯片内核跟用户进程(user space)的通信。
常用的netlink socket通信机制可以参考分析:
https://blog.csdn.net/Sunxiaolin2016/article/details/89635302
参考资料:
1.https://www.jiqizhixin.com/articles/2019-03-20-3