Android系统架构和源码
目录介绍

1. Android系统框架介绍

Android系统架构组成部分如下图:

Figure 1: Android系统架构

1.1. Linux 内核

Android平台的基础是Linux内核。但是Android使用的Linux内核版本会包含一些特殊的补充功能,比如Low Memory Killer,Binder IPC通信等一些对于移动嵌入式设备来说非常重要的功能。除此之外,开发设备驱动程序与开发典型的Linux设备驱动程序类似。

1.2. 硬件抽象层(HAL)

Android的HAL(硬件抽象层)是在Android定义的标准接口下,硬件厂商自己实现的部分。HAL的目的是为了把Android framework与Linux kernel隔开,让Android不至于过度依赖Linux Kernel,以达成kernel independent的概念,也让Android framework的开发能在不考量驱动程序实现的前提下进行发展。HAL实现会被封装成模块,并由Android系统适时地加载。

1.3. Native

Native层主要是C/C++程序库和运行时库。这一层常见一些本地服务和一些链接库等,并通过应用程序框架为开发者提供服务。运行时库又分为两部分:虚拟机(ART)和核心库(Core Libraries),核心库提供了Java语言核心库的大多数功能,这样开发者可以通过Java语言来编写Android应用。

1.4. C++ Framework

Java层通过JNI或者AIDL接口,就会调用到C++ framework层。

1.5. Java Framework

我们可以通过java语言编写的API使用Android 系统的整个功能。这些API形成创建Android应用所需的构建块,他们可以简化核心模块化系统组件和服务的重复使用。包括以下组件和服务:

1、丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚 至可嵌入的网络浏览器

2、资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件

3、 通知管理器,可让所有应用在状态栏中显示自定义提醒

4、 Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈

5、内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据开发者可以完全访问 Android 系统应用使用的框架 API

1.6. 应用(Apps)

在应用框架上开发的应用程序集合,该层提供一些核心应用程序包,比如电子邮件、短信、日历、浏览器和联系人等应用。同时开发者可以利用java语言调用应用框架提供的API来编写自己的应用程序。

2. Android源码目录介绍

2.1. AOSP根目录结构

.
├── art                                             ART运行环境
├── bionic                                          bionic C库
├── bootable                                        系统启动引导代码
├── build                                           存放Android系统编译规则,以及generic等基础开发配置包
├── cts                                             Android兼容性测试套件标准
├── dalvik                                          Dalvik java虚拟机
├── developers                                      开发者目录,包含构建APP和一些Demo代码
├── development                                     开发者需要的一些例程和工具
├── device                                          设备相关配置
├── external                                        开源模块相关文件,一些开源的第三方组件
├── frameworks                                      应用程序框架,Android系统核心部分,由java和C++编写
├── hardware                                        主要包含了Android HAL相关代码
├── kernel
├── libcore                                         核心库相关文件
├── libnativehelper                                 动态库,实现JNI库的基础
├── Makefile                                        全局makefile
├── out                                             编译生成的结果都在这个目录
├── packages                                        系统应用程序包
├── pdk                                             Platform Development Kit的缩写,平台开发套件,包含硬件抽象层开发必要组件,加快第三方更新速度
├── platform_testing                                平台测试
├── prebuilts                                       x86和ARM架构下预编译的一些资源
├── sdk                                             sdk和模拟器
├── sstar_make.sh -> device/sigmastar/common/tools/sstar_make.sh
├── system                                          底层文件系统库,应用和组件,比如log,fastboot等源码-C语言
├── toolchain                                       工具链文件
├── tools                                           工具文件
├── vendor                                          设备厂商定制目录

2.2. Android架构层级和代码目录大致的对应关系

架构层级 代码目录
Application层 package/apps
sstar:vendor/sigmastar/common/apps
Framework层 frameworks/
Libraries层 核心库libcore/
Android Runtime: art/ dalvik/
HAL层 hardware/interface
sstar: /vendor/sigmastar/hardware
Kernel vendor/sigmastar/alkaid/kernel/common

2.3. 代码目录详细介绍

2.3.1. Framework目录

.
├── av(多媒体框架)
│   ├── camera                               // 相机
│   ├── cmds                                 // 命令源码
│   ├── drm                                  // 数据保护
│   ├── include                              // 头文件
│   ├── media                                // 多媒体部分
│   └── services                             // system services
├── base(应用框架层主要代码,也是Android源码主要核心目录)
│   ├── api                                  // java api 接口,Android应用框架层声明类、属性和资源
│   ├── cmds                                 // Android系统启动时用到的commands
│   ├── core                                 // framework层核心库(java jni proto res tests)
│   ├── data                                 // Android下的资源(字体资源、声音资源、视频资源等)
│   ├── docs                                 // 文档
│   ├── drm                                  // 数据保护(实现权限管理,数字内容解密等模块的工作)
│   ├── graphics                             // 图像渲染模块
│   ├── keystore                             // 数字签名相关内容
│   ├── libs                                 // C/C++实现的一些库(有hwui/input/services/storage/usb等库)
│   ├── location                             // 位置信息
│   ├── lowpan                               // 网络协议
│   ├── media                                // 媒体库
│   ├── native                               // native 方法实现(传感器,输入,界面,窗体)
│   ├── nfc-extras                           // nfc框架
│   ├── obex                                 // 蓝牙传输库
│   ├── opengl                               // 2d/3d图形库
│   ├── packages                             // 设置 TTS VPN程序
│   ├── proto                                // 协议框架
│   ├── rs                                   // 资源框架
│   ├── samples                              // Android案例程序
│   ├── sax                                  // XML解析器
│   ├── services                             // 各种系统服务
│   ├── telecomm
│   ├── telephony                            // 电话通信框架
│   └── wifi                                 // wifi相关
├── compile                                  // 编译的相关框架
├── ex                                       // 文件解析器
└── native                                   // native实现

应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。应用框架层的主要实现代码在framework/base和framework/av目录下

2.3.2. Device相关目录

device/sigmastar
├── common
└── pioneer5
    ├── kernel                 // kennel驱动相关目录
    ├── bootloader             // bootloader.img目录
    ├── factory                // 存放factory.img
    ├── overlay                // overlay目录
    ├── sdk                    // 主要放置一些配置文件,比如iqfile、ko参数表、riu工具等
    ├── sepolicy               // sepolicy配置相关
    ├── wifi_config            // wifi配置相关
    ├── pioneer5_sdp            // sdp产品配置
    ├── pioneer5_sdp_lr         // sdp_lr低内存产品配置
    ├── pioneer5_voip          // voip产品配置
    └── pioneer5_ad            // ad产品配置

common:主要放置一些平台无关的配置,比如分区表、共用rc文件、工具等。

pioneer5:pioneer5主要是p5平台相关的内容。p5平台下面又分了不同的product,目前有pioneer5_sdp/pioneer5_sdp_lr/pioneer5_voip/pioneer5_ad四个product。

2.3.3. vendor目录

vendor
├── realtek                     // realtek蓝牙/wifi hal
└── sigmastar                   // sigmastar目录
    ├── alkaid
    |   └── kernel/common       // Android kernel 目录
    ├── bootloader              // uboot相关代码
    ├── common
    |   ├── apps                // sstar预置apk,比如EXO player,工厂菜单等等
    |   ├── audio               // audio客制化相关,比如audio policy和audio policy engine
    |   ├── bootvideo           // bootvideo相关
    |   ├── gpu                 // gpu mali_g52相关lib
    |   ├── graphics            // gpu gfx相关
    |   ├── libsysprop          // sytemcontrol property相关
    |   ├── media               // media相关,比如ffmpeg、ffmpegextractor
    |   ├── recovery            // recovery ui
    |   └── sdk                 // 存放MI的lib以及head files
    ├── docs
    ├── hardware
    |   ├── audio               // audio hal
    |   ├── camera              // camera hal
    |   ├── graphics            // graphic allocator和hardware composer hal
    |   ├── health              // health hal
    |   ├── meida               // 编解码相关hal
    |   ├── synchronizer        // av sync相关hal
    |   ├── systemcontrol       // system control hal
    |   ├── tv                  // cec/input hal
    |   ├── usb                 // usb hal
    |   └── wlan                // wifi hal
    ├── interfaces              // media、synchronizer、systemcontrol、transmission相关AIDL接口
    └── tools                   // 工具

vendor/sigmastar放置的都是sigmastar相关的内容,基本上我们涉及的代码开发主要都是在这个目录里面。

3. 调用流程举例

3.1. camera调用流程

Figure 2: Camera架构

如Figure 2所示的Camera架构,可以看到Camera从app到HAL的完整flow。

1、首先Camera APK(package/apps/Camera2) 调用应用框架相应API(android.hardware.camera2)来创建camera实例,对应的源码位置在framework/base/core/java/android/hardware/camera2下。

2、接下来通过AIDL接口调用到Framework的CameraService。AIDL定义对应的源码位置在framework/av/camera/aidl/android/hardware下。而对应的接口实现则是在framework/av/camera下。

3、CameraService对应的源码在framework/av/services/camera/libcameraservice/下,而这个目录下的CameraService.cpp是摄像头服务与HAL交互的实际代码。

4、CameraService会通过HIDL 接口调用到HAL层,也就是camera provider service对应的HIDL定义位置在hardware/interface/camera/下的.hal文件,而对应的HIDL接口实现在hardware/interface/camera下。

5、最后camera provider service会load Camera HAL的so库,so对应的源代码在vendor/sigmastar/hardware/camera下,而so里面就会去调用MI接口来获取Camara数据。