1.Linux下进程启动的方式
2.应用进程启动的基本流程
3.理解应用进程的启动原理
进程启动方式有2种,都是通过fork函数(返回进程的Pid),fork函数会返回2次,一次是子进程返回(pid是0),一次是父进程返回(pid是子进程的pid),子进程中不带execve函数的会共享父进程的资源,带execve函数的子进程中的资源会被参数中path路径的资源替代。
什么时候触发的进程启动?谁发起的?进程是谁启动的?怎么启动的?
Android中应用进程的启动都是被动的启动,我们在启动组件(Activity,Service)时,如果发现组件所在的进程没有启动,就会先启动组件所在的进程(Framework实现的),然后再去启动组件。
getProcessRecordLocked(...)是查找这个组件所在的进程,每个进程都对应一个ProcessRecord的数据结构,app.thread其实是AMS持有的一个应用的binder句柄(IApplicationThread),是方便AMS调用应用的生命周期或其它交互的,AMS和应用是双向调用的。
应用通过ServiceManager可以拿到AMS的binder句柄(IActivityManager),就可以向AMS发起bind调用。应用进程在启动时会调用IActivityManager的attachApplication函数,一方面是通知AMS应用已经启动,另一方面是向AMS注册自己的binder句柄(IApplicationThread)。
应用进程启动后要执行的入口函数,attach函数首先获取AMS的binder句柄,然后向应用注册自己的binder句柄mAppThread(IApplicationThread)。AMS就会将这个binder句柄保存到ProcessRecord里。
AMS向Zygote发起启动应用进程的请求之后,Zygote启动了应用进程之后,它会返回进程的Pid给AMS,应用进程启动好之后会亲自己告诉AMS它已经启动好了。
AMS不会重复启动应用进程。如果应用进程启动了但还没向AMS报告,它会直接返回应用进程。
进程启动完组件是什么时候启动的? AMS启动Service最终会调到bringUpServiceLocked函数
1.如果应用进程已经启动了,并且向AMS注册过了,就直接启动组件
2.如果应用进程没启动,就去启动应用进程
3.把要启动的组件添加到一个PendingServices的数组里,应用进程向AMS报告时会调到attachApplication函数,attachApplication函数里就会处理这个数组,遍历->移除->启动组件
AMS向Zygote发送启动进程的参数列表,参数列表里就包含应用进程启动之后执行的Main函数的类名。
Zygote处理Socket请求。先读取AMS发过来的参数列表,根据参数去创建应用进程。在父进程中写进返回的Pid,AMS就可以收到Zygote返回的应用pid。在子进程中就会执行ActivityThread类的main函数,ActivityThread的main函数主要就是启动主线程的消息循环,另一个就是向AMS报告。
网友评论