看到老罗android之旅分析android源码简直逆天,跟代码都跟到驱动层去了,看了半天连个大概都看不懂,还有《深入理解Android》,跟一段代码跟着跟着都不知道自己在看啥。发现还是要对系统框架有个大概的了解,再去看这些东西比较好。
SurfaceFlinger作为android绘制服务,涉及东西还是挺多的。
- 跨进程通信Binder机制
- 上层的View系统
- 下层的Display系统
首先是Binder,Binder主要用于Android中的跨进程通信,类似与socket一样的东西,由于Android将Bindder分为了业务层与传输层,导致了一堆Bindder对象的出现,再加上有一个比较特殊的服务ServiceManager一部分使用了Bindder,一部分又没有有使用Bindder,还有什么Server跟Service,导致看的整个人都不好。
先放一张IBinder的图
BpBinder与BBinder是一对,用于传输层的通信
BpSerivce与BnSerivce是一对,用于业务层的通信
ISerivce是客户端使用的Serivce接口
Serivce是具体的实现
最终的通信发生在IPCThreadState,具体实现使用/dev/binder这个设备文件及使用ioctl来与驱动通信。
举个荔枝
SurfaceFlinger与Ap通信是通过Binder来通信的,而且还不仅仅是一种,反正先关注ISurfaceComposerClient
除了个别名称不一致,其他都与之前分析的IBinder架构是一致的
大概的通信流程
分别来看一下其中每个类
ISurfaceComposerClient
ISurfaceComposerClient在ISurfaceComposerClient.h中定义
具体内容就是几个接口的声明
class ISurfaceComposerClient : public IInterface
{
public:
DECLARE_META_INTERFACE(SurfaceComposerClient);
...
virtual status_t createSurface(
const String8& name, uint32_t w, uint32_t h,
PixelFormat format, uint32_t flags,
sp<IBinder>* handle,
sp<IGraphicBufferProducer>* gbp) = 0;
virtual status_t destroySurface(const sp<IBinder>& handle) = 0;
virtual status_t clearLayerFrameStats(const sp<