手机启动后首先启动进程init(用户空间第一个进程),init进程读取init.rc文件启动相应进程,system_manager(这是init进程启动的第一个进程)、surface_flinger、media_service、zygote
一、fork机制
1、fork()系统调用可以有两个返回值,如果在child进程分支调用exe()系统调用那么会执行输入路径下的代码
pid = fork();
if(pid == 0) {
//child进程
} else {
//parent进程
}
在linux新的内核中,epoll用来替换select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为内核中的select实现是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。
2、fork()采用的是写时复制,就是在fork后不会立刻复制指令,而是在写入的时候才会复制指令
二、zygote的native世界
1、启动虚拟
在这里启动虚拟机是因为zygote是所有应用的父进程,由于写时复制所以会提高性能
2、注册jni方法
3、进入java世界
三、zygote的java世界
1、开启socket通信
应用的启动都是通过本地socket通信实现的,在这里就是等待应用进程请求创建进程服务
2、fork SystemService进程
创建系统服务进程PMS、AMS、WMS
3、runSelectLoop()等待客户端请求创建新的进程
四、system_service的native世界
1、启动Binder线程池,这样就可以与其他进程进行通信
通过调用native层的代码nativeZygoteInit方法,来启动一个Binder线程池
五、system_service的native世界
1、启动Binder线程池后,紧接着会进入SystemServer的main方法(可以看做是SystemServer进程的入口),在main方法中,首先会创建一个消息looper,紧接着便会创建SystemServiceManager,它会对系统服务进行创建、启动和生命周期管理。
2、启动各种系统服务
首先系统服务分为三种:引导服务、核心服务、其他服务。SystemServiceManager会依序将所有系统服务启动起来。对应方法为:startBootstrapServices()、startCoreServices()、startOtherServices()。
引导服务比如:PowerManagerService、ActivityManagerServer、PackageManagerService等
核心服务比如:BatteryService等
其他服务比如:WindowManagerService、CameraService、AlarmManagerService等
六、开启Binder通信
1、open 打开binder驱动
2、mmap内存映射
3、将线程注册为binder线程
4、binder loop循环等待消息
七、启Luancher应用
八、zygote为什么不使用binder机制而是使用socket机制
binder机制要使用多线程,而fork创建对象时必须是单线程的,否则会造成死锁
参考
https://blog.csdn.net/itachi85/article/details/54783506
https://blog.csdn.net/shaoenxiao/article/details/87088982?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1
https://www.jianshu.com/p/327f583f970b
https://blog.csdn.net/eliot_shao/article/details/51514045
https://blog.csdn.net/qq_39037047/article/details/88066589
https://www.zhihu.com/question/312480380