Android正常開機流程java
Android正常開機首先從arm9側開始,進而轉到arm11側。具體的開機流程以下。android
由BootLoader開啓安全
由內核啓動,會按照init.rc中配置的內容進行初始化工做。app
Init最後會啓動zygote,進入zygoteinit.java的main方法。socket
在zygote的main方法中主要進行的操做包括創建socket鏈接registerZygoteSocket()、類的預加載preloadClasses()、資源的預加載preloadResources()等操做。ide
程序會先找到名爲preloaded-calsses的文件,該文件位於framework.jar裏,裏面的配置文件中每一行都記載了一個要加載的類,程序會經過流的方式逐行讀取文件,並經過Class.forName()的方式對每個類進行加載,並計數,最後會打印出統計log。函數
在preloadResources()中加載資源,包括drawable和color的,最後也會打出統計log。動畫
在加載完資源以後,程序會調用startSystemServer()爲調用systemserver類作一些準備。而後會經過system_init.cpp走到systemserver.java中繼續執行。spa
zygote會調用systemserver類main方法,main中會調用該類的init1方法,init1方法中會在底層做一些啓動服務的處理。(SurfaceFlinger, AudioFlinger, etc..).線程
而後init1方法再調用init2方法,經過init2方法來啓動android的service。
在init2方法中會啓動並執行一個serverthread的線程,而後程序進入serverthread的run方法。接下來進行在run方法中的操做。
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,第三方程序在接收此廣播後開始啓動。