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