1. 程式人生 > >AMS開機過程中桌面的啟動流程

AMS開機過程中桌面的啟動流程

本文采用情景棧分析法分析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用於管理