一、Android整体框架
二、从开机到创建媒体服务器框架图
首先启动loader引导程序,进入Linux系统内核,启动第一个进程init,根据进程配置文件init.rc启动Android文件系统和必要的守护进程。
Android Audio
Audio是Android中最重要的一个组成部分,负责音频数据的采集和输出、音频流的控制、音频设备的管理、音量调节等内容
Audio Application Framework:音频应用框架
AudioTrack:负责回放数据的输出,属 Android 应用框架 API 类
AudioRecord:负责录音数据的采集,属 Android 应用框架 API 类
AudioSystem: 负责音频事务的综合管理,属 Android 应用框架 API 类
Audio Native Framework:音频本地框架
AudioTrack:负责回放数据的输出,属 Android 本地框架 API 类
AudioRecord:负责录音数据的采集,属 Android 本地框架 API 类
AudioSystem: 负责音频事务的综合管理,属 Android 本地框架 API 类
Audio Services:音频服务
AudioPolicyService:音频策略的制定者,负责音频设备的策略抉择、音量调节策略等
AudioFlinger:音频策略的执行者,负责输入输出流设备的管理及音频流数据的传输
Audio HAL:音频硬件抽象层,负责与音频硬件设备的交互,由 AudioFlinger 直接调用
三、源码剖析
Medio/java: 多媒体上层APP
/jni: java上层和native之间的桥梁
/libdrm: 应用层代码库(提供给上层应用层,底层驱动接口)
/libmedia:
/libmediaplayerservice:
/Libstagefright:
/mediaserver:
/tests:
Android .mk文件详解
学习Android.mk文件前先学习Makefile。
Makefile文件控制整个工程的编译规则,用于描述编译文件的具体细节(源文件、依赖文件、生成文件、文件路径等)。Make就是一个命令工具,可以解析Makefile文件中的指令的一个命令工具。
Android.mk是Android架构下的一种经过Android系统自己处理过的一类特殊的Makefile文件。Android编译系统位于Android根目录下的bulid文件内,由许多的文件(包括Makefile、*.md)组成。
Android系统架构
Android系统基于Linux内核,共分四层!
Applications层:与用户直接交互的众多应用程序构成,基于Java开发
Framework层:Java框架层,是Java程序能在Android 上运行的基础
Libraries层:这一层提供动态库、Android运行时库、Daivik虚拟机等,大部分内容基于C/C++,也叫Native(本地)层
Linux内核层:包含Linux内核和一些驱动模块
事实上在Framework层和Native层之间还有一个桥梁JNI层,作为Java与系统底层无关的基石
Android-----JNI的认知
JNI(Java Native Interface):他提供了若干API接口用于实现Java和其他语言的通行,就像不同语言之间的桥梁。(Java语言和Native语言之间的API)中文可翻译为Java本地调用。
Java作为上层应用,Native作为底层的架构,JNI层介于两层之间。
Java承担着快速调用,统筹各模块功能的作用,Native承担着具体实现各模块功能的作用。
JNI函数注册:
静态注册就是直接在Java文件里写个native方法 然后再c/c++文件中实现这个方法就行了!
动态注册利用 RegisterNatives 方法来注册 java 方法与 JNI 函数的一一对应关系
静态改动态注册,只需要改JNI层代码。
JNI实例:MediaScanner
由Java层调用JIN层实现native函数,JNI层实现具体和native函数的对接
多媒体框架
- 四层体系架构:应用层、系统层、Android运行时、Linux内核
- Android多媒体引擎层位于第三层主要是C/C++库支撑各种服务
- 首先启动loader引导程序,进入Linux系统内核,启动第一个进程init,根据进程配置文件init.rc启动Android文件系统和必要的守护进程,以及重要服务(Media Server、ServerManger)
- Zygote是第一个Java进程,是所有的Java进程的父进程
- APP播放一个音频文件的简单实现步骤
MediaPlayer mediaPlayer = new MediaPlayer();
//创建一个对象mediaPlayer,申请空间
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp){
mediaPlayer.release();
mediaPlayer = null;
}//释放初始化为空
});
mediaPlayer.setDataSource("abc.mp3"); //获取MP3文件来源路径
mediaPlayer.setDisplay();//调用显示
mediaPlayer.prepare();//播放准备资源
mediaPlayer.start();//播放开始指令
- Binder机制:Android多线程之间的系统通信底层都是依赖于binder IPC来实现
- Binder概念梳理:
首先会有一个BOSS级别的ImediaPlayerService,他要处理的事情有点多:
- ImediaMetadataRetriever
- ImediaRecorder
- IOMX
- ImediaCodecList
所以这个BOSS会创建很多进程来跟进负责每一板块的任务!
- Audio系统分析
Audio主要分为3大块:
- AudioManager:管理全局Audio系统
- AudioFlinger—工作引擎,实操中心
- AudioPolicyService—策略控制中心
- AudioTrack:主要负责播放音频模块
- AudioRecord:主要负责录音模块
AudioTrack模块分析
AudioTrack:输出音频编码数据流,用于给缓冲区提供数据流,会被AudioFlinger调用play函数实现播放。
Java层AudioTrack位于:framework\base\media\java\android\media\AudioTrack.java
Java层更多的是直接调用AudioTrack
根据AudioTrack类创建对象,通过AudioManager管理模式和属性等,最后通过这个对象调用play()函数实现音频的播放,调用stop()函数实现音频播放的停止,调用rekease()函数释放对象以及所附带占有的资源。
播放的时候涉及到两种数据传输模式:MODE_STATIC和MODE_STREAM,在创建对象时候,传入模式参数,前者是将数据一次性地直接传递给AudioTrack,后者是创建一个缓冲池,将数据流先交给缓冲池,AudioTrack会自行从缓冲池获取数据流。
AudioTrack先和AudioFlinger进行交互,
3 分析Java层AudioTrack 到C++层AudioTrack
3.1 构造器分析之 Java层AudioTrack 到C++层AudioTrack
同时这里Java层AudioTrack对象的创建顺带Native层的AudioTrack对象也会完成创建。