Android系統啓動流程

一,android系統架構

 andorid系統架構從上到下分別有應用層、應用框架層、系統運行時庫層、硬件抽象層、Linux內核層。

    應用層:包括系統應用比如鬧鐘、日曆等這些在內的以及非系統級別的應用都屬於應用層。負責用戶交互,也就是我們需要開發的東西。

    應用框架層:這一層主要是爲咱們開發人員提供用來開發應用程序的API,平常我們開發程序大部分都是調用這部分的API來進行開發。這一層主要提供一些ActivityManager 管理應用生命週期、locationManager 地理位置服務、還有就是NotificationManager 消息通知管理等等

    系統運行庫層:這一層主要分爲兩部分,分別是c/c++程序庫和Android運行庫

        c++庫主要是能被Andorid系統不同組件所使用,並通過應用程序框架爲開發者提供服務。它主要功能有openggl 繪圖方法庫,多媒體庫支持常用的音頻 視頻格式錄製回訪 ,還有我們常用會用到的一個輕量級的數據庫 sqlLite 等還有ssl網絡協議等等    

    android運行時庫:它主要又分爲核心庫和虛擬機ART,核心庫主要包含Java核心庫的大部分功能。android 5.0系統之前使用的虛擬機是 dalvik,它相對於JVM來說,dalvik虛擬機是專門爲移動設備定製的,主要在有限的內存中同時運行多個虛擬機實例,每一個dalvik虛擬機就是一個獨立的linux進程,這樣獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。  5.0之後,dalvik虛擬機被ART所取代,它們主要區別就是dalvik虛擬機,應用每次在運行的時候,都需要把字節碼文件轉換爲機器碼來運行,這樣應用的運行效率就會比較低。  而art虛擬機,應用在第一次安裝的時候,字節碼文件就會預先編譯成機器碼,讓應用成爲真正的本地應用。

    硬件抽象層:它是位於操作系統內核和硬件電路之間的接口層,主要目的在於將硬件抽象化,隱藏了特定平臺的硬件接口細節,爲操作系統提供虛擬硬件平臺,使其具有硬件無關性,可在多平臺上進行移植。

    linux內核層:Android的核心繫統服務基於Linux內核,在此基礎上添加了部分Android專用的驅動,android系統的安全管理、內存管理、進程管理、網絡協議等都依賴於該內核。

 

二,系統的啓動流程解析

1.啓動電源以及系統啓動
當電源按下時引導芯片代碼開始從預定義的地方(固化在ROM)開始執行。加載引導程序Bootloader到RAM,然後執行。
2.引導程序BootLoader
引導程序BootLoader是在Android操作系統開始運行前的一個小程序,它的主要作用是把系統OS拉起來並運行。
3.Linux內核啓動
內核啓動時,設置緩存、被保護存儲器、計劃列表、加載驅動。當內核完成系統設置,它首先在系統文件中尋找init.rc文件,並啓動init進程。
4.init進程啓動
init進程是系統空間內的第一個進程,進行初始化和啓動屬性服務,在main方法中進行,包括初始化資源文件和啓動一系列的屬性服務。通過執行init.rc文件的腳本文件來啓動Zygote進程。
5.Zygote進程啓動

所有的應用程序包括system系統進程 都是zygote進程負責創建,因此zygote進程也被稱爲進程孵化器,它創建進程是通過複製自身來創建應用進程,它在啓動過程中會在內部創建一個虛擬機實例,所以通過複製zygote進程而得到的應用進程和系統服務進程都可以快速地在內部的獲得一個虛擬機實例拷貝。

    創建JVM並註冊JNI,創建服務端的socket,通過socket通信,啓動systemServer

1.創建AppRuntime並調用其start方法,啓動Zygote進程。

2.創建JavaVM併爲JavaVM註冊JNI.

3.通過JNI調用ZygoteInit的main函數進入Zygote的Java框架層。

4.通過registerZygoteSocket函數創建服務端Socket,並通過runSelectLoop函數等待ActivityManagerService的請求。

5.啓動SystemServer進程。

6.SystemServer進程啓動
啓動Binder線程池和SystemServiceManager,systemServiceManger主要是對系統服務進行創建、啓動和生命週期管理,就會啓動各種系統服務。

7.Launcher啓動

Launcher組件是由之前啓動的systemServer所啓動的ActivityManagerService啓動,

這也是andorid系統啓動的最後一步,launcher是andorid系統home程序,主要是用來顯示系統中已安裝的應用程序。    launcher應用程序的啓動會通過請求packageManagerService返回系統中已經安裝的應用信息,並將這些應用信息通過封裝處理成快捷列表顯示在系統屏幕上,這樣咱們就可以單擊啓動它們。
被SystemServer進程啓動的ActivityManagerService會啓動Launcher,Launcher啓動後會將已安裝應用的快捷圖標顯示到界面上。

上述七步是手機開機andorid系統啓動的流程。

三 應用啓動流程

首先,activity分爲兩種分別是根activity和子activity,根activity就是顯示在手機屏幕上快捷應用圖標,在launcher應用程序啓動器,根activity也就是app的第一個activity是由Launcher組件來啓動,但它又是通過activity管理服務ActivityManagerService來啓動根activity。但是activity Launcher activityManagerService分別運行在不同進程裏面,這三個進程是通過binder進程間通信機制來完成進行通信完成activity的啓動。應用的啓動也就是根activity的啓動。

ActivityManagerService 是一個系統關鍵服務,運行在systemService系統進程中,負責啓動和調度應用程序組件。

luncher是andorid系統的home程序,管理和安裝手機裏的所有應用,

    (1)Launcher首先向activityManagerService發送一個啓動activity的進程間通信請求

    (2)ams會先把要啓動的activity信息保存下來,然後再想Launcher發送一個進入中止狀態的進程間通信請求。

    (3)Launcher組件進入終止狀態後,就會給ams發送一個已進入終止狀態的一個進程間通信請求,ams收到後就會繼續執行啓動activity操作

    (4)ams如果發現用來運行運行activity的進程不存在,它就會給zygote進程發送一個進程間通信請求,zaygote會調用fork()方法創建一個新的應用程序進程。zaygote進程在啓動的時候在內部創建一個虛擬機實例,它通過複製它本身得到一個應用程序進程。

    (5)新的應用程序進程啓動完成之後,就會向ams發送一個啓動完成的通信請求,

    (6)最後ams將第二步保存下來的Activity組件信息發送給zaygote進程創建的新的進程,進程創建好之後,經過一系列調用就會調用startactivity方法,最後activity調用oncreate方法構建出頁面至此我們的應用正式啓動完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章