所有的进程都是init进程的子进程或孙进程。是init进程fork出子进程
fork:fork函数UNIX及类UNIX系统中的分叉函数,一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
init进程->Zygote进程->SystemServer
ActivityManagerService 和 Zygote 之间的通信是使用Socket进程间通信机制。
具体启动细节:每一个App应用都是由ActivityManagerService通过Socket与Zygote进程进行通信,ActivityManagerService调用startProcessLocked()方法来创建新的进程, 该方法会通过前面讲到的socket通道传递参数给Zygote进程。Zygote会fork一个子进程出来作为这个即将要启动的应用程序的进程, 并调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。接下来要做的就是将进程和指定的Application绑定起来. 这个是通过ActivityThread对象中调用bindApplication()方法完成的. 该方法发送一个BINDAPPLICATION的消息到消息队列中, 最终通过handleBindApplication()方法处理该消息. 然后调用makeApplication()方法来加载App的classes到内存中。
经过前两个步骤之后, 系统已经拥有了该application的进程。后面的调用顺序就是普通的从一个已经存在的进程中启动一个新进程的Activity了。ActivityManagerService会通过Binder机制通知ActivityThread去创建需要的Activity,实际调用方法是realStartActivity(), 它会调用application线程对象中的sheduleLaunchActivity()发送一个LAUNCHACTIVITY消息到消息队列中, 通过handleLaunchActivity()来处理该消息。最后会辗转到Instrumentation来创建Activity。
本文参考链接:https://www.jianshu.com/p/030efebdcdac
网友评论