系統服務架構
Android系統服務架構遵循 本地客戶端/服務端 通信模式, Binder機制在IOS的 "Mach Message"信息傳遞機制。servicemanager在IOS中類比launchd進程(同時扮演Linux中PID爲1的init進程)
Tips
- Binder IPC不能超過4M
- Binder不能映射具有寫權限的內存區域
Binder機制
- Binder是Android的一種IPC機制
- 提供了RPC(遠程過程調用)功能
RPC屬於IPC,RPC爲跨進程調用方法,隱藏實現細節。而IPC還包含 共享內存、互斥鎖等形式。
Binder模塊
- Client
- IPC的發起方
- Service
- IPC的相應方(服務器)
- ServiceManager
- 特殊的Service(給Client提供查詢Service的功能)
- 句柄爲0
- 提供輔助管理
- Service的一種
- Binder驅動程序 (內核空間)
- 核心組件
- 這4個組成模塊分別運行在不同的進程,他們的調用也是IPC,也是通過Binder機制來完成
Client & Service
顧名思義,就是我們的Client、Service的進程。
ServiceManager服務
- 由init進程掃描init.rc啓動的二進制可執行文件
service servicemanager /system/bin/servicemanager
class core
user system
group system
critical
onrestart restart healthd
onrestart restart zygote
onrestart restart media
onrestart restart surfaceflinger
onrestart restart drm
- Binder進行IPC時的ContextManager: 通過service的名稱,返回binder的句柄,使Client進行IPC
- 其自身句柄爲0
- 在Shell,Native和Java層都有獲取ServiceManager的方法
//Shell: service service_name method_name method_param
adb shell service call phone ***
//Native
sp<IServiceManager> defaultServiceManager()
//Java
android.os.ServiceManagerNative
android.os.ServiceManager
Context.getSystemService
- 代碼 frameworks/base/cmds/servicemanager 目錄下的binder.h, binder.c, service_manager.c
- service_manager main方法入口
- 調用binder_open,打開binder設備文件,獲取/dev/binder描述符
- 調用binder_become_context_manager 通知binder驅動程序,自己是binder的上下文管理者(守護進程),服務索引值爲0
- 調動binder_loopde無窮循環
- 進入阻塞狀態,直到/dev/binder 中產生transaction(也就是Client端請求:addService、checkService和listServices),調用svcmgr_handler回調函數處理
system_server進程
- 由Java編寫,必要時JNI,運行在虛擬機中
- 由init.rc forck出的Zygote進程,由–start-system-server調用方法,forck出的system_server進程
// /init.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
- 容器進程,期內包含絕大多數系統服務 AMS、PMS
- 系統服務以線程的形式存在
- 創建完service的線程,主線程進入無限循環
- 不斷輪詢(特殊是binder句柄),以獲取、分發信息 到指定小區。
Binder驅動
- 源代碼 kernel/common/drivers/staging/android
- /dev/binder (mis device、雜項文件、設備文件),文件由驅動程序模塊初始化時創建
- binder驅動註冊的操作命令(調用這些IO API,會調用驅動註冊的方法)
- 進程虛擬地址空間、內存虛擬地址空間 進行映射,這樣 進程和內核之間可以減少一次 內存拷貝(提高效率)