系統引導bootloader
) 源碼bootable/bootloader/*
) 說明加電後CPU將先執行bootloader程序此處有三種選擇
a) 開機按Camera+Power啟動到fastboot即命令或SD卡燒寫模式不加載內核及文件系統此處可以進行工廠模式的燒寫
b) 開機按Home+Power啟動到recovery模式加載recoveryimgrecoveryimg包含內核基本的文件系統用於工程模式的燒寫
c) 開機按Power正常啟動系統加載bootimgbootimg包含內核基本文件系統用於正常啟動手機(以下只分析正常啟動的情況)
內核kernel
) 源碼kernel/*
) 說明kernel由bootloader加載
文件系統及應用init
) 源碼system/core/init/*
) 配置文件system/core/rootdir/initrc
) 說明init是一個由內核啟動的用戶級進程它按照initrc中的設置執行啟動服務(這裡的服務指linux底層服務如adbd提供adb支持vold提供SD卡掛載等)執行命令和按其中的配置語句執行相應功能
重要的後台程序zygote
) 源碼frameworks/base/cmds/app_maincpp等
) 說明zygote是一個在initrc中被指定啟動的服務該服務對應的命令是/system/bin/app_process
source (service zygote /system/bin/app_process Xzygote /system/bin ;zygote ;start systemserver
socket zygote stream )
a) 建立Java Runtime建立虛擬機
b) 建立Socket接收ActivityManangerService的請求用於Fork應用程序
c) 啟動System Server
系統服務system server
) 源碼frameworks/base/services/java/com/android/server/SystemServerjava
) 說明被zygote啟動通過System Manager管理android的服務(這裡的服務指frameworks/base/services下的服務如衛星定位服務剪切板服務等)
桌面launcher
) 源碼ActivityManagerServicejava為入口packages/apps/launcher*實現
) 說明系統啟動成功後SystemServer使用xxxsystemReady()通知各個服務系統已經就緒桌面程序Home就是在ActivityManagerServicesystemReady()通知的過程中建立的最終調用startHomeActivityLocked()啟launcher
解鎖
) 源碼
frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*
) 說明系統啟動成功後SystemServer調用wmsystemReady()通知WindowManagerService進而調用PhoneWindowManager最終通過LockPatternKeyguardView顯示解鎖界面跟蹤代碼可以看到解鎖界面並不是一個Activity這是只是向特定層上繪圖其代碼了存放在特殊的位置
開機自啟動的第三方應用程序
) 源碼
frameworks/base/services/java/com/android/server/am/ActivityManagerServicejava
) 說明系統啟動成功後SystemServer調用ActivityManagerNativegetDefault()systemReady()通知ActivityManager啟動成功ActivityManager會通過置變量mBooting通知它的另一線程該線程會發送廣播androidintentactionBOOT_COMPLETED以告知已注冊的第三方程序在開機時自動啟動
總結
綜上所述系統層次關於啟動最核心的部分是zygote(即app_process)和system serverzygote它負責最基本的虛擬機的建立以支持各個應用程序的啟動而system server用於管理android後台服務啟動步驟及順序
參考
From:http://tw.wingwit.com/Article/program/yd/201404/30433.html