Framework(4) - APP启动

Launcher本身就是一个应用程序,我们启动app时的本质是对Launcher这个app进行操作。Launcher接收到点击事件时调用startActivity方法,进行activity的跳转。但是与我们平时开发app有所不同,我们要启动的Activity所在的app运行在另外一个进程中,这就涉及到跨进程通信(IPC,Inter-Process Communication)。

Android中通过ActivityManagerService来实现和管理IPC,但是它不能直接让开发者接触到,而是用ActivityManager,WifiManager,LocationManager,WindowsManager等作为入口。我们这里用到的是ActivityManager。

 

一、应用启动流程 (启动分为冷启动、温启动、热启动)

1、Launcher所在进程通过binder发送消息给AMS进程

  Lanucher  -> startActivity -> instrumentation -> AMN/AMP(binder)  -> AMS

2、AMS收到消息,保存要开启的应用信息.(action category cmp等),AMS发送消息告诉Launcher我已收到消息,你可以停止了

action = "android.intent.action.MAIN"

category = "android.intent.category.LAUNCHER"

cmp = “com.xx.xx.ui.activity.MainActivity”

3、Launcher停止,告诉AMS已处于Paused状态。

4、AMS判断目标应用进程是否存在,如果已存在,直接唤醒(热启动)。如果不存在,启动应用(冷启动)。

新建应用过程:

Fork zygote进程 -> 新建ActivityThread ->执行Main方法 (加载app的classes到内存中、Looper、Application初始化)

5、应用Binder通知AMS我已启动

6、AMS将保持的cmp等信息发送给应用 -> Ams(ApplicationThreadProxy) -> ApplicationThread -> ActivityThread ->H -> handleLanucherActivity

 

Framework(4) - APP启动

二、Activity启动

  • Instrumentation: 监控应用与系统相关的交互行为。
  • AMS:组件管理调度中心,什么都不干,但是什么都管。
  • ActivityStarter:Activity启动的控制器,处理Intent与Flag对Activity启动的影响,具体说来有:1 寻找符合启动条件的Activity,如果有多个,让用户选择;2 校验启动参数的合法性;3 返回int参数,代表Activity是否启动成功。
  • ActivityStackSupervisior:这个类的作用你从它的名字就可以看出来,它用来管理任务栈。
  • ActivityStack:用来管理任务栈里的Activity。
  • ActivityThread:最终干活的人,Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。

注:这里单独提一下ActivityStackSupervisior,这是高版本才有的类,它用来管理多个ActivityStack,早期的版本只有一个ActivityStack对应着手机屏幕,后来高版本支持多屏以后,就有了多个ActivityStack,于是就引入了ActivityStackSupervisior用来管理多个ActivityStack。

 

 

Framework(4) - APP启动

三、Binder

应用给AMS发消息

AMN/AMP(binder)  -> AMS

 

AMS给应用发消息

ActivityRecord(ApplicationThreadProxy) -> ApplicationThread

 

 

Framework(4) - APP启动

参考:

https://www.jianshu.com/p/94a929b66d9d

http://liuwangshu.cn/framework/applicationprocess/1.html

https://www.jianshu.com/p/7729d90fc082