Android進(jìn)程管理篇(一)-應(yīng)用進(jìn)程啟動過程

一、基本概念

Android本身是基于Linux系統(tǒng)的,在Linux系統(tǒng)中,用進(jìn)程描述一個運行的應(yīng)用程序,對應(yīng)于一個名叫task_struct的結(jié)構(gòu)體,由系統(tǒng)統(tǒng)一調(diào)度和管理。另外,進(jìn)程是系統(tǒng)資源分配的最小單位,各個進(jìn)程用戶空間虛擬地址相互隔離,如果要互相訪問需要通過進(jìn)程間通信,常見的包括Socket、Binder等。進(jìn)程內(nèi)部每一個執(zhí)行路徑是一個線程,線程共享進(jìn)程中分配到的系統(tǒng)資源。因此在Android系統(tǒng)中,要啟動一個應(yīng)用程序,首先需要啟動對應(yīng)的進(jìn)程,但是這個過程是framework層完成的,應(yīng)用層完全感知不到。

要想啟動一個應(yīng)用程序,首先要保證這個應(yīng)用程序所需要的應(yīng)用程序進(jìn)程已經(jīng)被啟動。ActivityManagerService在啟動應(yīng)用程序時會檢查這個應(yīng)用程序需要的應(yīng)用程序進(jìn)程是否存在,不存在就會請求Zygote進(jìn)程將需要的應(yīng)用程序進(jìn)程啟動。

二、應(yīng)用進(jìn)程啟動過程

這里就簡單講講流程了,不貼源碼,只梳理一些核心環(huán)節(jié),代碼細(xì)節(jié)可以根據(jù)時序圖去跟一下。

流程圖如下:

from liuwangshu

這個過程簡單講就兩步:AMS向Zygote請求創(chuàng)建進(jìn)程,Zygote孵化進(jìn)程。
流程簡單描述:
首先是調(diào)用AMS startProcessLocked方法開始,由Process包裝好進(jìn)程實例,準(zhǔn)備好參數(shù),包括uid、gid等等,然后通過socket與zygote通信,在zygote啟動篇我們知道,zygote初始化主要做了如下幾件事情:注冊socket、預(yù)加載系統(tǒng)類和資源(包括啟動虛擬機(jī))、啟動SystemServer、循環(huán)等待客戶端創(chuàng)建進(jìn)程請求。對,這個socket通信就是針對這個循環(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)境,同時fork也為進(jìn)程設(shè)置了pid。另外,在應(yīng)用程序進(jìn)程創(chuàng)建過程中會啟動Binder線程池,這部分之前在Binder篇有介紹。最后通過反射執(zhí)行ActivityThread的main方法,開始主線程的大loop循環(huán),開啟組件消息處理。

當(dāng)然這只是一個大概的流程,更多的細(xì)節(jié)的學(xué)習(xí)可以去分析下源碼。

系列文章:
Android進(jìn)程管理篇(一)-應(yīng)用進(jìn)程啟動過程
Android進(jìn)程管理篇(二)-進(jìn)程查殺方式總結(jié)
Android進(jìn)程管理篇(三)-AMS進(jìn)程調(diào)度
lowmemorykiller總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容