安卓应用启动流程:
Zygote进程启动
一:SystemServer进程启动
zygote 通过fork 创建 SystemServer 进程。 SystemServer 里面会创建AMS/PMS 等
startSystemServer()后通过反射会调到 SystemServer的main()
二:AMS的创建和启动流程
1. 怎么执行到 systemserver 的main()方法的?
首先看,pid = Zygote.forkSystemServer() 方法,返回的值为0,即fork 出的SystemServer没有子进程,所以pid=0.
当pid=0 时,会执行handleSystemServerProcess()方法,如下:
接下来在 handleSystemServerProcess()主要做了啥?
zygoteInit() 方法,返回的是一个Runnable对象,其实就是MethodAndArgsCaller对象
args.startClass 这个其实就是 SystemServer??
接下来看findStaticMain()方法,findStaticMain()返回的是MethodAndArgsCaller对象,其实就是Runnable
2. MethodAndArgsCaller 的run() 什么时候执行呢?
3. SystemServer的main() 开始执行
上面执行了mMethod.invoke(null, new Object[]{mArgs}); 后,就是反射调用到SystemServer的main方法
startSystemServer()后通过反射会调到 SystemServer的main(),如下:
1.接下来是startBootstrapServices()
2.接下来是 mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class)
mActivityManagerService = mSystemServiceManager
.startService( ActivityManagerService.Lifecycle.class).getService();
因为 startService() 方法传入的是 ActivityManagerService.Lifecycle.class,所以进入到ActivityManagerService的内部Lifecycle类
3.接下来是 .getServie()
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对象。
三: SystemServer的main() 方法,是怎么执行的?
接下来看看handleSystemServerProcess()方法
接下来是ActivityStarter 的execute()方法
进程不存在(首次开机去启动桌面launcher进程,AMS 发现进程不存在)
1.SystemServer进程怎么和zygote 通过Socket建立联系的?
2. 接下来是 openZygoteSocketIfNeeded() ---- SystemServer 与 zygote 通过Socket 建立联系
3.接下来是回到 zygoteSendArgsAndGetResult()
4. zygoete 怎么创建进程的?
先到zygote 循环等待的地方,如下:
zygoteServer.runSelectLoop() 里会反射执行 ActivityThread.main()。
接下来看runSelectLoop()方法,如下 :
接下来看processOneCommand()方法,会看到创建了子进程。
4. 子进程已经创建了,那么首先会执行 AccitivityThread.main()方法
1.接下来看main()方法
1.attach() 方法
attachApplication()里传的mAppThread 是ApplicationThread的实例,也是Binder对象
说明,应用 和 AMS 的通信是 通过Binder 实现的
SystemServer 启动都干了什么?
四:怎么启动Lancher 的第一个Activity的?
有了进程后,进入realStartActivityLocked()方法
mClient 是IApplicationThread 对象
五: Activity启动流程相关(Launcher桌面点击图标)
Launcher 请求AMS阶段
AMS到ApplicationThread 阶段
ApplicationThread 到Activity启动
代码/细节分析
Launcher -->AMS
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()的方法