赞
踩
Zygote进程启动
zygote 通过fork 创建 SystemServer 进程。 SystemServer 里面会创建AMS/PMS 等
startSystemServer()后通过反射会调到 SystemServer的main()
首先看,pid = Zygote.forkSystemServer() 方法,返回的值为0,即fork 出的SystemServer没有子进程,所以pid=0.
当pid=0 时,会执行handleSystemServerProcess()方法,如下:
接下来在 handleSystemServerProcess()主要做了啥?
zygoteInit() 方法,返回的是一个Runnable对象,其实就是MethodAndArgsCaller对象
args.startClass 这个其实就是 SystemServer??
接下来看findStaticMain()方法,findStaticMain()返回的是MethodAndArgsCaller对象,其实就是Runnable
上面执行了mMethod.invoke(null, new Object[]{mArgs}); 后,就是反射调用到SystemServer的main方法
startSystemServer()后通过反射会调到 SystemServer的main(),如下:
mActivityManagerService = mSystemServiceManager
.startService( ActivityManagerService.Lifecycle.class).getService();
因为 startService() 方法传入的是 ActivityManagerService.Lifecycle.class,所以进入到ActivityManagerService的内部Lifecycle类
mActivityManagerService = mSystemServiceManager
.startService( ActivityManagerService.Lifecycle.class).getService();
SystemServiceManager的作用:专门管理各种服务启动
AMS在SystemServer进程中启动。
1.zygote fork 出SystemServer 进程,在SystemServer进程中 通过反射执行到了main方法
2.main 方法中执行run方法
3.run方法startBootstrapServices()方法
4. startBootstrapServices 会通过SystemServiceManager.startService() 启动 AMS, 并返回AMS实例
ActivityManagerService.java中Lifecycle类的getService方法的执行过程:
返回AMS对象。
接下来看看handleSystemServerProcess()方法
接下来是ActivityStarter 的execute()方法
4. zygoete 怎么创建进程的?
先到zygote 循环等待的地方,如下:
zygoteServer.runSelectLoop() 里会反射执行 ActivityThread.main()。
接下来看runSelectLoop()方法,如下 :
接下来看processOneCommand()方法,会看到创建了子进程。
1.attach() 方法
attachApplication()里传的mAppThread 是ApplicationThread的实例,也是Binder对象
说明,应用 和 AMS 的通信是 通过Binder 实现的
SystemServer 启动都干了什么?
有了进程后,进入realStartActivityLocked()方法
mClient 是IApplicationThread 对象
AMS到ApplicationThread 阶段
ApplicationThread 到Activity启动
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b); // binder 通信
return am;
到这里:launcher 通过binder通信调到了AMS里了
第二阶段:AMS到ActivityThread
final ActivityManagerService mService;
public void schedule() throws RemoteException {
mClient.scheduleTransaction(this);
} // 这里通过进程间通信,调用到了ActivityThread的scheduleTransaction()里
ActivityStackSupervisor 类中,addCall()方法里添加的是LaunchActivityItem对象
public static LaunchActivityItem obtain(.....){.....}
Client是ClientTransactionHandler对象,即调用了ClientTransactionHandler对象的handleLaunchActivity()的方法
client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
因为ClientTransactionHandler的handleLaunchActivity()是抽象方法,所以找实现类
ActivityThread 继承了ClientTransactionHandler。所以是调用到了ActivityThread 的handleLaunchActivity()的方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。