【Android 系统开发】 Android 系统启动流程简介(二)

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;



service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

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 程序的快捷图标展示到桌面;


上一篇:【面向对象设计模式】 接口型模式 (一)


下一篇:【Android 系统开发】 Android 系统启动流程简介(一)