AMS的创建和启动,Activity的启动流程

安卓应用启动流程:

 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 */);

因为ClientTransactionHandlerhandleLaunchActivity()是抽象方法,所以找实现类

 ActivityThread 继承了ClientTransactionHandler所以是调用到了ActivityThread 的handleLaunchActivity()的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值