Android Service Framework是一系列类的集合,使用它可以快速开发出可靠优良的Android平台上的各种服务。
使用Service Framework开发时, 把主要精力集中在核心功能上即可, 服务注册,服务Binder IPC等功能都由系统提供。
Service Framework分为C++语言编写的本地服务框架及JAVA编写的JAVA服务框架。
图, 服务框架
应用程序框架中的Activity Manager等Java系统服务都是使用Java服务框架实现的, Surface Flinger等本地系统服务都是使用本地服务框架实现的。
Android Service Framework提供的四种主要功能
服务接口, 服务生成, Binder IPC处理, 服务管理
1. 服务框架的构成
1.1 各层构成元素的配置
图
1.2各层构成元素间的相互作用
<1>位于服务层中的服务接口使服务使用者与服务使用同一的接口进行相互作用。
<2>处于RPC层的服务代理与服务Stub支持Binder RPC操作。
服务代理将函数调用信息转化为RPC代码与数据, 服务Stub分析服务代理发送过来的RPC代码与数据, 而后调用服务Stub函数。
<3>位于IPC层的BpBinder类与BBinder支持Binder IPC操作。
当调用BpBinder的tansact函数时, BBinder的tansact函数即被调用, 同时传递RPC代码与数据。
IPC层还提供了IPCThreadState类,IPCThreadState使用Binder协议命令与Binder Driver通信。
图
2. 运行机制
Audio Flinger类图
2.1 服务接口
服务函数中服务接口中声明, 并分别在服务于服务代理中实现。
例如Audio Flinger的 服务接口IAudioFlinger, 主要特征如下:
<1>IAudioFlinger类继承自IInterface类
<2>类的内部使用DECLARE_META_INTERFACE宏
<3>声明IAudioFlinger的setMasterVolume成员函数
IAudioFlinger服务接口继承自IInterface类
IAudioFlinger服务接口中有一个setMasterVolume服务函数的声明, 分别在AudioFlinger和BpAudioFlinger服务代理中实现。
IInterface类中, asBinder函数用来将服务接口类型转换为IBinder类型, asInterface函数则用来将IBinder类型转换为服务接口类型。
在向Context Manager注册服务时,AudioFlinger通过IInterface类的asBinder先把服务转换成IBinder类型, 再传递给Binder Driver。
BnInterface与BpInterface两个类中的onAsBinder成员函数代码不同。
BnInterface继承了BBinder类, BBinder类又继承了IBinder类,所以BnInterface是IBinder的子类。
BnInterface类的onAsBinder函数的返回值为IBinder类型, 即返回类自身的地址。
BpInterface类的onAsBinder函数将调用remote函数, 调用remote函数又会引起BpRefBase类的remote函数调用, 返回mRemote变量。
mRemote变量是IBinder类型的。
DECLARE_META_INTERFACE宏的作用
宏预处理, 在代码中有descriptor数据成员, asInterface, getInterfaceDescriptor成员函数的声明。
其中asInterface是类型变换函数, 它接收一个IBinder类型的参数, 将其转换成IAudioFlinger类型, 功能与IInterface的asBinder函数正好相反。
若传递过来的参数类型是BpBinder, 则IBinder的queryLocallInterface函数将被调用,将创建BpAudioFlinger实例。
若参数是BBinder类型, 则BnInterface的queryLocallInterface函数被调用,若参数值为IAudioFlinger接口的名称(android.media.IAudioFlinger),
则返回AudioFlinger服务的实例。
总之, asInterface函数由DECLARE_META_INTERFACE与IMPLEMENT_META_INTERFACE宏生成,该函数接受IBinder类型的参数,
通过判断参数的具体类型(BBinder或者BpBinder),调用相应函数,返回IAudioFlinger类型的具体服务或者服务代理。即将IBinder类型转换为具体的
IAudioFlinger类型返回。
图 IAudioFlinger与IBinder类间进行类型转换的过程。
2.2 服务
服务函数中服务类中被实现,如setMasterVolume函数, 在AudioFlinger类中被具体实现。
AudioFli