如下資料摘錄整理自老羅的Android之旅博客,是對老羅的博客關於Android底層原理的一個抽象的知識歸納總結(若有錯誤歡迎指出)(侵刪):
http://blog.csdn.net/luoshengyang/article/details/8923485
http://blog.csdn.net/luoshengyang/article/details/12957169android
整理by Doing框架
Android系統啓動概覽
Zygote進程由Init進程啓動
在Linux系統中,全部的進程都是init進程的子孫進程,也就是說,全部的進程都是直接或者間接地由init進程fork出來的。Zygote進程也是在系統啓動的過程,由init進程
建立的。
- 系統啓動時init進程會建立Zygote進程,Zygote進程負責後續Android應用程序框架層的其它進程的建立和啓動工做。
- Zygote進程會首先建立一個SystemServer進程,SystemServer進程負責啓動系統的關鍵服務,如包管理服務PackageManagerService和應用程序組件管理服務ActivityManagerService。
- 當咱們須要啓動一個Android應用程序時,ActivityManagerService會經過Socket進程間通訊機制,通知Zygote進程爲這個應用程序建立一個新的進程。
Zygote進程啓動完成後的地址空間:
Android應用程序進程啓動過程
- 在Android系統中,全部的應用程序進程以及系統服務進程SystemServer都是由Zygote進程孕育(fork)出來的。
- 系統中的兩個重要服務PackageManagerService和ActivityManagerService,都是由SystemServer進程來負責啓動的,而SystemServer進程自己是Zygote進程在啓動的過程當中fork出來的。
- 當ActivityManagerService啓動一個應用程序的時候,就會經過Socket與Zygote進程進行通訊,請求它fork一個子進程出來做爲這個即將要啓動的應用程序的進程;
- ActivityManagerService組件通常會在什麼狀況下會爲應用程序建立一個新的進程呢?:當系統決定要在一個新的進程中啓動一個Activity或者Service時,它就會建立一個新的進程了,而後在這個新的進程中啓動這個Activity或者Service。
- Android應用程序進程啓動過程:指定新的進程的入口函數是ActivityThread的main函數;爲進程內的Binder對象提供了Binder進程間通訊機制的基礎設施(定義了Binder線程池:咱們在開發Android應用程序的時候,當咱們要和其它進程中進行通訊時,只要定義本身的Binder對象,而後把這個Binder對象的遠程接口經過其它途徑傳給其它進程後,其它進程就能夠經過這個Binder對象的遠程接口來調用咱們的應用程序進程的函數了)
System Server進程啓動完成後的地址空間:
Android應用程序進程回收機制
Linux的內存回收機制--
Out of Memory Killer
- 每個進程都有一個oom_adj值,取值範圍[-17,15],能夠經過/proc/<pid>/oom_adj訪問
- 每個進程的oom_adj初始值都等於其父進程的oom_adj值
- oom_adj值越小,越不容易被殺死,其中,-17表示不會被殺死
- 內存緊張時,OOM Killer綜合進程的內存消耗量、CPU時間、存活時間和oom_adj值來決定是否要殺死一個進程來回收內存
Android的內存回收機制—
Low Memory Killer
- 進程的oom_adj值由ActivityManagerService根據運行在進程裏面的組件的狀態來計算
- 進程的oom_adj值取值範圍爲[-16,15], oom_adj值越小,就不容易被殺死
- 內存緊張時, LMK基於oom_adj值來決定是否要回收一個進程
- ActivityManagerService和WindowManagerService在特定狀況下也會進行進程回收
- LMK的進程回收策略:當系統內存小於i時,在oom_adj值大於等於j的進程中,選擇一個oom_adj值最大而且消耗內存最多的進程來回收
應用程序進程的oom_adj值:
- SYSTEM_ADJ(-16):System Server進程
- PERSISTENT_PROC_ADJ(-12):android:persistent屬性爲true的系統App進程,如PhoneApp
- FOREGROUND_APP_ADJ(0):包含前臺Activity的進程
- VISIBLE_APP_ADJ(1):包含可見Activity的進程
- PERCEPTIBLE_APP_ADJ(2):包含狀態爲Pausing、Paused、Stopping的Activity的進程,以及運行有Foreground Service的進程
- HEAVY_WEIGHT_APP_ADJ(3):重量級進程, android: cantSaveState屬性爲true的進程,目前還不開放
- BACKUP_APP_ADJ(4):正在執行備份操做的進程
- SERVICE_ADJ(5):最近有活動的Service進程
- HOME_APP_ADJ(6):HomeApp進程
- PREVIOUS_APP_ADJ(7):前一個App運行在的進程
- SERVICE_B_ADJ(8):SERVICE_ADJ進程數量達到必定值時,最近最不活動的Service進程
- HIDDEN_APP_MIN_ADJ(9)和HIDDEN_APP_MAX_ADJ(15):含有不可見Activity的進程,根據LRU原則賦予[9,15]中的一個值
- Init進程的oom_adj值被設置爲-16,由Init進程所啓動的daemon和service進程的oom_adj值也等於-16
- 若是運行在進程A中的Content Provider或者Service被綁定到進程B,而且進程B的oom_adj值比進程A的oom_adj小,那麼進程A的oom_adj值就會被設置爲進程B的oom_adj值,可是不能小於FOREGROUND_APP_ADJ
ActivityManagerService在如下四種狀況下會更新應用程序進程的oom_adj值,以及殺掉那些已經被卸載了的App所運行在的應用程序進程:
- activityStopped:中止Activity
- setProcessLimit:設置進程數量限制
- unregisterReceiver:註銷Broadcast Receiver
- finishReceiver:結束Broadcast Receiver
WindowManagerService在處理窗口的過程當中發生Out Of Memroy時,也會通知ActivityManagerService殺掉那些包含有窗口的應用程序進程