Android Framework 之Init 源码

最近萌生了看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的 执行完毕 成功开启了

上图参考

android 开机启动桌面Activity(Launcher )的过程(一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值