SurfaceFlinger的启动脚本surfaceflinger.rc内容如下:

service surfaceflinger /system/bin/surfaceflinger    class core    user system    group graphics drmrpc readproc    onrestart restart zygote    writepid /dev/stune/foreground/tasks

其main函数在frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp,如下:

int main(int, char**) {    signal(SIGPIPE, SIG_IGN);    // When SF is launched in its own process, limit the number of    // binder threads to 4.    ProcessState::self()->setThreadPoolMaxThreadCount(4);    // start the thread pool    sp<ProcessState> ps(ProcessState::self());    ps->startThreadPool();    // instantiate surfaceflinger    sp<SurfaceFlinger> flinger = new SurfaceFlinger();    setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);    set_sched_policy(0, SP_FOREGROUND);#ifdef ENABLE_CPUSETS    // Put most SurfaceFlinger threads in the system-background cpuset    // Keeps us from unnecessarily using big cores    // Do this after the binder thread pool init    set_cpuset_policy(0, SP_SYSTEM);#endif    // initialize before clients can connect    flinger->init();    // publish surface flinger    sp<IServiceManager> sm(defaultServiceManager());    sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);    // publish GpuService    sp<GpuService> gpuservice = new GpuService();    sm->addService(String16(GpuService::SERVICE_NAME), gpuservice, false);    struct sched_param param = {0};    param.sched_priority = 2;    if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {        ALOGE("Couldn't set SCHED_FIFO");    }    // run surface flinger in this thread    flinger->run();    return 0;}

1、SurfaceFlinger首先忽略了SIGPIPE信号,为什么要这么做呢?因为在SurfaceFlinger的Client-Server模型中,或者说IPC机制中,很可能会触发SIGPIPE信号,而这个信号的默认动作是终止进程,并不是我们想要的行为,所以主动对SIGPIPE信号进行处理。

2、接着,开启线程池,不过限制了线程的最大数量为4个,如果线程过多,可能会影响程序性能。

3、随后,创建SurfaceFlinger对象,在其构造函数中,主要是一些成员变量的初始化工作,同时还有一个高逼格的DDMS配置,即Dalvik Debug Monitor Service,是一个调试神器。如果配置了DDMS,就会dlopen libsurfaceflinger_ddmconnection.so,并dlsym其中的DdmConnection_start,最后建立SurfaceFlinger与DDMS的连接。

class SurfaceFlinger : public BnSurfaceComposer,                       private IBinder::DeathRecipient,                       private HWComposer::EventHandlerSurfaceFlinger::SurfaceFlinger()    :   BnSurfaceComposer(),        mTransactionFlags(0),        mTransactionPending(false),        mAnimTransactionPending(false),        mLayersRemoved(false),        mRepaintEverything(0),        mRenderEngine(NULL),        mBootTime(systemTime()),        mBuiltinDisplays(),        mVisibleRegionsDirty(false),        mGeometryInvalid(false),        mAnimCompositionPending(false),        mDebugRegion(0),        mDebugDDMS(0),        mDebugDisableHWC(0),        mDebugDisableTransformHint(0),        mDebugInSwapBuffers(0),        mLastSwapBufferTime(0),        mDebugInTransaction(0),        mLastTransactionTime(0),        mBootFinished(false),        mForceFullDamage(false),        mPrimaryDispSync("PrimaryDispSync"),        mPrimaryHWVsyncEnabled(false),        mHWVsyncAvailable(false),        mHasColorMatrix(false),        mHasPoweredOff(false),        mFrameBuckets(),        mTotalTime(0),        mLastSwapTime(0){    ALOGI("SurfaceFlinger is starting");    // debugging stuff...    char value[PROPERTY_VALUE_MAX];    property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");    mGpuToCpuSupported = !atoi(value);    property_get("debug.sf.showupdates", value, "0");    mDebugRegion = atoi(value);    property_get("debug.sf.ddms", value, "0");    mDebugDDMS = atoi(value);    if (mDebugDDMS) {        if (!startDdmConnection()) {            // start failed, and DDMS debugging not enabled            mDebugDDMS = 0;        }    }    ALOGI_IF(mDebugRegion, "showupdates enabled");    ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");    property_get("debug.sf.disable_backpressure", value, "0");    mPropagateBackpressure = !atoi(value);    ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation");    property_get("debug.sf.disable_hwc_vds", value, "0");    mUseHwcVirtualDisplays = !atoi(value);    ALOGI_IF(!mUseHwcVirtualDisplays, "Disabling HWC virtual displays");}

因为这里的SurfaceFlinger对象是一个StrongPointer,所以首先会走到RefBase的onFirstRef,这里就做了一件事情,MessageQueue初始化,保存SurfaceFlinger,并创建了消息队列所需的Looper和Handler。

void SurfaceFlinger::onFirstRef(){    mEventQueue.init(this);}void MessageQueue::init(const sp& flinger){    mFlinger = flinger;    mLooper = new Looper(true);    mHandler = new Handler(*this);}

4、SurfaceFlinger实例化后,设置进程优先级和事务处理策略。

5、然后,进入如下的SurfaceFlinger::init,主要是EGL配置、event线程启动、硬件composer初始化等,而且著名的VSync也在这里出现了。

void SurfaceFlinger::init() {    ALOGI(  "SurfaceFlinger's main thread ready to run. "            "Initializing graphics H/W...");    { // Autolock scope        Mutex::Autolock _l(mStateLock);        // initialize EGL for the default display        mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);        eglInitialize(mEGLDisplay, NULL, NULL);        // start the EventThread        sp vsyncSrc = new DispSyncSource(&mPrimaryDispSync,                vsyncPhaseOffsetNs, true, "app");        mEventThread = new EventThread(vsyncSrc, *this);        sp sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,                sfVsyncPhaseOffsetNs, true, "sf");        mSFEventThread = new EventThread(sfVsyncSrc, *this);        mEventQueue.setEventThread(mSFEventThread);        // set SFEventThread to SCHED_FIFO to minimize jitter        struct sched_param param = {0};        param.sched_priority = 2;        if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) {            ALOGE("Couldn't set SCHED_FIFO for SFEventThread");        }        // Get a RenderEngine for the given display / config (can't fail)        mRenderEngine = RenderEngine::create(mEGLDisplay,                HAL_PIXEL_FORMAT_RGBA_8888);    }    // Drop the state lock while we initialize the hardware composer. We drop    // the lock because on creation, it will call back into SurfaceFlinger to    // initialize the primary display.    mHwc = new HWComposer(this);    mHwc->setEventHandler(static_cast(this));    Mutex::Autolock _l(mStateLock);    // retrieve the EGL context that was selected/created    mEGLContext = mRenderEngine->getEGLContext();    LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,            "couldn't create EGLContext");    // make the GLContext current so that we can create textures when creating    // Layers (which may happens before we render something)    getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);    mEventControlThread = new EventControlThread(this);    mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);    // initialize our drawing state    mDrawingState = mCurrentState;    // set initial conditions (e.g. unblank default device)    initializeDisplays();    mRenderEngine->primeCache();    // start boot animation    startBootAnim();    ALOGV("Done initializing");}

6、在Android系统中有一个ServiceManager,专门用来管理所有的服务,而SurfaceFlinger不是由ServiceManager启动的,因此需要向ServiceManager注册SurfaceFlinger,同时还注册了GpuService。

7、最后通过SurfaceFlinger::run,进入消息循环,SurfaceFlinger启动成功,开始工作。

void SurfaceFlinger::run() {    do {        waitForEvent();    } while (true);}

更多相关文章

  1. mono android 非UI线程操作UI线程
  2. android百度地图:ItemizedOverlay
  3. 在Tab里面使用Android(安卓)TTS引擎的问题
  4. android:Handler MessageQueue Looper分析
  5. Android(安卓)反射调用类
  6. android 主线程与分线程 做同步
  7. android PopupWindow 底部阴影外部空间取消
  8. Android(安卓)M 去除抽屉模式
  9. Android沉浸式状态栏

随机推荐

  1. Android中的线程总结
  2. Android(安卓)SharedPreference源码浅析
  3. Android(安卓)的 Relative Layout 常量
  4. Android(安卓)在xml中配置 float 和 inte
  5. Android(安卓)SeLinux权限问题和解决方法
  6. ClassNotFoundException: Didn't find cl
  7. android仿支付宝密码输入框效果
  8. Android(安卓)Studio使用过程中遇到的问
  9. Android中互联网的应用
  10. 五、网络多线程