携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情
应用程序执行过程
Android是架构分为三层:
- 底层 Linux Kernel
- 中间层 主要由C++实现 (Android 60%源码都是C++实现)
- 应用层 主要由JAVA开发的应用程序
应用程序执行过程大致如下:
JAVA应用程序产生操作(播放音乐或停止),然后通过JNI调用进入中间层执行C++代码,中间层处理后可能需要硬件产生动作的,会继续将操作传到Linux Kernel,不需要硬件产生操作的可能在中间层做一些处理就直接返回。需要硬件产生操作的动作则需通过Kernel调用相关的驱动执行动作或一些处理。
在这里大家需要明白一点:
Android仅使用了Linux的Kernel,即便是一些常用的库例如pthread等,都是Android自已用C/C++/汇编重写实现的。因为在音频通路建立过程中,涉及Android IPC通信及系统服务管理,所以下面就这两点先做个简述:
① Android IPC通信采用的是Client/Server结构,Client 客户端 (AudioRecord)通过接口(IAudioRecord)调用Server 服务器对象(AudioFlinger及AudioFlinger::RecordThread等)的方法,并获取执行结果。AudioRecord.cpp 主要是对类AudioRecord的实现,AudioFlinger.cpp主要是对类AudioFlinger的实现。在底层音频通信中,可以将AudioRecord作为Android IPC通信的客户端,而将AudioFlinger作为服务器端。 AudioRecord获取服务器端接口(mAudioRecord)后就可以像执行自已的方法一样调用服务器端方法(AudioFlinger)。
② Android 启动时会创建一个服务管理进程。Android系统中所有的服务都必需注册添加到该进程中,可以通过sp sm=defaultServiceManager()获取管理进程接口,然后可以通过它的AddService方法将服务注册添加:sm->addService(String16("media.audio_flflinger"),new AudioFlinger());只有将服务添加到管理进程中才能被其它的进程使用:
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm-
>getService(String16("media.audio_flinger"));
Android的音频系统在启动的时候会创建两个服务:一个是上面的示例AudioFlingerService,一个是AudioPolicyService,并添加到管理进程中,之后其它进程可以使用它们提供的方法。以下简称AudioFlingerService为AudioFlinger, AudioPolicyService为AudioPolicy。