init进程
严格来说,Android系统实际是运行在Linux内核之上的一系列服务程序,所以,Android系统相对于Linux内核而言仅仅是一系列Linux应用程序而已。
Android设备的启动经历3个阶段:Bootloader,Linux Kernel和Android系统服务。
init进程是Android用户空间第一个被启动的进程,可以理解为一个普通的Linux进程,但是它的作用却不可小视,它通过解析init.rc脚本来构建Android系统的初始运行形态,大部分Android系统服务进程都是在这个rc脚本中描述而被启动。
init.rc启动脚本
init.rc文件大致分为两大部分:
(1)以on关键字开头的动作列表
在on init段落中,主要设置环境变量,生成系统运行所需的文件或者目录,修改相应的权限,并挂载与系统运行相关的目录。
在on boot段落中,主要用于设置应用程序终止条件,应用程序驱动目录及文件权限等。
(2)以service关键字开头的服务列表
service段落主要用来记录init进程启动的系统服务进程。
init进程通过解析rc脚本来陆续启动其他关键的系统服务进程,例如,serviceManager,surfaceflinger,media,zygote,ueventd,console,adbd等等,详细可以参考init.rc文件,下面来简单看看ServiceManager,Zygote。
ServiceManager在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
可以看到,servicemanager是一个Linux程序,在设备的存储路径为/system/bin/servicemanager。
Zygote在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
writepid /dev/cpuset/foreground/tasks
可以看到,zygote是通过app_process程序启动的,app_process也是一个Linux程序,在设备存储路径为/system/bin/app_process。
参考:
深入理解Android内核设计思想
Android内核剖析
Android框架解密