注:本系列开始的一些文章主要是以翻译Google官方的文档为主。
1. Android Audio
Android的音频HAL(硬件抽象层)连接着更上层的, 在android.media包中的音频专属的API和更下层的驱动与硬件,粗略的分,可以将HAL分为一层,用户空间和内核空间分一层。
本系列主要讲述Audio的实现以及提高性能的一些tips.
2. Audio架构及代码分布
Android audio架构定义了audio是如何实现的,同时也指明这个实现涉及到的相关代码。
Android audio架构图:
下面简单介绍一下这个架构图:
Application framework
这部分包括App的代码,App使用android.media中的API来和audio硬件交互。在内部,App是通过JNI调用对应的native代码。JNI
Framework的api需要通过JNI调用到更下层的实现。是一个中介的作用。JNI的代码位于:frameworks/base/core/jni 和 frameworks/base/media/jni.Native framework
它提供和Framework相对应的本地实现,通过调用Binder代理和media server交互。代码位于:frameworks/av/media/libmediaBinder IPC
通过Binder跨进程和media server交互。Binder Proxy一般是以I开头的文件。代码位于:frameworks/av/media/libmediaMedia server
包括AudioFlinger和AudioPolicy, 它们是真正直接和HAL打交道的服务,代码位于:frameworks/av/services/audioflinger
frameworks/av/services/audiopolicyHAL
HAL定义了标准的接口,必须实现这些接口才能让Audio正常工作起来。接口定义文件:
hardware/libhardware/include/hardware/audio.hKernel driver
Driver连接着HAL和硬件,厂商可以使用ALSA, OSS或者自定义的driver。Android native audio based on Open SL ES
这部分在结构图中没有展示出来,这部分API是Android NDK的一部分,它的结构位置和android.media相同。