赞
踩
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布
解读Android的源码可以让我们更好的学习系统的优秀源码,以及google工程师对于一个程序的是如何实现的,从源码的分析也可以强化我们的编程思想.
Android系统启动流程源码分析,基于Android5.1(个人比较喜欢这个版本的源码,因为改动比较大)
Android系统是基于linux内核的,所以在Android启动的时候会先去加载linux内核,内核启动的时候会去加载各种驱动以及数据结构等,然而,Android的第一个进程是初始化进程(init).
进程是由C代码实现的,即init.c;所以我们先从init.c开始阅读.由于init.c文件在Android源码中是有很多个的,我们需要阅读的是内核core的init文件,注意包名不要错误.
在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; }
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函数
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。