Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android GUI系統之SurfaceFlinger(10)

Android GUI系統之SurfaceFlinger(10)

編輯:Android開發教程

SurfaceFlinger的啟動與工作原理

1.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);

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved