### 参考文章:
[官方文档介绍:平台架构](https://developer.android.google.cn/guide/platform#art)
[Android 操作系统架构开篇](http://gityuan.com/android/)
### Android系统的体系结构
**早期的Android架构**如下图所示
![](https://box.kancloud.cn/caee07ad9295be3d40456c0b100d174c_727x600.png)
**官方网站最新的Android平台架构图**
:-: ![](https://developer.android.google.cn/guide/platform/images/android-stack_2x.png)
图1 Android系统架构图
#### **1、应用程序层**
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序通常都是使用JAVA语言编写的。
#### **2、应用程序框架**
开发Android应用程序就是面向底层的应用程序框架进行的,从此角度而言,Android上的应用程序完全是平等的。Android应用程序框架提供了大量的API供开发者使用,该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
- **丰富而又可扩展的视图(Views)**:可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。
- **内容提供器(Content Providers)**:使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据
- **资源管理器(Resource Manager)**:提供 非代码资源的访问,如本地字符串,图形,和布局文件(layout files)。
- **通知管理器 (Notification Manager)**: 使得应用程序可以在状态栏中显示自定义的提示信息。
- **活动管理器( Activity Manager)**: 用来管理应用程序生命周期并提供常用的导航回退功能。
#### **3. 函数库(原生 C/C++ 库)**
Android 包含一些被不同组件所使用的C/C++库的集合,一般不能直接调用这套C/C++库集,但是可以通过 Android 应用程序框架来调用这些库。
- **Bionic系统 C 库** : 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded(嵌入式) linux 的设备定制的。
- **媒体库**:基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
- **Surface Manager** - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。
- **Webkit,LibWebCore** - 一个全新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。webview完全可以嵌入到开发者自己的应用程序中
- **SGL** - 底层的2D图形引擎
- **3D libraries** - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。
- **FreeType** -位图(bitmap)和矢量(vector)字体显示。
- **SQLite** - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
参考:[浅谈 Google Skia 图形处理引擎](https://www.cnblogs.com/delphidoc/archive/2009/04/26/1443839.html)
#### **4. Android运行时**
Android运行时由两部分组成:Android核心库和[ART](https://source.android.google.cn/devices/tech/dalvik)(Android RunTime),其中核心库集提供了Java语言核心库所使用的绝大部分功能,而虚拟机则负责运行Android应用程序。
**Android5.0以前,Android运行时由Dalvik虚拟机和Android核心库集组成,但是由于Dalvik采用一种被称为JIT(Just-In-Time)的解释器进行动态编译并执行,应用每次运行的时候,字节码都需要通过JIT转换为机器码,这会拖慢应用的运行效率,因此导致AndroidAPP运行比较缓慢;而ART模式是在用户安装APP时进行预编译(ahead of time,简称为AOT),将原本在程序运行时的编译动作提前到应用安装时,这样使得运行时可以减少动态编译的开销,从而提升Android APP的运行效率**。但是,由于ART需要在安装APP时进行AOT处理,因此ART需要占用更多的存储空间,应用安装和系统启动时间会延长不少,除此之外,ART还支持ARM、X86和MIPS架构,且完全兼容64位系统,必然会带来更好的用户体验。
**ART 的部分主要功能**包括:
* 预先 (AOT) 和即时 (JIT) 编译
* 优化的垃圾回收 (GC)
* 在 Android 9(API 级别 28)及更高版本的系统中,支持将应用软件包中的[Dalvik Executable 格式 (DEX) 文件转换为更紧凑的机器代码](https://developer.android.google.cn/about/versions/pie/android-9.0#art-aot-dex)。
* 更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置观察点以监控特定字段
**ART优点**:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。
**ART缺点**:
1、更大的存储空间占用,可能会增加10%-20%。
2、更长的应用安装时间。
总的来说**ART的功效就是“空间换时间”**。
对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且都有其自己的[Android Runtime (ART)](http://source.android.google.cn/devices/tech/dalvik/index.html)实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如[Jack](https://source.android.google.cn/source/jack.html))将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。
*****
----------
**PS**:2014年的Google I/O大会,ART才正式取代Dalvik,ART的发布之所以引起大家的关注,是因为Andoid与iOS相比,一直被人诟病它的流畅性。Android的流畅性问题,有一部分原因就归结于它的应用程序和部分系统服务是运行虚拟机之上的,也就是运行在Dalvik虚拟机之上,而IOS的应用程序和系统服务都是直接执行本地机器指令的。除了使用ART替换Dalvik之外,我们也应当看到,Android从3.0开始,就不遗余力地改进系统的流畅性。例如,3.0增加了对应用程序2D UI的硬件加速渲染,也就是GPU渲染。在此之前,应用程序的2D UI一直都是使用软件渲染,也就是CPU渲染。又如4.1通过Project Butter,在UI架构中引入了VSYNC、Triple Buffer和HWComposer等技术,极大地提高UI的流畅性。
**ART之所以会比Dalvik快,是因为ART执行的是本地机器指令,而Dalvik执行的是Dex字节码,通过通过解释器执行**。尽管Dalvik也会对频繁执行的代码进行JIT生成本地机器指令来执行,但毕竟在应用程序运行的过程中将Dex字节码翻译成本地机器机器指令也会影响到应用程序本身的执行,因此即使Dalvik使用了JIT,也在一定程度上也比不上直接就可以执行本地机器指令的运行时。下图是Dalvik、ART和Java VM的关系
:-: ![](https://img.kancloud.cn/9d/54/9d5425d11a7193ae583137f05b0aa442_741x622.png)
图2 Dalvik、ART和Java VM的关系
ART像Dalvik一样,都实现Java虚拟机接口,除此之外,其内部还有垃圾收集机制(GC),同时还有Java核心类库调用,具体关于ART的分析可以参考[老罗的一些列博客](http://blog.csdn.net/luoshengyang/article/details/39256813),具体有[ART执行类方法的过程分析 ](http://blog.csdn.net/luoshengyang/article/details/40289405)和[ART运行时无缝替换Dalvik虚拟机的过程分析 ](http://blog.csdn.net/luoshengyang/article/details/18006645)等等。
#### **5.硬件抽象层 (HAL)**
[硬件抽象层 (HAL)](https://source.android.google.cn/devices/architecture/hal-types)**提供标准界面**,向更高级别的[Java API 框架](https://developer.android.google.cn/guide/platform#api-framework)显示设备硬件功能。**HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如[相机](https://source.android.google.cn/devices/camera/index.html)或[蓝牙](https://source.android.google.cn/devices/bluetooth.html)模块**。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
关于HAL,你需要记住以下几点:
在 Android 8.0 及更高版本中,较低级别的层已重新编写以采用更加模块化的新架构。运行 Android 8.0 或更高版本的设备必须支持使用 HIDL 语言编写的 HAL,下面列出了一些例外情况。这些 HAL 可以是绑定式 HAL 也可以是直通式 HAL:
* **绑定式 HAL**:以 [HAL 接口定义语言 (HIDL)](https://source.android.google.cn/devices/architecture/hidl) 表示的 HAL。这些 HAL 取代了早期 Android 版本中使用的传统 HAL 和旧版 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。所有在推出时即搭载了 Android 8.0 或更高版本的设备都必须只支持绑定式 HAL。
* **直通式 HAL**:以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。
[Android HIDL HAL 接口定义语言详解](https://blog.csdn.net/qq_19923217/article/details/88398660):在 Andoird 8.0 版本框架代码中,加入了 HIDL(HAL 接口定义语言),HIDL 的出现是为了将用户层和 HAL 层分割开,它指定了 HAL 和用户之间的接口,让用户能够替换 Android 框架,而无需重新编译 HAL,以便让厂商能够以更低的成本、更快速地将设备更新到新版 Android 版本中。
**通俗的来说,HIDL 设计了一套通过的框架接口,将 HAL 层实现与 Android 操作系统框架分离开来,设备厂商只需要构建一次 HAL,并将其放置在` /vendor` 分区中,便能适应大部分 Android 操作系统框架版本的升级。**
:-: ![](https://img.kancloud.cn/cb/62/cb623abc268a474d023a6d9834790b8c_512x148.png)
图:HIDL 设计下的升级方式
#### **6. [Linux内核](https://source.android.google.cn/devices/architecture/kernel)**
Android系统建立在Linux 2.6之上,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。其外还对其做了部分修改,主要涉及两部分修改:
1. Binder (IPC):提供有效的进程间通信,虽然linux内核本身已经提供了这些功能,但Android系统很多服务都需要用到该功能,为了某种原因其实现了自己的一套。
2. 电源管理:主要是为了省电,毕竟是手持设备嘛,低耗电才是我们的追求。
:-: ![](https://box.kancloud.cn/6a0af80d862f6a371531e283ae79ddf1_554x522.png)
图3 AndroidLinux内核
#### **cpu**:
* **intel x86结构** 主要运用在pc机 笔记本 k800 k880
* **AMD x86结构**
* **arm** 主要运用在移动平台 卖标准 绝大多数android手机处理器
#### **一些重要的Android组件**
一个Android程序由下面这些部分组成。
* Activity:代表了Android程序的展现层,比如用户看到的界面。一个Android程序会有一些个Activities,在程序运行过程中也会切换。
* Views:一个Activities的用户界面是继承自android.view.View。views的布局通过android.view.ViewGroups来管理。
* Services:不需要UI展现的后台任务。可以通过android的提醒框架给用户提示。
* Content Provider:为程序提供数据,通过Content Provider你的程序可以与别的程序共享数据。Android的SQLite数据库可以看做一个Content Provider。
* Intents:是一个异步的消息系统,可以从别的系统或服务获取数据。程序可以直接调用一个服务或者activity,也可以请求android系统。
* Broadcast Receiver:接受系统消息或者隐含的intent,可以根据系统的改变做出反应。一个程序可以注册成为某些事件的Broadcast Receiver,当事件发生时,程序就执行。
**android应用程序的四个核心的组件:**
* **activity** ui界面的展现,不适合做耗时操作
* **content provider** 内容提供者 暴露自己应用私有的数据给别的应用程序
* **broadcast receiver** 广播接受者.
* **service** 后台服务. 长期在后台运行, 都没用户界面的一个组件.
- 前言
- Android系统的体系结构
- Dalvik VM 和 JVM 的比较
- Android 打包应用程序并安装的过程
- Android ADB工具
- Android应用开发
- Android UI相关知识总结
- Android 中window 、view、 Activity的关系
- Android应用界面
- Android中的drawable和bitmap
- AndroidUI组件adapterView及其子类和Adapter的关系
- Android四大组件
- Android 数据存储
- SharedPreference
- Android应用的资源
- 数组资源
- 使用Drawable资源
- Material Design
- Android 进程和线程
- 进程
- 线程
- Android Application类的介绍
- 意图(Intent)
- Intent 和 Intent 过滤器(Google官网介绍)
- Android中关于任务栈的总结
- 任务和返回栈(官网译文)
- 总结
- Android应用安全现状与解决方案
- Android 安全开发
- HTTPS
- 安卓 代码混淆与打包
- 动态注入技术(hook技术)
- 一、什么是hook技术
- 二、常用的Hook 工具
- Xposed源码剖析——概述
- Xposed源码剖析——app_process作用详解
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——hook具体实现
- 无需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid应用
- 四、Hook原生应用程序
- 五、Hook 检测/修复
- Android 应用的逆向与加固保护技术
- OpenCV在Android中的开发
- Android高级开发进阶
- 高级UI
- UI绘制流程及原理
- Android新布局ConstraintLayout约束布局
- 关键帧动画
- 帧动画共享元素变换
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
- 为什么 Android 要采用 Binder 作为 IPC 机制?
- JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?
- Android源码的Binder权限是如何控制?
- 如何详解 Activity 的生命周期?
- 为什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了吗?
- Android屏幕刷新机制