【Android系列1.0 Binder 機制】

系統服務架構

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模塊

  1. Client
    • IPC的發起方
  2. Service
    • IPC的相應方(服務器)
  3. ServiceManager
    • 特殊的Service(給Client提供查詢Service的功能)
    • 句柄爲0
    • 提供輔助管理
    • Service的一種
  4. 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,會調用驅動註冊的方法)
  • 進程虛擬地址空間、內存虛擬地址空間 進行映射,這樣 進程和內核之間可以減少一次 內存拷貝(提高效率)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章