最近萌生了看Android 源码的冲动。于是开干首先上个图 借鉴其他大佬的图 ,我会从Init开始看一直到 Launcher 启动
android 系统启动 我们这里从 init进程这个文件开始 来一步一步的跟一下 。中间关于源码部分省略了很多就挑了一些大致能看懂的部分 跟一下。主要就是学习一下 整个流程 至于 很多细节部分 想看的可以自行找源码学习。。
相关 文件 http://androidxref.com/6.0.0_r1/xref/system/core/init/init.cpp 然后找到它的main 方法
int main(int argc, char** argv) {
...
//初始化signal handler
signal_handler_init();
//解析脚本文件
init_parse_config_file("/init.rc");
...
//搞了一个死循环
while (true) {
if (!waiting_for_exec) {
//执行命令
execute_one_command();
restart_processes();
}
...
}
return 0;
}
然后我们看下 init.rc 文件 http://androidxref.com/6.0.0_r1/xref/system/core/rootdir/init.rc这是个脚本文件里面配置了一些东西
//开始倒入一些其他的脚本文件
import /init.environ.rc
import /init.usb.rc
...
//其中找到了一些重要的服务 zygote , servivemanager mediaserver installd
//这里配置了一些执行参数和路径用于启动服务
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
service servicemanager /system/bin/servicemanager
service surfaceflinger /system/bin/surfaceflinger
service media /system/bin/mediaserver
service installd /system/bin/installd
然后是看看 如何执行命令启动服务 我们直接看 execute_one_command 这个方法里面做了什么
void execute_one_command() {
Timer t;
char cmd_str[256] = "";
char name_str[256] = "";
if (!cur_action || !cur_command || is_last_command(cur_action, cur_command)) {
cur_action = action_remove_queue_head();
cur_command = NULL;
if (!cur_action) {
return;
}
build_triggers_string(name_str, sizeof(name_str), cur_action);
INFO("processing action %p (%s)\n", cur_action, name_str);
cur_command = get_first_command(cur_action);
} else {
cur_command = get_next_command(cur_action, cur_command);
}
if (!cur_command) {
return;
}
// func 是一个 函数指针 相当于回调函数
int result = cur_command->func(cur_command->nargs, cur_command->args);
...
}
//执行到这个方法
int do_class_start(int nargs, char **args)
{
/* Starting a class does not start services
* which are explicitly disabled. They must
* be started individually.
*/
service_for_each_class(args[1], service_start_if_not_disabled);
return 0;
}
//方法参数是一个回调函数 该函数参数为service 结构体指针。
void service_for_each_class(const char *classname,void (*func)(struct service *svc))
{
struct listnode *node;
struct service *svc;
list_for_each(node, &service_list) {
svc = node_to_item(node, struct service, slist);
if (!strcmp(svc->classname, classname)) {
func(svc);//调用回调函数 也就是传入的 //service_start_if_not_disabled 方法
}
}
}
static void service_start_if_not_disabled(struct service *svc)
{
if (!(svc->flags & SVC_DISABLED)) {
service_start(svc, NULL);//执行service start
} else {
svc->flags |= SVC_DISABLED_START;
}
}
void service_start(struct service *svc, const char *dynamic_args)
{
... 省略n 行代码
// fork 创建了一个子进程
pid_t pid = fork();
if (pid == 0) {
//linux 执行命令开启服务
execve(svc->args[0], (char**) arg_ptrs, (char**) ENV);
}
}
到这里 一些系统服务如 zygote , servivemanager , mediaserver ,installd 等 就随着init的 执行完毕 成功开启了
上图参考