Android系统启动流程(一)解析init进程启动过程,android开发者模式

本文详细介绍了Android系统启动流程,从电源按下到Linux内核启动,再到关键的init进程。init进程是Android用户空间的第一个进程,负责创建zygote和属性服务。主要分析了init的main方法,包括初始化属性服务、解析init.rc配置文件,并讲解了service的解析过程。最后,阐述了如何启动zygote服务,以及属性服务在系统启动中的重要角色。
摘要由CSDN通过智能技术生成

init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。本文将基于Android7.0源码来分析Init进程。

2、引入init进程

==============

说到init进程,首先要提到Android系统启动流程的前几步:

2.1、启动电源以及系统启动


当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。

2.2、引导程序Bootloader


引导程序是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。

2.3、linux内核启动


内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。

2.4、init进程启动


讲到第四步就发现我们这一节要讲的init进程了。关于Android系统启动流程的所有步骤会在本系列的最后一篇做讲解。

3、init入口函数

==============

init的入口函数为main,代码如下所示。

system/core/init/init.cpp

int main(int argc, char** argv) {

if (!strcmp(basename(argv[0]), “ueventd”)) {

return ueventd_main(argc, argv);

}

if (!strcmp(basename(argv[0]), “watchdogd”)) {

return watchdogd_main(argc, argv);

}

umask(0);

add_environment(“PATH”, _PATH_DEFPATH);

bool is_first_stage = (argc == 1) || (strcmp(argv[1], “–second-stage”) != 0);

//创建文件并挂载

if (is_first_stage) {

mount(“tmpfs”, “/dev”, “tmpfs”, MS_NOSUID, “mode=0755”);

mkdir("/dev/pts", 0755);

mkdir("/dev/socket", 0755);

mount(“devpts”, “/dev/pts”, “devpts”, 0, NULL);

#define MAKE_STR(x) __STRING(x)

mount(“proc”, “/proc”, “proc”, 0, “hidepid=2,gid=” MAKE_STR(AID_READPROC));

mount(“sysfs”, “/sys”, “sysfs”, 0, NULL);

}

open_devnull_stdio();

klog_init();

klog_set_level(KLOG_NOTICE_LEVEL);

NOTICE(“init %s started!\n”, is_first_stage ? “first stage” : “second stage”);

if (!is_first_stage) {

// Indicate that booting is in progress to background fw loaders, etc.

close(open("/dev/.booting", O_WRONLY | O_CREAT | O_CLOEXEC, 0000));

//初始化属性相关资源

property_init();//1

process_kernel_dt();

process_kernel_cmdline();

export_kernel_boot_props();

}

//启动属性服务

start_property_service();//2

const BuiltinFunctionMap function_map;

Action::set_function_map(&function_map);

Parser& parser = Parser:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值