1,ActivityManagerService,通过Socket发送新建应用进程的请求到Zygote进程。
2,Zygote进程fork(通过复制自身)应用进程。
因为Zygote进程内部有虚拟机实例,所以应用进程就有一个拷贝的虚拟机,除此之外还可以获得一个Binder线程池和一个消息循环(就是Handler机制)。
如下代码:
public final class ActivityManagerService extends ActivityManagerNative
implement Watchdog.Monitor,BatterStatsImpl.BatteryCallback{
...
private final void startProcessLocked(ProcessRecord app,
String hostingType,String hostingNamestr){
try{
int uid=app.info.uid;
int[] gid=null;
gid=mContext.getPackagemanager().getPackageGids(app.info.packageName);
...
int pid=Process.start("android.app.ActivityThread",
mSimpleProcessManagement?app.processName:null,
did,uid,gids,debugFlags,null);
}catch(RuntimeException){
...
}
}
}
在ActivityManagerService中,首先获取要创建应用进程的用户ID、用户组ID,然后调用Process类的静态方法start创建应用程序进程,并且指定了应用程序入口函数为android.app.ActivityThread类的main()方法。
在Process.start(...)方法中,通过一系列的调用使Zygote进程fork出应用进程,在这个过程中创建了Binder线程池,用于进程间通信。并在ActivityThread类中开启消息循环。如下:
public final class ActivityThread{
...
public static final void main(String[] args){
..
Looper.prepareMainLooper();
...
ActivityThread thread =new ActivityThread();
thread.attach(false);
...
Looper.loop();
...
}
}
至此,应用程序的进程的消息循环创建完成,整个应用程序进程启动也完成。