Android(安卓)SurfaceFlinger服务启动过程源码分析1
16lz
2021-01-26
Android SurfaceFlinger服务启动过程源码分析1
Android系统的SurfaceFlinger服务有两种启动方式:1)在SystemServer进程中以服务线程的方式提供服务;2)启动SurfaceFlinger独立的进程通过服务。第一种方式是在SystemServer进程启动过程中启动SurfaceFlinger服务的,而第二中方式是在Android启动脚本init.rc中配置SurfaceFlinger服务,通过init进程来启动的。下面就分别介绍SurfaceFlinger的两种启动方式。 1 服务线程启动方式 在Android 开关机动画显示源码分析中已经简要介绍过SurfaceFlinger服务的这种启动方式,在SystemServer进程的init1阶段,通过JNI调用system_init()函数来启动SurfaceFlinger: frameworks\base\cmds\system_server\library\system_init.cpp java代码
- extern "C" status_t system_init()
- {
- ALOGI("Entered system_init()");
- sp proc(ProcessState::self());
- sp sm = defaultServiceManager();
- ALOGI("ServiceManager: %p\n", sm.get());
- sp grim = new GrimReaper();
- sm->asBinder()->linkToDeath(grim, grim.get(), 0);
- char propBuf[PROPERTY_VALUE_MAX];
- property_get("system_init.startsurfaceflinger", propBuf, "1");
- if (strcmp(propBuf, "1") == 0) {
- // Start the SurfaceFlinger
- SurfaceFlinger::instantiate();
- }
- ....
- }
- static void instantiate() { publish(); }
- static status_t publish(bool allowIsolated = false) {
- sp sm(defaultServiceManager());
- return sm->addService(String16(SERVICE::getServiceName()), new
- SERVICE(), allowIsolated);
- }
- int main(int argc, char** argv) {
- SurfaceFlinger::publishAndJoinThreadPool(true);
- // When SF is launched in its own process, limit the number of
- // binder threads to 4.
- ProcessState::self()->setThreadPoolMaxThreadCount(4);
- return 0;
- }
- static void publishAndJoinThreadPool(bool allowIsolated =
- false) {
- sp sm(defaultServiceManager());
- sm->addService(String16(SERVICE::getServiceName()), new SERVICE(),
- allowIsolated);
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- }
- SurfaceFlinger::SurfaceFlinger()
- : BnSurfaceComposer(), Thread(false),
- mTransactionFlags(0),
- mTransationPending(false),
- mLayersRemoved(false),
- mBootTime(systemTime()),
- mVisibleRegionsDirty(false),
- mHwWorkListDirty(false),
- mElectronBeamAnimationMode(0),
- mDebugRegion(0),
- mDebugDDMS(0),
- mDebugDisableHWC(0),
- mDebugDisableTransformHint(0),
- mDebugInSwapBuffers(0),
- mLastSwapBufferTime(0),
- mDebugInTransaction(0),
- mLastTransactionTime(0),
- mBootFinished(false),
- mSecureFrameBuffer(0)
- {
- init();
- }
- void SurfaceFlinger::init()
- {
- ALOGI("SurfaceFlinger is starting");
- char value[PROPERTY_VALUE_MAX];
- property_get("debug.sf.showupdates", value, "0");
- mDebugRegion = atoi(value);
- property_get("ro.bootmode", value, "mode");
- if (!(strcmp(value, "engtest")
- && strcmp(value, "special")
- && strcmp(value, "wdgreboot")
- && strcmp(value, "unknowreboot")
- && strcmp(value, "panic"))) {
- SurfaceFlinger::sBootanimEnable = false;
- }
- }
- void SurfaceFlinger::onFirstRef()
- {
- mEventQueue.init(this);
- run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);
- // Wait for the main thread to be done with its initialization
- mReadyToRunBarrier.wait();
- }
- void MessageQueue::init(const sp&
- flinger)
- {
- mFlinger = flinger;
- mLooper = new Looper(true);
- mHandler = new Handler(*this);
- }
- inline Barrier() : state(CLOSED) { }
- void wait() const {
- Mutex::Autolock _l(lock);
- while (state == CLOSED) {
- cv.wait(lock);
- }
- }
- status_t SurfaceFlinger::readyToRun()
- {
- ALOGI( "SurfaceFlinger's main thread ready to run. ""Initializing graphics
- H/W...");
- // we only support one display currently
- int dpy = 0;
- {
- //初始化主显示屏,即从SurfaceFlinger中取出第0号GraphicPlane
- GraphicPlane& plane(graphicPlane(dpy));
- //创建DisplayHardware,并和显示屏绑定
- DisplayHardware* const hw = new DisplayHardware(this, dpy);
- plane.setDisplayHardware(hw);
- }
- //创建一块大小为4k的匿名共享内存,用于共享显示屏幕信息
- mServerHeap = new MemoryHeapBase(4096,MemoryHeapBase::READ_ONLY,
- "SurfaceFlinger read-only heap");
- ALOGE_IF(mServerHeap==0, "can't create shared memory dealer");
- //将该匿名共享内存的首地址转换为surface_flinger_cblk_t类型的指针,表明该共享内存存储surface_flinger_cblk_t结构体数据
- mServerCblk =
- static_cast(mServerHeap->getBase());
- ALOGE_IF(mServerCblk==0, "can't get to shared control block's
- address");
- new(mServerCblk) surface_flinger_cblk_t;
- //从显示屏的DisplayHardware中得到屏幕的宽高,并设置为当前主显示屏
- const GraphicPlane& plane(graphicPlane(dpy));
- const DisplayHardware& hw = plane.displayHardware();
- const uint32_t w = hw.getWidth();
- const uint32_t h = hw.getHeight();
- const uint32_t f = hw.getFormat();
- hw.makeCurrent();
- //将屏幕信息保存到匿名共享内存中,从而共享给所有进程
- mServerCblk->connected |= 1<
- display_cblk_t* dcblk = mServerCblk->displays + dpy;
- memset(dcblk, 0, sizeof(display_cblk_t));
- dcblk->w = plane.getWidth();
- dcblk->h = plane.getHeight();
- dcblk->format = f;
- dcblk->orientation = ISurfaceComposer::eOrientationDefault;
- dcblk->xdpi = hw.getDpiX();
- dcblk->ydpi = hw.getDpiY();
- dcblk->fps = hw.getRefreshRate();
- dcblk->density = hw.getDensity();
- //初始化OpenGL|ES
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- glPixelStorei(GL_PACK_ALIGNMENT, 4);
- glEnableClientState(GL_VERTEX_ARRAY);
- glShadeModel(GL_FLAT);
- glDisable(GL_DITHER);
- glDisable(GL_CULL_FACE);
- const uint16_t g0 = pack565(0x0F,0x1F,0x0F);
- const uint16_t g1 = pack565(0x17,0x2f,0x17);
- const uint16_t wormholeTexData[4] = { g0, g1, g1, g0 };
- glGenTextures(1, &mWormholeTexName);
- glBindTexture(GL_TEXTURE_2D, mWormholeTexName);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0,GL_RGB,
- GL_UNSIGNED_SHORT_5_6_5, wormholeTexData);
- const uint16_t protTexData[] = { pack565(0x03, 0x03, 0x03) };
- glGenTextures(1, &mProtectedTexName);
- glBindTexture(GL_TEXTURE_2D, mProtectedTexName);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0,GL_RGB,
- GL_UNSIGNED_SHORT_5_6_5, protTexData);
- glViewport(0, 0, w, h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- // put the origin in the left-bottom corner
- glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h
- // 启动EventThread线程
- mEventThread = new EventThread(this);
- mEventQueue.setEventThread(mEventThread);
- hw.startSleepManagement();
- //主线程已经完成初始化工作,唤醒睡眠等待中的SurfaceFlinger线程接收客户端的请求
- mReadyToRunBarrier.open();
- //启动开机动画
- startBootAnim();
- return NO_ERROR;
- }
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- android通过线程实现逐行显示信息
- Android(安卓)Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解
- Android(安卓)Binder机制(2) ContextManager注册过程分析
- Android实例练习-可爱的小闹钟
- 【边做项目边学Android】手机安全卫士04_01:界面(Activity)之间的切
- Ubuntu下Genymotion模拟器启动卡死
- Android开发常用命令整理
- Android(安卓)GLSurfaceView详解