Android14音频子系统 - 系统框架概述
文章目录
- perface
- 1、术语概念
- 2、多种多样的框架图
- 1)粗略框图
- 2)从层级的角度来看音频框架
- 1、关键点说明
- 2、Android的硬件抽象层
- 3)从类的角度来看音频框架
- 4)从文件分布上来看音频框架
- 5)从进程的角度来看音频框架
- 6)notes
- 3、代码目录
perface
1、参考资料来源于各个系统版本,注意分辨差异,代码部分尽量以高版本作为例子
2、音频子系统作为最复杂的子系统之一;
3、只能作为参考(很多内容都是基于笔者的知识水平的一个补充,重点和技巧记录),细节要去看完整教程;
4、由于Android版本多,文章中存在大量引用资料,这些资料不一定是准确,持续更正中
2、系统程序分析方法
1)加入log,并跟着log一步步分析 -logcat;
2)利用ChatGPT提供基础概念解析 & 代码解析 & 设计原理;
3、目标
1)提供查阅代码的线索、思路;
2)能够根据日志进行快读的代码分析;
3)区分代码层次,为定制系统提供思路;
4)站在前人的肩膀上进一步探究;
4、action
务必根据本文提供的线索 去看源代码,所有的细节都在代码里面,所有的资料也只不过是代码的抽象映射
代码里面庞大的数据结构和错综复杂的关系,只有投入其中才能真正体会,理清所有细节需要花费大量时间,学习时先把握重点(框架和主要流程,细节等到需要时再去深究)
5、带着疑问去了解
1、音频系统的数据如何处理,编解码需要了解认识?
2、结合当前的调试和对Android系统的了解,以音频系统作为实践;
1)编译结构如何?
2)各种结构体如何梳理?
3)如何处理实际问题?
4)将各个新的知识点一一记录!
1、术语概念
1、
音频格式三要素:rate(48khz)、channel(5.1)、bit(8/16bit)
设备种类:蓝牙、喇叭、带麦克风耳机、耳机等等
厂商一般都封装音频驱动,不开放!2、
retention 保留接口
glitch 故障
benchmark : 基准测试程序
2、多种多样的框架图
网络上存在各式各样的音频子系统框架图,实在让人眼花缭乱,但从不同的框架图可以多维度地考察音频子系统的本质,有更立体的印象,因为每个不同的框架图都站在不同的角度去描述。
1)粗略框图
左边是传统linux视图,右图Android将User这一层再细分成4层(目的是实现向上提供便利,向下保持兼容)
2)从层级的角度来看音频框架
1、关键点说明
*从hal里面可以看出,适用于Android8以下
1、framework层的MediaPlayer/MediaPlayerService内部实现依赖 AudioTrack(播放)、AudioRecorder(录音),这些类的设计都是framework为便利上层应用开发所设计的,以AudioTrack/AudioRecorder为主线进行分析即可
2、Native层的AudioFlinger管理着系统中的输入输出音频流,并承担着音频数据的混合,通过读写Audio硬件实现音频数据的输入输出功能;AudioPolicyService是Audio系统的策略控制中心,掌管系统中声音设备的选择和切换、音量控制等。AudioFlinger和AudioPolicyService是系统层最重要的逻辑实现。
3、音频系统的HAL层,相较于其它子系统,需要考虑更多
1)对接Tinyalsa(早期是ALSA-lib);
2)音频设备存在很大的差异;
3)由于Android更新相当频繁,需要设计统一的接口(audio_hw_device、audio_stream_out、audio_stream_in);
3、tinyalsa是linux开源库,目的是方便开发者操作Audio driver
4、Tinyalsa->Audio driver ->Audio devices 为 linux簇系统(Android属于其一)统一的音频通路;
2、Android的硬件抽象层
1)不同Android版本上硬件抽象层形式有所不同(系统迭代的结果,现存的资料鱼龙混杂,确实让人难以区分)
1、hal库(Android8以下);2、hidl(Android8-Android10);3、aidl(Android10以上)
2)以厂商提供的hal库为例
是各个平台开发过程中主要关注和独立完成的部分,框架类的由Android google团队来维护和迭代
厂商提供的HAL库:audio.a2dp.default.so、audio.primary.default.so、audio.usb.default.so
,分别驱动蓝牙a2dp设备、主音频系统、usb音频设备,对应的配置文件有两个版本,分别:
1)低版本(<Android 7.0)的audio_policy.conf
2)高版本的(>Android 7.0)audio_policy_configuration.xml
3)从类的角度来看音频框架
层级调用关系
后续分析对应层级时再体现细节
4)从文件分布上来看音频框架
5)从进程的角度来看音频框架
参考Android13
1、AndroidSystem.java\AudioManager.java打包在Framework.jar中
2、APP进程用到的AudioTrack.java同样打包在Framework.jar中
3、AudioService用于管理音频设备路由策略,即java层对AudioPolicyService封装
6)notes
1、java层很少算法操作,大多数都是逻辑(if-else)处理,封装native的操作,方便上层调用;
2、调用/回调 的含义:比如java->cpp、cpp->java (接口名一般为 callback、notify);
3、Android系统更新十分频繁!
4、了解完架构之后,应进一步分析每个层级的内容 以及 层级之间的通讯;
3、代码目录
所在层次 | 名称 | 代码路径 |
---|---|---|
Application | 应用(调用系统库,实现用户逻辑) | 实现android中对应的类及方法MediaPlayer、MediaRecorder、AudioTrack、AudioRecorder |
framework | android (此部分链接到应用) | Framework.jar //代码引用语句:import android.media.* android/frameworks/base/media/java/android/media |
service (系统服务) | Framework java服务 android/frameworks/base/services/java/com/android/server/SystemServer.java android/frameworks/base/services/core/java/com/android/server/audio | |
JNI(过渡到native) | Android层的JNI,Audio的JNI是其中的一个部分 android/frameworks/base/core/jni //libandroid_runtime.so | |
NDK | android/frameworks/av/media 一、libaudioclient, JNI层通过此lib远程访问native层的audioflinger/audiopolicyservice接口 android\frameworks\av\media\audioserver android\frameworks\av\media\libaudioclient 二、audioserver进程 android/frameworks/av/services/audioflinger //libaudioflinger.so android/frameworks/av/services/audiopolicy/service //libaudiopolicyservice.so | |
hal | 1.hal库 android\hardware\libhardware 2.旧的hal库 android\hardware\libhardware_legacy | |
tinyalsa | android\external\tinyalsa | |
kernel | ALSA | android\kernel\fusion\4.19\sound* |
建议根据以上路径建立一个代码工程,没有任何资料比代码更有参考意义