97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠見教育科技集團 >> 新聞動態(tài) >> Android資料 >> Android服務管理器守護進程  
 
Android服務管理器守護進程
分享到:

Android的守護進程包括控制臺(Console)、Adbd(Android Debug Bridge Daemon)、服務管理器(Service Manager)、掛載守護進程(Mount Daemon)、調試守護進程(Debugger Daemon)、無線接口層守護進程(Ril Daemon)、媒體服務器(Media Server)、播放開機音樂(Bootsound)、Dubs、Hci daemon、Spdtool Hfag(Spdtool為一內存超頻工具)、Spdtool Sfag、安裝守護進程(Install daemon)、flash-recovery等。守護進程的啟動是通過system\core\rootdir\init.rc腳本來啟動的。

下面主要介紹下服務管理器守護進程。服務管理器管理著Android應用所需的多媒體服務等核心服務,是Android的靈魂組件,圖1-1顯示了C++和Java層面的服務管理器類圖。

圖1-1 服務管理器

在服務管理器中,對各種服務的管理是通過IPC通信進行的,其映射內存大小為128×1024。服務管理器通過binder_become_context_manager()方法將自己變?yōu)橐粋上下文管理器,來中轉各進程之間傳遞的消息。

代碼1-1 服務管理器的main函數

int main(int argc, char **argv)
    {
      struct binder_state *bs;
      void *svcmgr=BINDER_SERVICE_MANAGER;
      bs=binder_open(128*1024);
      if (binder_become_context_manager(bs)) {   //設為上下文管理器
        LOGE("cannot become context manager (%s)\n", strerror(errno));
        return -1;
      }
      svcmgr_handle=svcmgr;
      binder_loop(bs, svcmgr_handler);   //進入事件循環(huán),監(jiān)聽消息
      return 0;
    }

IPC通信的底層實現接口位于aurora\msm\msm\drivers\staging\android\ binder.c文件中,關于IPC通信的更多信息,請參考2.4.2節(jié)IBinder通信機制。

為了使用基于IPC通信的服務,首先需要將服務注冊到服務管理器中。下面是電池狀態(tài)服務(BatteryStatsService)的注冊過程:

public void publish(Context context) {
      mContext=context;
      ServiceManager.addService("batteryinfo", asBinder());   //注冊服務
    }

為了獲取電池狀態(tài)信息,需要首先獲得電池狀態(tài)服務句柄,過程如下:

public static IBatteryStats getService() {
      if (sService!=null) {
        return sService;
      }
      IBinder b=ServiceManager.getService("batteryinfo");   //獲取服務
      sService=asInterface(b);   //獲取句柄
      return sService;
    }

服務管理器在整個系統(tǒng)中是唯一的,對Java代碼而言,服務管理器即ServiceManager:: sServiceManager,對底層的原生C++代碼而言,服務管理器即gDefaultServiceManager。下面是gDefaultServiceManager的實現:

sp<IServiceManager> defaultServiceManager()
    {
      if (gDefaultServiceManager!=NULL) return gDefaultServiceManager;
      {
        AutoMutex _l(gDefaultServiceManagerLock);
        if (gDefaultServiceManager==NULL) {
          gDefaultServiceManager=interface_cast(
          ProcessState::self()->getContextObject(NULL));
        }
      }
      return gDefaultServiceManager;
    }

首先通過 ProcessState::self()->getContextObject(NULL)創(chuàng)建一個Binder對象,然后通過 interface_cast和IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.Iservice Manager")把Binder對象包裝成 IServiceManager對象。原理上等同于創(chuàng)建了一個BpServiceManager對象。

需要說明的是,在IServiceManager對象中,包含了BpServiceManager和BnServiceManager兩個內部類,其中BpServiceManager是遠程服務管理器對象在本地進程的代理,而BnServiceManager則是一個本地服務管理器對象。

在Froyo中,服務管理器管理的與多媒體相關的服務包括media.audio_flinger、media.player、media.camera、media.audio_policy等。

除注冊和獲取服務句柄外,服務管理器還提供了檢查服務是否存在、列出當前正在運行的服務等支持。關于服務管理器的實現,主要文件為service_manager.c、IServiceManager.cpp、IServiceManager.java、ServiceManager.java、ServiceManagerNative.java等。

 更多相關文章

·Android init.rc腳本語
·Android開機啟動過程
·Android進程的生命周期
·Android常用組件生命周期
·Android Resources資源