Android Handler随记_暮冬一十四的博客-优快云博客
Android Binder随记_暮冬一十四的博客-优快云博客
init进程
- 由pid为0的Linux内核进程启动
- 启动系统关键进程: 执行init.rc脚本,执行脚本中一行一行的Linux命令来启动进程
- 守护系统关键进程:如蓝牙、铃声、接打电话、安装应用等进程名结尾带“d”的系统进程
- 当守护的进程被杀死时,重启被杀死的进程
- 当守护的进程无法被重启时,重启手机:如Zygote
Zygote
- 由init进程执行zygote.rc脚本启动的
- 最开始启动的时候名字并不是叫Zygote,而是app_process
- 在app_main.cpp中当解析到命令中有“--zygote”时,将app_process的名字改为了Zygote(niceName=ZYGOTE_NICE_NAME,可能是感觉app_process不好听吧)
- Zygote是native进程:由c++代码启动的;
- Zygote创建一个Server端的Socket,实现与其他进程通信
- 调用preloadClasses和preloadResources提前加载系统资源、系统类;从而让APP进程不用重复加载系统资源、系统类;如Activity的Class、系统主题等
- ZygoteInit.java还去fork出了SystemServer这个java进程
- 启动App时,Zygote还负责fork出App进程
与Zygote进程通信为什么要用Socket,而不是Binder?
- Zygote它负责开进程
- Binder效率太高了,而开进程又比较慢,用Binder同时发多个启动进程请求时,会让内存瞬间暴涨; 安全方面:容易被Hook;
- Socket:请求串行,执行完一个开进程,再执行下一个;
Zygote是创建Android系统中Java世界的盘古,它创建了第一个Java虚拟机,同时它又是女娲,它成功地繁殖了framework的核心system_server进程。
Zygote创建Java世界的步骤:
- 第一天:创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
- 第二天:调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
- 第三天:通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。然而在这个世界刚开创的时候,什么东西都没有。
- 第四天:调用registerZygoteSocket。通过这个函数,它可以响应子孙后代的请求。同时Zygote调用preloadClasses和preloadResources,为Java世界添砖加瓦。
- 第五天:Zygote觉得自己工作压力太大,便通过调用startSystemServer分裂一个子进程system_server来为Java世界服务。
- 第六天:Zygote完成了Java世界的初创工作,它已经很满足了。下一步该做的就是调用runSelectLoopMode后,便沉沉地睡去了。
- 以后的日子:Zygote随时守护在我们的周围,当接收到子孙后代的请求时,它会随时醒来,为它们工作。
- 有一天,他的孩子SystemServer发送了个请求,Zygote苏醒,Zygote调用ZygoteConnection的runOnce函数。在runOnce方法中Zygote分裂了一个子进程(App进程),然后在调用handleChildProc方法在子进程中进行处理。
- 然后继续沉睡,等待请求进行下一次分裂。