快速理解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<SurfaceFlinger> 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<SurfaceFlinger>& 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<int>(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控制 )。


 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值