1 SystemServer服务分析
SystemServer是zygote启动的第一个Android服务进程,主要工作如下:
(1)创建系统所有核心服务
(2)将服务添加到ServiceManager中
(3)将服务初始化
1.1 SystemServer启动的服务
(1)power
PowerManagerService:电源管理
BatteryService:电池服务
(2)ActivityManagerService
Activity管理服务
(3)PackageManagerService
程序包管理服务,与底层installd建立通信
(4)WindowManagerService
窗口管理服务,与surfaceflinger服务交互
(5)TelephonyRegistry
电话服务
(6)ContentService
进程间数据交换
(7)Sensor
LightsService:光感
VibratorService:振动
(8)Network
NetworkManagementService:手机网络管理服务
NetworkStatsService:手机网络状态服务
WifiP2pService:p2p服务
WifiService:wifi服务
ConnectivityService:网络连接状态服务
(9)BluetoothService
蓝牙服务
1.2 SystemServer启动流程
(1)SystemServer.main()
(2)dalvik.set()
(3)System.loadlibrary("android_servers");
(4)nativeInit()
(5)initAndLoop()
启动系统各个服务,将服务添加到ServiceManager中。
2 ServiceManager服务分析
2.1 ServiceManager服务概述
(1)服务进程,是android系统的核心服务之一
(2)系统服务管理:管理系统和应用向系统添加的服务
(3)查询获取服务:响应client请求并返回相应的服务
Android应用如果想要获取某个系统服务,这个系统服务需要提前添加到ServiceManager中。如果该服务连续几次异常退出,系统会重启。如果该服务重启,系统会重启zygote,surfaceflinger,media等服务。
2.2 ServiceManager是何时创建的?
ServiceManager是由init进程通过解析init.rc文件而创建的,其所对应的可执行程序/system/bin/servicemanager,所对应的源文件是service_manager.c。
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
2.3 ServiceManager启动过程
(1)打开binder
ServiceManager基于Binder机制实现
binder_open()
open("/dev/binder")
mmap()
(2)binder_become_context_manager()
(3)循环接收binder消息
接收的binder消息类型:添加服务,查询服务和获取服务
通过binder_loop()来接收其他进程发送过来的binder消息
(4)处理binder消息
通过svcmgr_handler()处理其他进程发送过来的binder消息
2.4 ServiceManager管理服务
图1 ServiceManager管理服务
(1)系统或Android应用进程发送添加系统服务的请求,通过binder进程间通信到ServiceManager进程处理,然后检查发起请求的进程的权限,再检查该服务是否已经存在,如果存在直接返回;如果不存在,将该服务添加到Service List里。
(2)获取该服务时也是通过binder进程间通信到ServiceManager进程处理,查询Service List找出该Service,然后返回。