Android啓動時序圖
=== 開機過電,復位器件 ===
arm中是uboot或者fastboot
=== 初始化Linux Kernel ===
=== 讀取init.rc文件 ===
位於設備根目錄下
== Android啓動 ==
==== init啓動Linux守護進程 ====
==== init啓動Zygeote進程 ====
受精卵,所有apk應用進程的父進程
==== init初始化runtime進程 ====
=== runtime初始化並註冊Service Manager ===
runtime向zygote申請實例化一個Dalvik Vm並啓動SystemServer SystemServer啓動native serivce(Surface Flinger和Audio Flinger),並將這些native Service註冊在ServiceManager中。
SystemServer啓動android管理服務,都會被註冊ServiceManager中。
至此Android啓動完成
== Zygote啓動分析 ==
Zygote的可執行文件在/system/bin/app_process中
相關配置信息在/init.rc文件中
=== 啓動Socket服務端口 ===
Dalvik VM執行的第一個類ZygoteInit.java,Socket的啓動也在此文件中 private static void registerZygoteSocket()靜態函數中啓動。 String env=System.getenv(ANDROID_SOCKET_ENV)獲取系統爲Zygote分配的Socket描述字。 用createFileDescriptor()創建一個文件描述符,再構造LocalServerSocket對象。 main()中調用runSelectLoopMode()進入非阻塞獨模式 在while(true)中調用ZygoteConnection類的runOnce()處理接收的命令。
=== 加載preload-classes ===
作用:預裝Framework的大部分類和資源 類列表在/system/framework/framework.jar文件中的preload-classer文本文件中。 ZygoteInit.java的main()函數中通過調用preloadClasses()讀取preload—classes的列表來裝載這些類
=== 加載preload-resources ===
preload-resources在/system/framework/base/res/res/values/arrays.xml文件中定義。 ZygoteInit.java的main()函數中通過調用preloadResources()讀取arrays.xml的列表來裝載這些資源。 preloadResources()調用preloadDrawable()來加載Drawable類資源,存於mResources類內部的Drawable列表內,調用preloadColor()加載Color類資源,存於mResources的Color列表內。
=== 啓動SystemServer ===
從ZygoteInit.java的main()調用startSystemServer()開始。
==== 啓動各種系統服務線程 ====
從SystemServer的main()開始執行,先調用init1()進行一些Dalvid VM的相關初始化工作。init1()內部會調用java端的init2()。主要的系統服務在init2()中完成。 init2()創建一個ServerThread線程,從ServerThread的run()開始真正啓動系統服務。 AmS啓動後: 1.調用main() 2.調用AmS.setSystemProcess() 3.調用Ams.installProviders() 4.調用systemReady() 5.啓動第一個activity,即home程序。
在Ams的startHomeActivityLocked()中發出一個intent,它包含CATEGORY_HOME,任何能相應此intent的程序都能成爲第一個activity,成爲home程序。