启动一个Activity的方式有两种,一种是冷启动,另一种为热启动。
启动Activity涉及的进程:
1.init 进程
Android是基于Linux系统,手机开机之后,linux内核进行加载。加载完成以后会启动init进程。
init进程会启动ServiceManager,孵化一些守护进程,并解析init.rc,孵化Zygote进程。
2.Zygote进程
所有app进程都是由Zygote进程fork生成的,包括SystemServer进程。Zygote初始化后,会注册一个等待接受消息的socket,OS层会采用Socket进行ipc通信。
3.SystemServer进程
SystemServer进程
SystemServer是Zygote孵化的第一个进程。SystemServer负责启动和管理整个java
Framework,包括AMS,PMS等服务。
4.App进程
开始启动MainActivity
启动步骤:
第一步:Launcher通知AMS要启动新的Activity
Launcher.startActivitySafely(首先Launcher发起启动Activity的请求)
Activity.startActivity
Activity.startActvityForResult
Instrumentation.execStartActivity(交由Insrumention代为发起请求)
ActivityManager.getService().startActivity(通过IActivityManagerSingleton.get()得到一个AMP代理对象)
ActivityMangerProxy.startActivity(通过AMP代理通知AMS启动activity)
第二步:AMS先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后,AMS会通知Launcher程序pause Activity。
ActivityMangerSerice.startActvity
ActivityMangerService.startActivityAsUser
ActivityStackSuperVisor.StartActivityMayWait
ActivityStackSuperVisor.startActivityLocked(检查有没有在AndroidManifest中注册)
ActivityStack.startActivityLocked(判断是否需要创建一个新的任务来启动Activity)
ActivityStack.resumeTopActivityLocked(获取栈顶的activity,并通知Launcher应该pause掉整个Activity以便启动新的Activity)
ActivityStack.startPausingLocked
ApplicationThreadProxy.schedulePauseActivity
第三步:检查activity所在的进程是否存在,如果存在,直接通知这个进程,在该进程中启动Activity;不存在的话,会调用Process.start创建一个新的进程。
ActivityManagerService.activityPaused
ActivityStack.activityPaused
ActivityStack.completePauseLocked
ActivityStack.resumeTopActivityLocked
ActivityStack.startSpecificActivityLocked
ActivityManagerService.startProcessLocked
Process.start(创建新进程,新的进程会导入ActivityThread类,并执行它的main函数)
第四步:创建ActivityThread实例,执行一些初始化操作,并绑定Application。如果Application不存在,会调用LoadedApk.makeApplication创建一个新的Application对象。
ActivityThread.main
ActivityThread.attach(false) (声明不是系统进程)
ActivityManagerProxy.attachApplication
第五步:启动目标Activity
ActivityManagerService.attachApplication(AMS绑定本地ApplicationThread,后续通过ApplicationThreadProxy来通信)
ApplicationManager'Service.attachApplicationLocked
ActivityStack.realStartActivityLocked(真正要启动Activity了)
ApplicationThreadProxy.scheduleLaunchActivity(AMS通过ATP通知app进程启动Activity)
涉及到的相关类:
ActiviyStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
ActivitySuperVisor:管理activity任务栈。
ActivityThread:ActivityThread运行在UI线程,app的真正入口。
ApplicationThread:用来实现AMS和ActvityThread之间的交互。
ApplicationThreadProxy:ApplicationThread在服务端的代理,AMS就是通过该代理与ActivityThread进行通信的
IActivityManager:继承和IInterface接口,抽象出跨进程通信需要实现的功能
AMN:运行在Server端(SystemServer进程)。实现了Binder类,具体功能由子类AMS实现。
AMS:AMN的client端代理(app进程)。了解Binder,可以比较容易理解Server端的stub和client端的proxy。AMP和AMS通过Binder通信。
Instrumentation:仪表盘,负责调用Activity和Application生命周期。
ActivityStackSupervisor:负责所有Activity栈的管理。内部管理了mHomeStack、mFocusedStack和mLastFocusedStack三个Activity栈。其中,mHomeStack管理的是Launcher相关的Activity栈;
mFocusedStack管理的是当前显示在前台Activity的Activity栈;mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。
总结:
启动Activity的步骤:
1.Launcher通知AMS要启动新的Activity
2.校验Activity的正确性
3.校验Activity所在的进程是否存在
4.创建ActivityThread实例
5.真正启动目标activity
细化:
1.Launcher进程,Launcher发起请求(startActivity)
2.交由Insrumentation代为发起请求(Insrumentation.execStartActvity)
3.通过AMP代理通知AMS(ActivityMangerProxy.startActivity)
4.AMS收到请求,验证activity正确性(ActivityStackSupervisor.startActivityLocked)
5.检查activity所在进程是否存在(ActivityManagerService.startProcessLocked)
6.Zygote进程,AMS通过socket通知Zygote创建App进程
7.创建ActivityThread,生成Application
8.AMS创建activity
9.App进程,开始启动MainActivity
其中2,3,4,5,7,8是由SystemServer进程负责的