4. init 初始化系统服务
(1) init 初始化系统服务
Linux 中 init 进程简介 :
-- 系统父进程 : init 进程是 Linux 系统所有进程的 父进程, id 为 1;
-- init 进程作用 : 初始化 和 启动 系统, 创建其它进程 如 shell login 等进程;
Android 中 init 进程简介 :
-- 系统父进程 : init 在 Android 中也是第一个进程, id 为 1;
-- 创建其它进程 : 创建 zygote 进程, 该进程可以提供 属性服务 用于管理系统属性;
(2) init 完成操作
init 操作 : 系统初始化操作, 解析 init.rc 配置文件等操作;
-- 初始化 : 初始化 log 系统;
-- 解析配置 : 解析 init.rc 配置文件 和 /init.硬件平台名称.rc 配置文件, 执行 early-init, 解析 init 动作, eartly-boot 动作, boot 动作, Execute property 动作;
-- 初始化2 : 设备初始化, 属性服务初始化, 开启属性服务;
-- 无限循环 : 进入无限循环状态, 等待属性设置 或 子进程退出事件;
(3) init.rc 配置文件解析
init.rc 组成 : 该配置文件由 命令类, 动作类, 服务类, 选项类 声明组成;
-- 对应语法 : 命令, 动作, 触发条件, 服务, 选项 和 属性;
命令示例 : init.rc 中的命令在 init 程序中解析, 之后调用相关函数实现;
# Create cgroup mount point for memory mount tmpfs none /sys/fs/cgroup mode=0750,uid=0,gid=1000 mkdir /sys/fs/cgroup/memory 0750 root system mount cgroup none /sys/fs/cgroup/memory memory write /sys/fs/cgroup/memory/memory.move_charge_at_immigrate 1 chown root system /sys/fs/cgroup/memory/tasks chmod 0660 /sys/fs/cgroup/memory/tasks mkdir /sys/fs/cgroup/memory/sw 0750 root system write /sys/fs/cgroup/memory/sw/memory.swappiness 100 write /sys/fs/cgroup/memory/sw/memory.move_charge_at_immigrate 1 chown root system /sys/fs/cgroup/memory/sw/tasks chmod 0660 /sys/fs/cgroup/memory/sw/tasks
动作 触发条件 示例 :
on nonencrypted class_start late_start on charger class_start charger on property:vold.decrypt=trigger_reset_main class_reset main
服务 选项 示例 : 服务表示启动一个可执行程序, 服务一般都附加 选项, 用于配合服务使用
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
-- 示例解析 : 启动 zygote 服务, 通过 /system/bin/app_process 启动, "--start-system-server" 表示启动的同时启动该服务, "socket zygote stream 660 root system" 表示启动后建立 zygote 通信 socket, "onrestart " 表示 zygote 服务重启时需要执行的命令;
属性 示例 : 系统中设置的属性值, 可设置 或者 读写;
# Define TCP buffer sizes for various networks # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208 setprop net.tcp.buffersize.wifi 524288,1048576,2097152,262144,524288,1048576 setprop net.tcp.buffersize.lte 524288,1048576,2097152,262144,524288,1048576 setprop net.tcp.buffersize.umts 4094,87380,110208,4096,16384,110208 setprop net.tcp.buffersize.hspa 4094,87380,262144,4096,16384,262144
-- 示例解析 : "setprop" 用于设置属性;
二. Android 上层系统启动流程
1. Android 上层系统启动简介
启动流程 : init 进程启动 -> 启动 Android 系统本地服务(Native Service) -> Zygote进程 -> Android 系统服务(System Service) -> HomeActivity 启动;
2. 启动 Native Service (本地服务)
Native Service 简介 :
-- 启动进程 : 由 init 启动, 是 C/C++ 实现的;
-- 主要作用 : 本地服务 是 Android 内核 与 Android 应用 通信 的通道, 两层之间通过 socket 进行通信;
Native Service 提供的服务 : 其启动项定义在 init.rc 中;
-- Console : shell console 服务;
-- Service Manager : Binder 服务管理器, 管理所有的 Android 系统服务;
-- Vold : 支持外设热插拔服务;
-- Mountd : 设备安装 状态通知服务;
-- Debuggerd : 处理调试进程请求服务;
-- Rild : 无线接口层服务;
-- Zygote : 启动 Dalvik 并创建其它进程服务;
-- MediaServer : 多媒体相关服务;
3. Zygote 进程启动
Zygote 进程简介 : Zygote 由 init 进程创建, init.rc 中配置了 Zygote 的创建参数;
-- init.rc 中配置 : Zygote 原始名称是 "app_process", 启动中改名为 Zygote;
Zygote 作用 :
-- 本质 : Zygote 进程是一个虚拟的进程, 是虚拟实例(Dalvik虚拟机)的孵化器;
-- 操作 : Zygote 负责 Dalvik 虚拟机初始化, 预置类库加载等操作;
-- 应用启动处理 : 每个 Android 应用启动时, Zygote 会创建一个子进程(Dalvik虚拟机)执行它;
-- 节省内存策略 : Android 中有些系统库是只读的, 所有的 Dalvik 虚拟机都可以共享这些只读系统库;
4. Android System Service 启动
Android 系统服务 :
-- 启动 : Android System Service 是 Zygote 进程的第一个子进程, 由 Zygote 进程孵化而来;
-- 作用 : System Service 是 Android 框架核心, 负责 Android 系统初始化 并 启动其它服务;
-- 其它服务 : System Service 孵化的其它服务运行在对应 Dalvik 虚拟机进程的空间里;
-- init.rc 配置 : 在 Zygote 配置中 "--start-system-server" 参数用来实现 System Service 的启动;
5. 启动 HomeActivity 主界面
Launcher 应用程序 : 该应用程序就是 HomeActivity 所在的程序;
-- 启动 : Launcher 由 Activity Manager Service 启动, 启动流程 System Service -> Activity Manager Service -> Launcher;
-- 展示图标 : Launcher 启动后就会将已经安装的 app 程序的快捷图标展示到桌面;