当前位置: 首页 > 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*

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

http://www.lqws.cn/news/516619.html

相关文章:

  • Python爬取TMDB电影数据:从登录到数据存储的全过程
  • 康谋方案 | ARXML 规则下 ECU 总线通讯与 ADTF 测试方案
  • JMeter中变量如何使用?
  • 标题:2025金融护网行动实战指南:从合规防御到智能免疫的体系化进阶
  • C++ 多线程深度解析:掌握并行编程的艺术与实践
  • 自动化测试--App自动化之项目实战脚本编写及封装流程
  • Linux 怎么恢复sshd.service
  • python的智慧养老院管理系统
  • TensorFlow Lite (TFLite) 和 PyTorch Mobile模型介绍1
  • Azure 自动化:所需状态配置 (DSC)
  • VS Git巨坑 切换分支失败导致原分支被修改
  • pscc系统如何部署,怎么更安全更便捷?
  • 项目研发过程管理:8Manage PM 与泛微OA项目管理工具深度对比
  • 通俗易懂解读BPE分词算法实现
  • 理解epoll:水平触发与边沿触发
  • 用Python做一个手机镜头
  • 如何打造Apache Top-Level开源时序数据库IoTDB
  • React 生命周期概览
  • Happy-LLM-Task06 :3.1 Encoder-only PLM
  • configure: error: no acceptable C compiler found in $PATH
  • UE5初学者教程笔记(一)
  • Android 10.0 java.lang.IllegalStateException The content of the adapter has
  • Bright Data亮数据 MCP + N8N x AI 新闻编辑:基于亮数据,数据采集到观点摘要工作流自动化实践
  • 20250625解决在Ubuntu20.04.6LTS下编译RK3588的Android14出现cfg80211.ko的overriding问题
  • LE AUDIO---Chapter 2. The Bluetooth® LE Audio architecture
  • 个人技术文档库构建实践:基于Cursor和GitHub的知识管理系统(含cursor rules)
  • 实战使用 Docker Compose 搭建 Redis Cluster 集群
  • CommunityToolkit.Mvvm 重构激光直写控制软件
  • STM32G070x 单片机项目代码解析:基于 HAL 库的嵌入式系统开发
  • oracle 删除数据