快速理解SurfaceFlinger 二、启动

上节介绍了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 flinger = new SurfaceFlinger();

实例化,开始占用内存。

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控制 )。


 

 

 

 

你可能感兴趣的:(显示系统)