Android正常開機流程

Android正常開機流程java

Android正常開機首先從arm9側開始,進而轉到arm11側。具體的開機流程以下。android

1               啓動Bootloader

 

2               內核kernel

由BootLoader開啓安全

 

3               Init

由內核啓動,會按照init.rc中配置的內容進行初始化工做。app

Init最後會啓動zygote,進入zygoteinit.java的main方法。socket

 

4               Zygote

在zygote的main方法中主要進行的操做包括創建socket鏈接registerZygoteSocket()、類的預加載preloadClasses()、資源的預加載preloadResources()等操做。ide

 

4.1  preloadClasses()

程序會先找到名爲preloaded-calsses的文件,該文件位於framework.jar裏,裏面的配置文件中每一行都記載了一個要加載的類,程序會經過流的方式逐行讀取文件,並經過Class.forName()的方式對每個類進行加載,並計數,最後會打印出統計log。函數

 

4.2  preloadResources()

在preloadResources()中加載資源,包括drawable和color的,最後也會打出統計log。動畫

 

在加載完資源以後,程序會調用startSystemServer()爲調用systemserver類作一些準備。而後會經過system_init.cpp走到systemserver.java中繼續執行。spa

 

 

5               SystemServer

5.1 SystemServer類中的操做

zygote會調用systemserver類main方法,main中會調用該類的init1方法,init1方法中會在底層做一些啓動服務的處理。(SurfaceFlinger, AudioFlinger, etc..).線程

而後init1方法再調用init2方法,經過init2方法來啓動android的service。

在init2方法中會啓動並執行一個serverthread的線程,而後程序進入serverthread的run方法。接下來進行在run方法中的操做。

5.2  ServerThread中的操做

1。判斷上一次是否正常關機,若是不是(failed to shut down)則會立刻執行關機操做,若是正常的話則開始啓動服務。

2。啓動Entropy Service

3。 啓動Power Manager

4。啓動Activity Manager

期間會尋找bootanimation.zip文件,執行開啓動畫的操做。這裏的開機動畫指的是android幾個字閃爍的界面。

5。啓動Telephony Registry

6。啓動Package Manager

7。啓動Account Manager

8。啓動Content Manager

9。啓動System Content Providers

10。啓動Battery Service

11。啓動Lights Service

12。啓動Vibrator Service

13。 啓動Alarm Manager

14。啓動Init Watchdog

15。啓動Window Manager

16. 啓動Bluetooth Service(期間會進行判斷,若是是在模擬器的狀況下會跳過此步驟:Skip Bluetooth if we have an emulator kernel)

17.啓動 Device Policy

18.啓動Status Bar

19.啓動Clipboard Service

20。啓動Input Method Service

21。啓動NetStat Service

22。啓動NetworkManagement Service

23。啓動Connectivity Service

24。啓動Throttle Service

25。啓動Accessibility Manager

26。啓動Mount Service

27。啓動Notification Manager

28。啓動Device Storage Monitor

29。啓動Location Manager

30。啓動Search Service

31。啓動DropBox Service

32。啓動Wallpaper Service

33。啓動Audio Service

34。啓動Headset Observer

35。啓動Dock Observer

36。啓動UI Mode Manager Service

37。啓動Backup Service

38。啓動AppWidget Service

39。Recognition Service

40。啓動DiskStats Service

 

41。確保ADB_ENABLED設置值同secure property的值相匹配(make sure the ADB_ENABLED setting value matches the secure property value)

42。register observer to listen for settings changes

43。判斷是不是安全模式(safemode),並作相應的處理。

 

在各個服務都啓動以後,開始執行app process,經過調用xxx.systemready()方法,通知各個服務已經就緒。

44。執行devicePolicy.systemReady()

45。執行notification.systemReady()

46。執行statusBar.systemReady()

47。執行Windowmanagerservice.systemReady()

在該方法中會調用到phonewindowmanager的systemReady(),而後調用doKeyGuard(),會開啓鎖屏計時器。也就是關聯到剛開機時進入的鎖屏界面。

48。執行Powermanagerservice.systemReady

49. 執行packagemanager.systemready

50.調用ActivityManagerservice.systemReady(new Runnable()),傳入一個線程參數,

在ActivityManagerservice裏面會調用startProcessLocked(),而後attachApplicationLocked()。

51。啓動做爲參數傳入給ActivityManagerservice.systemReady的線程,調用其餘系統app的systemready。(包括StatusBarManagerService、BatteryService、ConnectivityService、DockObserver、UsbObserver、ThrottleService、UiModeManagerService、AppWidgetService、WallpaperManagerService、InputMethodManagerService、RecognitionManagerService、 LocationManagerService)

52. 在ActivityManagerservice的systemready()中經過resumeTopActivityLocked()調用startHomeActivityLocked函數來啓動launcher.

53。最後在activitymanager裏發送ACTION_BOOT_COMPLETED的intent,第三方程序在接收此廣播後開始啓動。

相關文章
相關標籤/搜索