安卓进阶之android架构

安卓进阶躲不开阅读源码和深入了解安卓的底层,这是一篇入门级别的文章,可以对安卓架构有个大体的认识。

AOSP与Android系统架构

首先要理解andriod和AOSP的关系,我们日常开发的安卓跟市面上的安卓不是一个意思,我们开发的是安卓app,市面上的安卓其实是安卓系统。

维基百科:Android是基于Linux 内核和其他开源软件的修改版本的移动操作系统,主要为智能手机和平板电脑等触摸屏移动设备设计。

官方文档:**Android 开放系统平台 (Android open source project AOSP)**是公开可用且可修改的 Android 源代码。任何人都可以为他们的设备下载和修改 AOSP。 AOSP 提供完整且功能齐全的 Android 移动平台实现。

五层的安卓架构(下图左边),一些书籍或者博客上常见的这张图;最新版可看官方文档(回头看这篇文章的时候可能也会过时)。以下介绍会结合两个图进行说明。

最新的AOSP软件堆栈架构如下图右边,即我们说的android系统架构:

APM框架 Android 安卓框架aosp_应用程序

详细介绍如下:

应用层(System apps)

包括Android appPrivileged appDevice manufacture app等应用程序,system apps的意思就是手机系统中的apps,两个版本在这一层是一样的。

  • 安卓应用(Android app):仅使用 Android SDK 中的 Android API 创建的应用程序。
  • 特权应用程序(Privileged app):结合使用 Android 和系统 API 创建的应用程序。这些应用程序必须作为特权应用程序预安装在设备上。
  • 设备制造应用程序(Device manufacture app):使用 Android API、系统 API 和直接访问 Android 框架实现的组合创建的应用程序。

应用框架层(Java API Framework)

我们平时开发都是用到这一层提供的API,而这一层是java编写的,所以称为Java API。Android 4大组件,6大布局,view等系统定义的原生组件都在这层。

由于Framkwork层和Android SDK 是有交集的(或者是包含关系),旧版本中其实是把Framework层和Android SDK合并作为一层去介绍了。

  • Framework层
    又称安卓框架。一组 Java 类、接口和其他构建应用程序的预编译代码。该框架的某些部分可通过使用 Android SDK 的 Android API 公开访问。Android 框架代码在应用进程中运行。
  • Android SDK = Android API + System API
    又称安卓开发工具包。一个软件开发工具包,用于创建与 Android 框架交互的应用程序。 Android SDK 由适用于所有应用程序的 Android API 和仅适用于特权应用程序的系统 API 组成。

后续的源码阅读会经常看到ActivityManagerService(AMS)、WindowManagerService(WMS)这些,这些都是FrameWork层的源码。

名称

功能描述

Activity Manager(活动管理器)

管理各个应用程序生命周期,以及常用的导航回退功能

Location Manager(位置管理器)

提供地理位置及定位功能服务

Package Manager(包管理器)

管理所有安装在Android系统中的应用程序

Notification Manager(通知管理器)

使得应用程序可以在状态栏中显示自定义的提示信息

Resource Manager(资源管理器)

提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等

Telephony Manager(电话管理器)

管理所有的移动设备功能

Window Manager(窗口管理器)

管理所有开启的窗口程序

Content Provider(内容提供者)

使得不同应用程序之间可以共享数据

View System(视图系统)

构建应用程序的基本组件

系统服务(System services)

这个是五层架构中没有提及的部分,是在新版中单独分离出来的一层。

系统服务是模块化的、集中的组件,例如system_server 、SurfaceFlinger 和 MediaService。

**Android 框架 API 公开的功能与系统服务通信以访问底层硬件。**所以它夹在应用框架层和运行库层之间。

系统运行库层

旧版中系统运行库包括native库和ART库。

新版中两者是分开的,而且并不在同一层,旧版中的本机C/C++库,在新版中扩展为本机的进程和库。

  • ART库:Android run time是 AOSP提供的Java应用运行环境。所以我们的程序采用java语言编写, 程序在Android运行时中执行。ART 将应用程序的字节码转换为特定于处理器的指令,这些指令由设备的运行时环境执行。

运行时库包括核心库和ART(Android5.0后,Dalvik被ART取代),其中核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。

  • Native daemons and libraries:本机守护进程和库。
  • 该层中的本机守护进程包括inithealthdlogdstoraged 。这些守护进程直接与内核或其他接口交互,不依赖于基于用户空间的 HAL 实现。
  • 该层中的本机库包括libclibloglibutilslibbinderlibselinux 。这些本机库直接与内核或其他接口交互,不依赖于基于用户空间的 HAL 实现。

硬件抽象层(HAL)

HAL 是一个抽象层,具有供硬件供应商实现的标准接口。 HAL 允许 Android 不了解较低级别的驱动程序实现。使用 HAL 允许在不影响或修改更高级别系统的情况下实现功能。

Linux 内核层(Linux Kernel)

作为任何操作系统的核心部分,内核与设备上的底层硬件进行对话。在可能的情况下,AOSP 内核被拆分为与硬件无关的模块和特定于供应商的模块。

andriod内核是基于Linux内核的,在此基础上添加了关于安卓的驱动。

系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。

其中的驱动包括:音频(Audio)、android IPC机制(Binder机制)跨进程通讯、显示 (Display)主要是屏幕显示、按键(Keypad) 处理按键的分发等、蓝牙(BlueTooth)、相机(Camera)、内存分配与共享(Shared Memory)、USB、WIFI、电源管理(power management)

Andriod系统源码目录

官方网站:https://cs.android.com/android/platform/superproject

国内网站:https://www.androidos.net.cn/android/10.0.0_r6/xref

整体架构

APM框架 Android 安卓框架aosp_APM框架 Android_02

Android源码根目录

描述

abi

应用程序二进制接口

art

全新的ART运行环境

bionic

系统C库

bootable

启动引导相关代码

build

存放系统编译规则及generic等基础开发包配置

cts

Android兼容性测试套件标准

dalvik

dalvik虚拟机

developers

开发者目录

development

应用程序开发相关

device

设备相关配置

docs

参考文档目录

external

开源模组相关文件

frameworks

应用程序框架,Android系统核心部分,由Java和C++编写

hardware

主要是硬件抽象层的代码

libcore

核心库相关文件

libnativehelper

动态库,实现JNI库的基础

ndk

NDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码

out

编译完成后代码输出在此目录

packages

应用程序包

pdk

Plug Development Kit 的缩写,本地开发套件

platform_testing

平台测试

prebuilts

x86和arm架构下预编译的一些资源

sdk

sdk和模拟器

system

底层文件系统库、应用和组件

toolchain

工具链文件

tools

工具文件

Makefile

全局Makefile文件,用来定义编译规则

应用层部分

应用层位于整个Android系统的最上层,源码根目录中的packages目录对应着系统应用层。它的目录结构如下:

APM框架 Android 安卓框架aosp_APM框架 Android_03

packages目录

描述

apps

核心应用程序

experimental

第三方应用程序

inputmethods

输入法目录

providers

内容提供者目录

screensavers

屏幕保护

services

通信服务

wallpapers

墙纸

应用框架层

应用框架层一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。
应用框架层的主要实现代码在/frameworks/base和/frameworks/av目录下,其中/frameworks/base目录结构如下:

APM框架 Android 安卓框架aosp_应用程序_04

/frameworks/base目录

描述

api

定义API

cmds

重要命令:am、app_proce等

core

核心库

data

字体和声音等数据文件

docs

文档

graphics

图形图像相关

include

头文件

keystore

和数据签名证书相关

libs


location

地理位置相关库

media

多媒体相关库

native

本地库

nfc-extras

NFC相关

obex

蓝牙传输

opengl

2D/3D 图形API

packages

设置、TTS、VPN程序

sax

XML解析器

services

系统服务

telephony

电话通讯管理

test-runner

测试工具相关

tests

测试相关

tools

工具

wifi

wifi无线网络

C/C++程序库部分

系统运行库层(Native)中的
C/C++程序库的类型繁多,功能强大,C/C++程序库并不完全在一个目录中,这里给出几个常用且比较重要的C/C++程序库所在的目录位置。

目录位置

描述

bionic/

Google开发的系统C库,以BSD许可形式开源。

/frameworks/av/media

系统媒体库

/frameworks/native/opengl

第三方图形渲染库

/frameworks/native/services/surfaceflinger

图形显示库,主要负责图形的渲染、叠加和绘制等功能

external/sqlite

轻量型关系数据库SQLite的C++实现

Android运行时库的代码放在art/目录中。硬件抽象层的代码在hardware/目录中,这一部分是手机厂商改动最大的一部分,根据手机终端所采用的硬件平台会有不同的实现。