前言
基于Android 10 源码 。Activity启动分为两种:
- 普通Activity启动:APP已经启动,一般在APP内从一个Activity启动另一个Activity。
- 根Activity启动:也称为APP冷启动,App还没有启动,一般从Launcher界面启动。
两者主流程基本一致,区别在于根Activity启动流程还包含启动APP进程和实例化Application的流程。
普通Activity启动流程
流程概述
分析方法Activity.startActivity()
到Activity.onCreate()
的流程,流程图如下。
流程说明:
- 客户端发起启动Activity请求。客户端里的Activity通过
Instrumentation.execStartActivity()
请求服务端的ATMS启动Activity。
- 服务端完成Intent解析和数据、权限、状态等检查的准备工作。ATMS通过ActivityStarter、ActivityStack、ActivityStackSupervisor等完成Intent解析、检查等准备工作,并将数据传递给客户端的ApplicationThread,请求后者完成剩余启动工作。
- 客户端完成Activity的创建、数据绑定、onCreate回调等工作。ApplicationThread通过ActivityThread将数据传到其主线程的Handler中进行处理,完成Activity的创建、数据绑定和onCreate回调等工作。
方法说明
Instrumentation.execStartActivity()
请求服务端的ATMS启动Activity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token ...) { int result = ActivityTaskManager.getService().startActivity( whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options); }
|
ActivityStarter.startActivityMayWait()
解析Intent
1 2 3 4 5 6 7 8 9 10
| private int startActivityMayWait(IApplicationThread caller, int callingUid ...) { ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId...); ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo); }
|
ActivityStarter.startActivity()
检查权限等
1 2 3 4 5 6
| private int startActivity(IApplicationThread caller, Intent intent ...) { boolean abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho ...); abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid ...); abort |= !mService.getPermissionPolicyInternal().checkStartActivity(intent, callingUid,callingPackage); }
|
ActivityStackSupervisor.realStartActivityLocked()
生成事务,为IPC到客户端创建Activity准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc...){ ... final ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.appToken); final DisplayContent dc = r.getDisplay().mDisplayContent; clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent), ...)); final ActivityLifecycleItem lifecycleItem; if (andResume) { lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward()); } else { lifecycleItem = PauseActivityItem.obtain(); } clientTransaction.setLifecycleStateRequest(lifecycleItem); mService.getLifecycleManager().scheduleTransaction(clientTransaction); }
|
创建Activity,绑定数据等,执行Activity.onCreate()
回调。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ActivityInfo aInfo = r.activityInfo; ComponentName component = r.intent.getComponent(); ContextImpl appContext = createBaseContextForActivity(r); java.lang.ClassLoader cl = appContext.getClassLoader(); Activity activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent); Application app = r.packageInfo.makeApplication(false, mInstrumentation); activity.attach(appContext, this, getInstrumentation(), r.token...); mInstrumentation.callActivityOnCreate(activity, r.state); }
|
根Activity启动流程
流程概述
一般也称为APP冷启动流程,分析从Launcher界面点击APP图标到APP显示完成的流程。相比从普通Activity启动流程,App的冷启动流程多了两个步骤:创建进程,绑定并创建Application对象。
图中虚线部分是创建APP进程和启动Application的流程。
普通Activity启动流程走到ActivityStackSupervisor.startSpecificActivityLocked()
时,有一个进程相关的判断:如果应用进程存在则去启动Activity,否则去创建进程。冷启动时,App进程还不存在,因此需要去创建进程,其入口便是这里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) { final WindowProcessController wpc = mService.getProcessController(r.processName, r.info.applicationInfo.uid); boolean knownToBeDead = false; if (wpc != null && wpc.hasThread()) { realStartActivityLocked(r, wpc, andResume, checkConfig); return; } final Message msg = PooledLambda.obtainMessage( ActivityManagerInternal::startProcess, mService.mAmInternal, r.processName, r.info.applicationInfo, knownToBeDead, "activity", r.intent.getComponent()); mService.mH.sendMessage(msg); }
|
APP的冷启动过程主涉及到四个进程:Launcher进程(启动APP的进程)、SystemServer进程、APP进程、Zygote进程;三个重要工作:启动进程、启动Application、启动Activity。
整个流程简述为:
- Launcher进程请求SystemServer进程创建Activity
- SystemServer进程解析Intent等,并检查目标APP进程是否存在,不存在则去创建进程。
- SystemServer进程通过Socket方式请求Zygote进程创建APP进程,返回进程号等信息。
- App进程入口为
ActivityThread.main()
方法,执行此方法,初始化进程并请求SystemServer绑定APP进程。绑定进程的工作包括,一,通知APP进程去启动Application;二,通知APP进程去启动Activity。