Android系统浅析-init进程

1,075 阅读2分钟

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框架解密