Android系统架构和源码
目录介绍
1. Android系统框架介绍¶
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架构,可以看到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数据。