Android系統架構圖
1.1 安卓系統啟動
1.設備加電后執行第一段代碼:Bootloader
系統引導分三種模式:fastboot,recovery,normal:
fastboot模式:用于工廠模式的刷機。在關機狀態下,按返回+開機 鍵進入此模式
recovery模式:用于工程模式的刷機。按 home+開機 鍵進入此模式
normal模式:正常開機2.Bootloader初始化CPU和硬件
3.Bootloader裝載操作系統映像或者固化的嵌入式應用程序到內存中
4.跳到操作系統的空間,啟動操作系統運行
5.Bootloader啟動內核和init進程,init進程并發出更多用來處理底層硬件的守護進程
6.init進程啟動"Ztgote"進程。接著它啟動第一個VM,用來預加載Android的framework和APP需要的通用資源。然后開啟一個Socket來監聽請求,基于預加載的VM孵化出一個新的VM創建一個新的進程
7.init進程啟動"runtime"進程,它啟用超級管理進程---System Server。接著SystemServer啟動所有系統核心服務,如ActivityManager Service,硬件相關的Service等。
8.操作系統啟用第一個App進程---Home進程
1.2 安卓應用啟動分析
1 ?每個應用都是在單獨的進程中,被系統分配一個唯一的user id。
2 ?一個進程,由一個主線程+多條子線程組成。主線程中有一個Looper實例,通過Looper.loop()隊列從Message隊列中取出Message來做相應的處理。
3 ?Android的系統界面基本都是由一些Activity組成,在Android系統里,Activity全部放在ActivityStack里管理。而ActivityStack是由ActivityManagerService內部管理的
APP的啟動流程:
1 ?點擊應用程序圖標,Launcher調用startActivity(intent)
系統啟動后,會啟動系統應用和用戶應用,而Launcher就是一個系統應用,也是有單獨的進程2 ?Launcher通過Binder IPC機制, 調用到ActivityManagerService
進程與進程直接使用Binder機制來開啟應用
3 ?ActivityManagerService收集intent 信息,驗證權限
3.1 ?第一步通過PackageManager的resolveIntent()收集這個intent對象的指向信息3.2 ?指向信息被存儲在一個intent對象中
3.3 ?下通過grantUriPermissionLocked()方法來驗證用戶是否有足夠的權限去調用該intent對象指向的Activity
3.4 ?如果有權限, ActivityManagerService會檢查并在新的task中啟動目標activity
4 ?開啟進程,打開應用的LaunchActivity
檢查這個進程的ProcessRecord是否存在,如果ProcessRecord是null, ActivityManagerService會創建新的進程來實例化目標activity
創建進程的過程:
1 ?ActivityManagerService調用startProcessLocked()方法來創建新的進程
2 ?startProcessLocked方法會通過socket通道傳遞參數給Zygote進程. Zygote孵化自身, 并調用ZygoteInit.main()方法來實例化ActivityThread對象并最終返回新進程的pid
3 ?ActivityThread隨后依次調用Looper.prepareLoop()和Looper.loop()來開啟消息循環
4 ?將進程和指定的Application綁定。ActivityThread對象中調用bindApplication()方法,該方法發送一個BIND_APPLICATION的消息到
消息隊列中, 最終通過handleBindApplication()方法處理該消息, 然后調用makeApplication()方法來加載App的classes到內存中
5 ?application的進程已存在,現在就是從一個已經存在的進程中啟動一個新進程的activity。先是調用realStartActivity(),該方法調用application線程對象中的sheduleLaunchActivity()發送一個LAUNCH_ACTIVITY消息到消息隊列中,handleLaunchActivity()會處理該消息,最后調用LaunchActiivity的onCreate來創建界面