一瞧毙、基本概念
Android本身是基于Linux系統(tǒng)的,在Linux系統(tǒng)中寄症,用進(jìn)程描述一個(gè)運(yùn)行的應(yīng)用程序宙彪,對應(yīng)于一個(gè)名叫task_struct的結(jié)構(gòu)體,由系統(tǒng)統(tǒng)一調(diào)度和管理有巧。另外释漆,進(jìn)程是系統(tǒng)資源分配的最小單位,各個(gè)進(jìn)程用戶空間虛擬地址相互隔離篮迎,如果要互相訪問需要通過進(jìn)程間通信男图,常見的包括Socket、Binder等甜橱。進(jìn)程內(nèi)部每一個(gè)執(zhí)行路徑是一個(gè)線程逊笆,線程共享進(jìn)程中分配到的系統(tǒng)資源。因此在Android系統(tǒng)中岂傲,要啟動(dòng)一個(gè)應(yīng)用程序难裆,首先需要啟動(dòng)對應(yīng)的進(jìn)程,但是這個(gè)過程是framework層完成的譬胎,應(yīng)用層完全感知不到差牛。
要想啟動(dòng)一個(gè)應(yīng)用程序,首先要保證這個(gè)應(yīng)用程序所需要的應(yīng)用程序進(jìn)程已經(jīng)被啟動(dòng)堰乔。ActivityManagerService在啟動(dòng)應(yīng)用程序時(shí)會(huì)檢查這個(gè)應(yīng)用程序需要的應(yīng)用程序進(jìn)程是否存在偏化,不存在就會(huì)請求Zygote進(jìn)程將需要的應(yīng)用程序進(jìn)程啟動(dòng)。
二镐侯、應(yīng)用進(jìn)程啟動(dòng)過程
這里就簡單講講流程了侦讨,不貼源碼,只梳理一些核心環(huán)節(jié)苟翻,代碼細(xì)節(jié)可以根據(jù)時(shí)序圖去跟一下韵卤。
流程圖如下:
這個(gè)過程簡單講就兩步:AMS向Zygote請求創(chuàng)建進(jìn)程,Zygote孵化進(jìn)程崇猫。
流程簡單描述:
首先是調(diào)用AMS startProcessLocked方法開始沈条,由Process包裝好進(jìn)程實(shí)例,準(zhǔn)備好參數(shù)诅炉,包括uid蜡歹、gid等等,然后通過socket與zygote通信涕烧,在zygote啟動(dòng)篇我們知道月而,zygote初始化主要做了如下幾件事情:注冊socket、預(yù)加載系統(tǒng)類和資源(包括啟動(dòng)虛擬機(jī))议纯、啟動(dòng)SystemServer父款、循環(huán)等待客戶端創(chuàng)建進(jìn)程請求。對瞻凤,這個(gè)socket通信就是針對這個(gè)循環(huán)憨攒,對應(yīng)的方法是:runSelectLoop。最終通過Process包裝的進(jìn)程信息來fork出應(yīng)用進(jìn)程鲫构,fork就是zygote 復(fù)制自己的一份內(nèi)存拷貝給對應(yīng)進(jìn)程浓恶,內(nèi)部包括系統(tǒng)預(yù)加載的資源和類也包括虛擬機(jī)環(huán)境,同時(shí)fork也為進(jìn)程設(shè)置了pid结笨。另外包晰,在應(yīng)用程序進(jìn)程創(chuàng)建過程中會(huì)啟動(dòng)Binder線程池,這部分之前在Binder篇有介紹炕吸。最后通過反射執(zhí)行ActivityThread的main方法伐憾,開始主線程的大loop循環(huán),開啟組件消息處理赫模。
當(dāng)然這只是一個(gè)大概的流程树肃,更多的細(xì)節(jié)的學(xué)習(xí)可以去分析下源碼。
系列文章:
Android進(jìn)程管理篇(一)-應(yīng)用進(jìn)程啟動(dòng)過程
Android進(jìn)程管理篇(二)-進(jìn)程查殺方式總結(jié)
Android進(jìn)程管理篇(三)-AMS進(jìn)程調(diào)度
lowmemorykiller總結(jié)