Android源码-Android系统启动源码分析

Android系统启动源码分析

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

解读Android的源码可以让我们更好的学习系统的优秀源码,以及google工程师对于一个程序的是如何实现的,从源码的分析也可以强化我们的编程思想.

引导

Android系统启动流程源码分析,基于Android5.1(个人比较喜欢这个版本的源码,因为改动比较大)

Android系统是基于linux内核的,所以在Android启动的时候会先去加载linux内核,内核启动的时候会去加载各种驱动以及数据结构等,然而,Android的第一个进程是初始化进程(init).

进程是由C代码实现的,即init.c;所以我们先从init.c开始阅读.由于init.c文件在Android源码中是有很多个的,我们需要阅读的是内核core的init文件,注意包名不要错误.

1.init.c的main函数:

这里写图片描述
在C语言中,main方法是函数的入口,我们先从main函数开始;由于是分析代码,所以我会把不需要的部分的代码删除,仅留下部分作为例子

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

    //step1 创建必要的文件夹 , 权限分配 7代表可读可写可执行  5代表可读可执行不可写  挂载磁盘
    mkdir("/dev", 0755);
    mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");

        //step2 初始化代码 包括日志初始化 配置文件初始化 以及硬件层初始化
    klog_init();
    property_init();


        //setp3 需要注意的一个初始化是init.rc配置文件的初始化   此处插入init.rc解读 详细请跳转  2.init.rc解读
    init_parse_config_file("/init.rc");

        //setp4 后续是很多的队列等待,等待初始化的完成,以及一些初始化失败的操作代码
    action_for_each_trigger("early-init", action_add_queue_tail);
    queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");


    return 0;
}
2.init.rc解读 init.rc是linux系统下的一个启动配置文件,在android中的主要工作如下

这里写图片描述
setp1 文件系统的初始化和写入,变更权限等

    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 system system /sys/kernel/ipv4/tcp_rmem_max

setp2 服务的启动,如下实例是一个大家比较熟悉的服务,网络模块服务启动,此项初始化了socket的网络通信

 Daemon processes to be run by init.
    service netd /system/bin/netd
    class main
    socket netd stream 0660 root system
    socket dnsproxyd stream 0660 root inet
    socket mdns stream 0660 root system
    socket fwmarkd stream 0660 root inet

setp3 重点服务讲解,孵化器服务

 service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote  //重点注意代码
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm

服务器服务zygote,进程的出现都是有孵化器完成的,也就是说孵化器进程是母进程

但是比较奇怪的是并没有在这个文件中出现直接启动的服务器进程的服务呢?这个就比较麻烦啦 哈哈

好好想一下,文件中既然有提到,onrestart restart zygote,从java的思想出发的话,这个文件里面一定是导入了服务器进程的包的,那么我们看一下文件的关联文件有哪些吧

 import /init.environ.rc
 import /init.usb.rc
 import /init.${ro.hardware}.rc
 import /init.${ro.zygote}.rc
 import /init.trace.rc

在文件的顶头会发现有一个import /init.${ro.zygote}.rc的文件关联,那么去找一下这个文件吧,搜索这个文件会发现有好几个,因为操作系统的位数分为了四个,但是其中内容都是一样的,细微差距就是app_process的路径文件夹名字会不一样,不过都指向同一个路径
这里写图片描述
如下:

    //service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    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

**setp4 在这个服务中,可以看到路径是在app_process,看一下这个路径中的文件,只有一个文件**App_main.cpp,这个C++文件就是孵化器进程了
这次是一个C++文件,C++和C语言一样,入口函数都是main函数

3.孵化器App_main.cpp解读:

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值