android 内核启动分析,深入理解Android内核——Android启动分析

本文详细解析了Android设备启动过程,从BootLoader到Linux Kernel再到ServiceManager、Zygote和SystemServer的启动,揭示了init.rc脚本在启动流程中的关键作用。重点介绍了ServiceManager作为DNS服务器的功能以及Zygote孕育新进程的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统启动进程

android设备的启动分为三个阶段:Boot Loader, Linux Kernel,Android 系统服务。Android系统实际上是运行在Linux Kernel之上的一系列系统服务进程。init进程是Android中被启动的第一个进程,PID = 0 。它通过解析init.rc脚本来构建出android运行初始化形态(android系统服务程序大多是在这个脚本中被启动)

init.rc初始化脚本

脚本包括actions、commands、services、options四种类型声明。

actions实际上是响应某个触发(也叫事件),当触发(事件)发生时运行action,格式如下:

on ##触发条件

##要执行的命令

##要执行的命令

...

常见触发有下面几种:

boot 。这是init程序启动后触发的第一个事件

device-added-< path>。当设备节点添加或者删除时触发事件

device-removed-< path>。

service-exited-< name>。当指定的name服务存在时触发事件

services是可执行程序,形式如下

service []*

...

pathname表示service程序所在路径,里面有程序源码。因为是可执行程序,所有必须有路径。

commands和options比较多,不一一介绍。

由于还没有编译源码,所有在source中找不到代码路径:\system\core\init\init.c,此处盗用网上一般的init.c分析,下次找到了再自己具体分析。

int main(int argc, char **argv)

{

// 1、设置子进程退出的信号处理函数:sigchld_handler

...

// 2、创建文件夹,并挂载设备

mkdir("/dev", 0755);

mkdir("/proc", 0755);

....

// 3、重定向标准输入输出错误到 /dev/__null__

...

// 4、解析 init.rc 脚本

parse_config_file("/init.rc");

// 5、解析机器相关的配置文件,一般相关的放在init.rc中利用service action调过去

snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);

parse_config_file(tmp);

// 6、建立 uevent,用于与linux kernel交互的socket

...

// 7、初始化及加载属性相关资源

...

// 8、执行 on init 、early-boot 及 boot 片段动作,这些定义于 init.rc 中

/* execute all the boot actions to get us started */

action_for_each_trigger("init", action_add_queue_tail);

drain_action_queue();

/* execute all the boot actions to get us started */

action_for_each_trigger("early-boot", action_add_queue_tail);

action_for_each_trigger("boot", action_add_queue_tail);

9.init进程的处理循环

for(;;) {

// I、执行init.rc 脚本中的动作

drain_action_queue();

// II、执行标志为SVC_RESTARTING的进程,利用fork+execve启动新的进程

restart_processes();

...

}

return 0;

}

系统关键服务的启动简介

在上述init程序启动中,通过解析init.rc,实际上也就陆续启动了其他关键服务,这些服务中最重要的就是ServiceManager,Zygote,SystemServer三个系统服务进程。例如在启动boot触发事件中就有启动Zygote服务。

ServiceManger–DNS服务器

ServiceManager简称SM,是Android Binder机制中的”DNS服务器”,负责域名(某个Binder服务在SM中注册时提供的名字)到IP地址(由底层Binder驱动分配的值)的解析。SM在init.rc中的描述如下所示

service serviceManager /system/bin/servicemanager

class core #同一个class名(此处为core)的所有服务进程同时启动/停止

user system

group system

critical

onrestart restart zygote

onrestart restart media

onrestart restart surfaceflinger

onrestart restart drm

/system/bin/servicemanager路径表示该服务真正的执行程序在该路径下。当SM每次重启时,其他关键进程如zygote , media, surfaceflinger, drm也会重启。

Zygote–受精卵孕育新线程/进程

Android中大多数应用进程和系统进程都是通过Zygote来生成的。Zygote在init.rc中的描述如下所示

service zygote /system/bin/app_process /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

onreatart restart netd

在app_process程序中,最核心的代码是下面这句

...

runtime.start("com.android.internal.os.zygoteInit",startSystemServer?"start-system -server":"");

...

runtime 运行时环境变量启动了虚拟机,让ZygoteInit在虚拟机上运行。Zygote.java文件提供几个static方法在ZygoteInit.java等类中被使用。例如ZygoteInit中的startSystemServer方法调用了 Zygote.forkSystemServer()方法。(实际上startSystemServer方法也是ZygoteInit主要作用之一)。

ZygoteInit的作用:

启动SystemServer。该服务也是由Zygote fork而来。

利用preload,预装载各种系统类,如下所示

static void preload() {

Log.d(TAG, "begin preload");

preloadClasses();

preloadResources();

preloadOpenGL();

preloadSharedLibraries();

preloadTextResources();

// Ask the WebViewFactory to do any initialization that must run in the zygote process,

// for memory sharing purposes.

WebViewFactory.prepareWebViewInZygote();

Log.d(TAG, "end preload");

}

SystemServer–Android的系统服务

SystemServer是Android进入Launcher之前的最后准备,它提供了众多的java语言系统服务。由ZygoteInit中的startSystemServer经过层层调用(包括native code),最后到达SystemServer中的run()方法。在run()方法中:

...

// Create the system service manager.

mSystemServiceManager = new SystemServiceManager(mSystemContext);

//应该是添加的第一个LocalService,SSM本身也是服务

LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

try{

startBootstrapServices();

startCoreServices();

startOtherServices();

}

在startBootstarpServices()中启动并注册了下面几种服务:

ActivityManagerService

PowerManagerService

DisplayManagerService

LightsService

PackageManagerService

UserManagerService

SensorService(native)

在startCoreServices()中启动并注册了下面几种服务:

BatteryService

UsageStatsService

WebViewUpdateService

在startOtherServices()中启动并注册了下面几种服务:

WindowManagerService

NetworkStatsService

InputManagerService

AudioService

CameraService

… 至此,android启动差不多完成了,原来开机时系统竟然做了这么多事情,66666。下章分析ActivityManagerService,AMS是导致Launcher被启动的关键所在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值