本文采用情景栈分析法分析LunchActivity的启动流程 从开机到启动桌面启动完成的流程
首先请看该流程的情景栈如下 log.txt 我们从调用堆栈中可以发现大致流程如下
首先启动 com.android.settings/.FallbackHome 然后pause com.android.settings/.FallbackHome
之后启动com.android.launcher/com.android.launcher2.Launcher
at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2597)
at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2127)
at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:1830)
at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1249)
at com.android.server.am.ActivityStarter.startActivityLocked(ActivityStarter.java:516)
at com.android.server.am.ActivityStarter.startHomeActivityLocked(ActivityStarter.java:642)
at com.android.server.am.ActivityManagerService.startHomeActivityLocked(ActivityManagerService.java:3969)
at com.android.server.am.ActivityManagerService.systemReady(ActivityManagerService.java:13384)
at com.android.server.SystemServer.startOtherServices(SystemServer.java:1318)
at com.android.server.SystemServer.run(SystemServer.java:333)
at com.android.server.SystemServer.main(SystemServer.java:218)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:708)
整个流程从at com.android.server.am.ActivityManagerService.systemReady(ActivityManagerService.java:13384) 开始,我们就从这个函数去分析activity的启动流程
systemReady是在系统启动完毕,Ams要执行的地一个动作,前边的流程就不分析了,有机会会从linux加电自检到AMS.systemReady进行分析。
1 获取HomeIntent action = Intent.ACTION_MAIN , Catagory = Intent.CATEGORY_HOME
2 解析ActivityInfo,这里是通过PackageManagerService去解析的,解析到的ActivityInfo是com.android.settings/.FallbackHome
3 ActivityStarter->startHomeActivityLocked()->startActivityLocked()->startActivityUnchecked() 此1i情景下除了intent外其他参数都是null
4 前面的很多步骤都不需要看了 直接到setTaskFromReuseOrCreateNewTask
computeStackFocus对于不是ApplicationActivity和不是ApplicationTask的 都会放到HomeStack中,其中包括的Activity有HomeActivity和RecentActivity分别对应桌面界面和最近列表界面
computeStackFocus由于当前是要启动的Activity是HOME类型的 所以activityType = HOME_ACTIVITY_TYPE所以在这个情景中会直接返回mSUpervisor.mHomeSatck,是在AMS start的时候创建的。
获取到stack当然是要创建task,由于现在系统中还没有task,所以mResueTask必然是null的,然后调用Stack.createTaskRecord创建task,我们来看下。 对于task——id的分配是根据多用户确定的 首先每个用户最多有MAX_TASK_IDS_PER_USER个Task,如果超过了,则将task设置为-MAX_TASK_IDS_PER_USER,分配好taskid之后就是可以创建TaskRecord,直接new了一个
创建好task周后设置Task的returnType = HOME_ACTIVITY_TYPE,这样点击返回还是返回到HOME_STACK;
设置焦点Activity
mSupervisor.resumeFocusedStackTopActivityLocked
最后就设置启动成功。
有关Settings进程的启动和Activity的显示我们放在后续的正常Activity启动的过程中去分析,下面分析下com.android.settings/.FallbackHome启动之后所做的事情。
FallbackHome的OnCreate中首先判断是否已经过了开机想到,如果没有设设置开机向导主题。
注册UserUnLocak广播接受这监听屏幕解锁,广播中所做的也是执行maybeFinish();之后测操作也是 maybeFinish();
我们来看下maybeFinish();里面做了什么
首先如果屏幕没有锁屏,则查询 final Intent homeIntent = new Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME);
如果所在的包不是setting包则发出延时的message。否则直接关闭界面。这里主要做的操作就是等待packageManager找到正确的lunch,之后关闭当前页面。 我们见到的开机界面就是这里了。
为什么开始读取不到launcher后来读取到了,这个问题我们要留到分析PMS的时候进行。
接下来就看看luncher是怎么启动的。看下我们之前打出来其情景栈
java.lang.Throwable
at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1259)
at com.android.server.am.ActivityStarter.startActivityLocked(ActivityStarter.java:516)
at com.android.server.am.ActivityStarter.startHomeActivityLocked(ActivityStarter.java:642)
at com.android.server.am.ActivityManagerService.startHomeActivityLocked(ActivityManagerService.java:3969)
at com.android.server.am.ActivityStackSupervisor.resumeHomeStackTask(ActivityStackSupervisor.java:674)
at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2184)
at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2127)
at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:1834)
at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:1824)
at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:3635)
at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1292)
at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1212)
at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:6961)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:571)
at com.android.server.am.ActivityManagerService.onTransact(Activity
在com.android.settings/.FallbackHome 关闭之后会重新启动HomeActivity则现在解析到的Activity就变成了launcher的Activity,之后就是走了一遍上面的流程HomeActivity就启动完成了,
下一篇分析PackageManager开机启动过程中是如何先解析到com.android.settings/.FallbackHome,再解析到桌面的com.android.launcher/com.android.launcher2.Launcher
补充一下 先启动FallackHome是因为DirectBoot引起的 可能这时候ce还没有准备好,要等到USER_UNLOCKED和USER_UNLOCKING状态才能读取luncher3的 Home , 在PMS中有个flags用于管理