当前位置: 首页 > news >正文

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
frameworkandroid (此部分链接到应用)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
NDKandroid/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
hal1.hal库
android\hardware\libhardware
2.旧的hal库
android\hardware\libhardware_legacy
tinyalsaandroid\external\tinyalsa
kernelALSAandroid\kernel\fusion\4.19\sound*

建议根据以上路径建立一个代码工程,没有任何资料比代码更有参考意义

相关文章:

  • 山西省建设监理官方网站无锡seo
  • 做网站系统的三只松鼠网络营销方案策划书
  • 佛山网站优化体验长沙网络营销外包哪家好
  • 怎么建设自己网站最新搜索引擎排名
  • 美国免费建站平台百度写作助手
  • 深圳做h5网站制作福州seo视频
  • 前端路由的基石:深度剖析 Hash 与 History 模式的本质差异与实战抉择
  • Spring:多数据源配置多个事务管理器DEMO
  • 【SpringBoot】⭐️AutoConfiguration配置的前世今生
  • c语言中的浮点类型
  • 细谈QT信号与槽机制
  • spring中的@Cacheable缓存
  • php后台增加权限控制
  • Odoo API 集成:XML-RPC 与 JSON-RPC 的比较
  • RabbitMq中启用NIO
  • 操作系统学习笔记 | 第一章 计算机系统概述
  • “ICU”归来的小鹏,如何抗衡小米YU7?
  • EJB知识
  • NCCN Guidelines Navigator:数智化工具引领肿瘤精准治疗新纪元
  • linux安装docker
  • 国内优秀wordpress主题推荐
  • 量学云讲堂2025朱永海慢牛开启第58期视频课程
  • 设计模式 | 工厂模式
  • 大模型推理-高通qnn基础
  • SpringMVC系列(三)(请求处理的十个实验(上))
  • MySQL常用函数性能优化及索引影响分析