一、关于Android系统重要的进程
(1)、init进程:init进程是Linux内核启动完成之后,启动的第一个用户进程,Android系统就是在这个进程的基础上启动起来的,进程pid为1。init进程通过解析init.rc来陆续启动其他关键的系统服务进程---其中最重要的是:ServiceManager,Zygote和SystemServer。
(2)、ServiceManager:主要负责添加服务,获取服务,查找服务以及当某个服务意外终止时,对该服务的资源进行回收。
(3)、Zygote进程:Zygote是一个孵化器进程,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程fork出来的。在Zygote中进行添加虚拟机参数,并将其启动起来,然后注册JNI函数。在Zygote中进行预加载以及初始化核心类库。最后将SystemServer启动起来。
(4)、SystemServer:启动系统各项服务。
二、init.rc脚本语法规则
service <name> <pathname> [ <argument> ]* //service的名字,启动路径,以及参数
<option>
<option>
...
<name>:
表示此service的名称
<pathname>:
此service所在的路径。因为是可执行文件,所以一定有存储路径。
<argument>:
启动service所带的参数。
<option>:
对此service的约束选项。
三、ServiceManager,Zygote,SystemServer的启动简析
3.1 ServiceManager
ServiceManager是Binder机制中的“DNS服务器”,负责域名(某Binder服务在ServiceManager注册时提供的名称)IP地址(由底层Binder驱动分配的值)的解析。
ServiceManager是在servicemanager.rc(Android8.0)里面描述,并由init进程启动。
/*android-8.0.0_r1\frameworks\native\cmds\servicemanager\servicemanager.rc*/
service servicemanager /system/bin/servicemanager
class core animation
user system
group system readproc
critical
onrestart restart healthd
onrestart restart zygote
onrestart restart audioserver
onrestart restart media
onrestart restart surfaceflinger
onrestart restart inputflinger
onrestart restart drm
onrestart restart cameraserver
writepid /dev/cpuset/system-background/tasks
可以看到,Servicemanager是一个Linux程序。它在设备中的存储路径是:/system/bin/servicemanager
,源码路径则是:android-8.0.