Android基本框架學習之defaultServiceManager
這兩天看了一下dumpsys和dumpstate,對Android系統中各種系統Service的實現框架不是很明白,以下簡單的描述了一下這兩天關於Android的系統Service的一些實現和具體代碼位置。
具體組件的合作情況如下:
Binder的一系列接口和後臺驅動是信息交換的基礎
service_manager是提供一箇中轉層/管理層給各個java端的service交換信息的通道,它起到承上(java層/dalvik)啓下(binder驅動/硬件信息)的作用。
而Java層主要通過ServiceManager.java管理,並通過ServiceManagerNative.java提供的接口與binder下的IServiceManager.cpp交互,IServiceManager.cpp又通過Binder機制與service_manager交互達到從Java/dalvik到Linux進程中的各種Service管理(註冊/註銷/查詢)!
例子:
所有用dumpsys能夠看到的Service都是通過ServiceManger提供的add函數把各自提供的service提供統一的接口給ServiceManger管理,並通過Binder與相應的Component相交互.
有一些與硬件狀態相關的service如,wifi,phone,就對應有一個如WifiService,在mydroid/frameworks/base/core/services/java/com/android/server/ConnectivityService.java中被註冊到ServiceManger中.
相關代碼位置:
mydroid/framework/base/libs/binder/xxxx,其中IServiceManager.cpp中是接收從Java的ServerManager發來的各種請求(addserver, checkserver,...),與Binder Driver通訊的模塊.
mydroid/frameworks/base/core/java/android/os/ServiceManager.java和ServiceManagerNative.java
mydroid/frameworks/base/core/services/java/com/android/server/SystemServer.java(大部分的系統service都在這裏被註冊)
而mydroid/frameworks/base/cmds/servicemanager/service_mangaer.c是一個被init.rc中使用到的命令,用來在開機時啓動service_manager這個類似daemon的東西。
參考資料:
有關Service Manager的一篇文章,針對Binder驅動和Service_manager的闡述,但是沒有提到Java層的各種Service是如何通過Binder和Service_manager提供接口給用戶層和Java層的Sysem使用。