Android开发——Android系统启动以及APK安装、启动过程
0. 前言 ?
從Android手機打開開關,到我們可以使用其中的app時,這個啟動過程到底是怎么樣的?
?
1.? 系統上電
當給Android系統上電,在電源接通的瞬間,CPU內的寄存器和各引腳均會被置為初始狀態,CPU復位之后,程序指針會指向啟動地址,從該地址讀取并直接運行啟動程序的可執行代碼,或者將可執行代碼與數據載入CPU內置的RAM中再運行。這一段代碼,放在PC中,叫做BIOS,而在Android等嵌入式系統中就叫做Bootloader。
?
2.? Bootloader引導程序
通過Bootloader引導程序,可以初始化硬件設備,建立內存空間映射圖,為操作系統內核準備好環境,完成整個系統的加載啟動任務。
?Bootloader是支持交互式操作的,一般刷機中會用到的Fastboot模式,就是在Bootloader啟動之后,根據用戶輸入的指令(在手機上用音量鍵,Home健等操作),停留在當前狀態。
而正常情況下,Bootloader程序執行完成之后,就會開始加載Android操作系統。
?
3.? 加載內核
我們知道Android操作系統的內核其實就是Linux內核。當Bootlader引導程序啟動之后,就會進入Linux的內核引導階段。該階段會初始化內核和設備驅動,接著啟動內核,掛載文件系統,最后啟動用戶空間進程。
?
4.? Init程序
Init程序是用戶空間的第一個進程。它負責解析一個叫做init.rc的配置文件,啟動Android系統底層運行的一些服務進程。
?init.rc文件定義了不同的Action和Service,其格式如下:
//Action是以關鍵字on來定義的,緊接著的boot是一個觸發條件 //如下面的action表明當Android啟動(boot)的時候,要做些什么事情 // Action boot之后的class_start core等,是Init程序在開機時會啟動的服務 //這些服務包括ueventd, servicemanager, void, zygote,installd, ril-daemon等,我們一般稱它們為守護進程 on boot ... class_start core class_start main //Service是以關鍵字servie來定義的,緊跟著的是其名字和其啟動的文件 //如下會執行/system/bin/serviemanager文件,并將其命名為servicemanager service servicemanager/system/bin/servicemanager #聲明一個service,而servicemanager則是其名字 class core #optioin, 該service屬于core類 usersystem $option,該service屬于System用戶 group System
Init程序同時也會開啟屬性服務,存放一些關于Android系統的全局系統設置信息。
最后,當所有的Action和Service都啟動完成之后,Init程序就會進入一個無限的循環,監聽系統中發生的事件,對一些事件進行處理,比如重啟某些服務等。
?
5.? ServiceManager
ServiceManager是Init程序啟動的守護進程之一,它是Android中Binder通信機制的基礎。
?ServiceManager提供了注冊,檢索服務的功能。在Zygote子進程system_server啟動的每一項服務都會將其注冊到ServiceManager中,由ServiceManager來統一進行管理。值得注意的是,ServiceManager本身也是一個Service,所以它也會將自己注冊到自身上面。
?而ServiceManager啟動的過程做了三件事:
(1)打開Binder設備,把Binder設備映射到內核空間中,由于內核空間是所有進程共享的區域,所以借助這塊區域,可以實現不同進程間資源的共享,從而達到進程間通信。
(2)ServiceManager本身會變成一個ContextManager,即上面所說的注冊到自己身上,負責各種Service的上下文管理。
(3)最終ServiceManager也是會進入一個無限循環。
?
6.? Zygote
Zygote也是由Init程序啟動的其中一個服務,是Android中的第一個Dalvik虛擬機。在之后,所有的Dalvik虛擬機都是由Zygote孵化出來的,這是因為Android中每一個應用都有著自己的進程,而每一個進程中都著一個Dalvik虛擬機,如果每起一個應用就創建一個虛擬機,效率太低,而通過復制Zygote,不僅可以提高創建的速度,還能夠共享系統和框架的資源,可以大幅度提高應用程序啟動的效率。
?Zygote啟動之后:
(1)首先會創建一個socket,等待某個客戶端的請求。
(2)接著創建其第一個子進程system_server。system_server會開啟Android系統的Native Service和Java Service。
其中Native Service就是那些利用JNI實現的共享庫,而Java Service則是通過Java語言實現的ActivityManagerService等,都是在這個階段由system_server啟動并注冊到一個叫ServiceManager的服務進程中。
ActivityManagerService啟動之后,會進入到一個叫System Ready的狀態,而在其達到System Ready的狀態之前呢,就會啟動一個叫做Launcher的應用,而這個Launcher就是Android系統啟動成功之后見到的Home桌面了。
而在SystemReady的狀態,其會跟Zygote啟動之初的Socket進行通信,告訴Zygote一切已經就緒。
(3)Zygote知道已經啟動成功,就開始進入一個無限的循環,在Socket上等待請求的到來。
?
至此,從Android手機上電的那一刻起,到加載內核,到最后顯示Home桌面的整個過程就結束了。
7.? APK的安裝過程
Android系統啟動的過程中會啟動一個應用程序管理服務PackageManagerService(系統啟動的時候由SystemServer組件啟動),這個服務負責掃描/system/framework、/system/app、/vendor/app、/data/app、/data/app-private五個目錄下的APK文件,然后解析該APK中的AndroidManifest.xml以獲得應用程序相關信息,其中最重要的就是依據sharedUserId這個配置來讓系統確定每個APK運行在哪個進程。
繼而為這個APK分配Linux用戶ID、用戶組ID以便APK在系統中可以獲取到合適的運行權限、資源訪問權限。
最后將之前獲得的權限和APK安裝信息保存到本地的一個配置文件中,以便下次在安裝這些APK時可以將需要的APK信息很快速的恢復回來。
8.? 應用啟動流程
8.1? 應用的冷熱啟動
Android中的冷啟動指當啟動應用時,后臺沒有該應用的進程,這時系統會重新創建一個新的進程分配給該應用所以會先創建和初始化Application類,再創建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上。
Android中的熱啟動指當啟動應用時,后臺已有該應用的進程(如按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在后臺,可進入任務列表查看),熱啟動就不會走Application這步了。
?
8.2? 應用的啟動流程
當點擊app圖標時,系統會從Zygote進程中fork創建出一個新的進程分配給該應用,之后會依次創建和初始化Application類、創建MainActivity類、加載主題樣式Theme給MainActivity以及配置Activity層級上的一些屬性、再inflate布局、當onCreate/onStart/onResume方法都走完了后最后才進行contentView的measure/layout/draw顯示在界面上,所以直到這里,應用的第一次啟動才算完成,這時候我們看到的界面也就是所說的第一幀。
總結一下,應用的啟動流程如下:
Application的構造器方法——>attachBaseContext()——>onCreate()——>Activity的構造方法——>onCreate()——>配置主題中背景等屬性——>onStart()——>onResume()——>測量布局繪制顯示在界面上8.3? 啟動時間優化
可以通過adb shell命令的方式進行測量應用的啟動時間:
adb shell am start -W [packageName]/[packageName.MainActivity]應用初始化的時候采取以下策略可減少啟動時間:(1)在Application的構造器方法、attachBaseContext()、onCreate()方法中不要進行耗時操作的初始化。
(2)對于MainActivity,由于在獲取到第一幀前,需要對contentView進行測量布局繪制操作,盡量減少布局的層次,考慮StubView的延遲加載策略,當然在onCreate、onStart、onResume方法中也要避免做耗時操作。
感謝:
http://blog.csdn.net/linmiansheng/article/details/37728903
http://blog.csdn.net/u010687392/article/details/50518343
http://www.2cto.com/kf/201607/528367.html
http://www.jianshu.com/p/0b0d6f684580
轉載于:https://www.cnblogs.com/qitian1/p/6461494.html
總結
以上是生活随笔為你收集整理的Android开发——Android系统启动以及APK安装、启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1405 树的距离之和
- 下一篇: Android开发环境(IDE)