Android显示系统之SurfaceFlinger(一)

本文详细介绍了Android系统中的SurfaceFlinger服务启动过程,包括如何通过System_init启动,SurfaceFlinger的线程创建,以及MessageQueue、Looper、Handler在其中的作用。SurfaceFlinger作为显示系统的关键组件,以高优先级运行,确保快速响应用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 SurfaceFlinger的启动

SurfaceFlinger的启动和ServiceManager有点类似,它们都属于系统的底层支撑服务,必需在设备开机的早期就运行起来。

/*frameworks/base/cmds/system_server/library/System_init.cpp*/

extern "C" status_t  system_init()

{…   

   property_get("system_init.startsurfaceflinger", propBuf,"1");

    if (strcmp(propBuf,"1") == 0) {

       SurfaceFlinger::instantiate();

}…

这个System_init.cpp会被编译到libsystem_server库中,然后由SystemServer在JNI层进行加载调用,从而启动包括SurfaceFlinger、SensorService等在内的系统服务。

和AudioFlinger/AudioPolicyService看到的情况一样,它调用instantiate来创建一个binder server,名称为“SurfaceFlinger”。而且强指针的特性让它在第一次被引用时会调用onFirstRef:

void SurfaceFlinger::onFirstRef()

{

    mEventQueue.init(this);

   run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);

    mReadyToRunBarrier.wait();

}

成员变量mEventQueue是一个MessageQueue,我们在进程章节已经详细分析过它与Looper、Handler等类的使用,大家可以先回头参考下(虽然Java层的这些类与SurfaceFlinger中用到的有一定差异,但其本质原理是一样的)。既然有消息队列,那就一定会有配套的事件处理器Handler以及循环体Looper,这些是在MessageQueue::init函数中创建的,即:

/*frameworks/native/services/surfaceflinger/MessageQueue.cpp*/

void MessageQueue::init(const sp<SurfaceFlinger>& flinger)

{

    mFlinger = flinger;

    mLooper = newLooper(true);

    mHandler = newHandler(*this);

}

也就是说这个MessageQueue类不但提供了消息队列,其内部还囊括了消息的处理机制,可以说是个“大杂烩”。那么这个Looper会在什么时候运行起来呢?显然SurfaceFlinger需要先自行创建一个新的线程来承载这一“业务”,否则就会阻塞Syst

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值