Android 启动流程

启动一个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进程负责的

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值