上节介绍了SurfaceFlinger 代码路径及编译文件。
2.1下面来分析初步启动流程。
int main(int, char**) {
//ba la ba la ...
// run surface flinger in this thread
flinger->run();//跑起来
return 0;
}
flinger->run();
看此代码应该是启动具体线程用来支撑服务。
// instantiate surfaceflinger
sp
实例化,开始占用内存。
2.2 frameworks/native/services/surfaceflinger$ vim ./SurfaceFlinger.cpp
先看下具体执行方法:
void SurfaceFlinger::run() {
do {
waitForEvent();
} while (true);
}
看下方法waitForEvent
void SurfaceFlinger::waitForEvent() {
mEventQueue.waitMessage();
}
看下mEventQueue的定义,成员变量一般放在xxx.h中
frameworks/native/services/surfaceflinger$ vim SurfaceFlinger.h
SurfaceFlinger.h
mutable MessageQueue mEventQueue;
2.3 MessageQueue 是什么,有什么用?先搞清楚
看代码:./frameworks/native/services/surfaceflinger/MessageQueue.cpp
void MessageQueue::waitMessage() {
do {
IPCThreadState::self()->flushCommands();
int32_t ret = mLooper->pollOnce(-1);
switch (ret) {
case Looper::POLL_WAKE:
case Looper::POLL_CALLBACK:
continue;
case Looper::POLL_ERROR:
ALOGE("Looper::POLL_ERROR");
continue;
case Looper::POLL_TIMEOUT:
// timeout (should not happen)
continue;
default:
// should not happen
ALOGE("Looper::pollOnce() returned unknown status %d", ret);
continue;
}
} while (true);
}
看下flushCommands具体实现
void IPCThreadState::flushCommands()
{
if (mProcess->mDriverFD <= 0)//检查是否打开binder驱动
return;
talkWithDriver(false);
}
可以理解为刷新消息,重点在mLooper->pollOnce(-1),
用于监听消息,同步阻塞进程,
若有message然后使用已定义的handler处理消息,
从while死循环表明将持续监听处理消息。
note:ProcessState::self() 用于打开binder驱动,IPCThreadState::self()创建线程
2.4 MessageQueue 消息处理
void MessageQueue::Handler::handleMessage(const Message& message) {
switch (message.what) {
case INVALIDATE:
android_atomic_and(~eventMaskInvalidate, &mEventMask);
mQueue.mFlinger->onMessageReceived(message.what);
break;
case REFRESH:
android_atomic_and(~eventMaskRefresh, &mEventMask);
mQueue.mFlinger->onMessageReceived(message.what);
break;
}
}
从消息处理来看,又转到SurfaceFlinger,再看下MessageQueue与之关系
void SurfaceFlinger::onFirstRef()//强指针机制
{
mEventQueue.init(this);
}
SurfaceFlinger 实例化后会调用onFirstRef(),原理是强指针计数,SurfaceFlinger继承RefBase。
void MessageQueue::init(const sp& flinger)
{
mFlinger = flinger;
mLooper = new Looper(true);
mHandler = new Handler(*this);
}
通过Init传递SurfaceFlinger对象强指针,这样在handleMessage中可使用onMessageReceived
void SurfaceFlinger::onMessageReceived(int32_t what) {
ATRACE_CALL();
switch (what) {
case MessageQueue::INVALIDATE: {
bool frameMissed = !mHadClientComposition &&
mPreviousPresentFence != Fence::NO_FENCE &&
mPreviousPresentFence->getSignalTime() == INT64_MAX;
ATRACE_INT("FrameMissed", static_cast(frameMissed));
if (mPropagateBackpressure && frameMissed) {
signalLayerUpdate();
break;
}
bool refreshNeeded = handleMessageTransaction();
refreshNeeded |= handleMessageInvalidate();
refreshNeeded |= mRepaintEverything;
if (refreshNeeded) {
// Signal a refresh if a transaction modified the window state,
// a new buffer was latched, or if HWC has requested a full
// repaint
signalRefresh();
}
break;
}
case MessageQueue::REFRESH: {
handleMessageRefresh();
break;
}
}
}
最终回到SurfaceFlinger,界面刷新在handleMessageRefresh,包含图层建立与混合,具体后面会讲到。
至此SurfaceFlinger 服务已建立起来,通过消息机制来处理事件。服务端需要客户端的请求才能完成具体功能,SurfaceFlinger是处理显示业务,不用读代码可以从android启动过程来看,第一个与SurfaceFlinger交互的必然是动画进程(开机Log由kernel控制 )。