【轉】Android進程機制

來源:互聯網
上載者:User

標籤:system   ssl   包含   alt   reg   socket   broadcast   nis   特定   

以下資料摘錄整理自老羅的Android之旅部落格,是對老羅的部落格關於Android底層原理的一個抽象的知識概括總結(如有錯誤歡迎指出)(侵刪):
http://blog.csdn.net/luoshengyang/article/details/8923485
http://blog.csdn.net/luoshengyang/article/details/12957169

 整理by Doing

Android系統啟動概覽  Zygote進程由Init進程啟動        在Linux系統中,所有的進程都是init進程的子孫進程,也就是說,所有的進程都是直接或者間接地由init進程fork出來的。Zygote進程也是在系統啟動的過程,由init進程建立的。
  1. 系統啟動時init進程會建立Zygote進程,Zygote進程負責後續Android應用程式架構層的其它進程的建立和啟動工作。
  2.  Zygote進程會首先建立一個SystemServer進程,SystemServer進程負責啟動系統的關鍵服務,如包管理服務PackageManagerService和應用程式組件管理服務ActivityManagerService。
  3. 當我們需要啟動一個Android應用程式時,ActivityManagerService會通過Socket處理序間通訊機制,通知Zygote進程為這個應用程式建立一個新的進程。
 Zygote進程啟動完成後的地址空間:  Android應用程式進程啟動過程
  1. 在Android系統中,所有的應用程式進程以及系統服務進程SystemServer都是由Zygote進程孕育(fork)出來的。
  2. 系統中的兩個重要服務PackageManagerService和ActivityManagerService,都是由SystemServer進程來負責啟動的,而SystemServer進程本身是Zygote進程在啟動的過程中fork出來的。
  3. 當ActivityManagerService啟動一個應用程式的時候,就會通過Socket與Zygote進程進行通訊,請求它fork一個子進程出來作為這個即將要啟動的應用程式的進程;
  4.  ActivityManagerService組件一般會在什麼情況下會為應用程式建立一個新的進程呢?:當系統決定要在一個新的進程中啟動一個Activity或者Service時,它就會建立一個新的進程了,然後在這個新的進程中啟動這個Activity或者Service。
  5. Android應用程式進程啟動過程:指定新的進程的入口函數是ActivityThread的main函數;為進程內的Binder對象提供了Binder處理序間通訊機制的基礎設施(定義了Binder線程池:我們在開發Android應用程式的時候,當我們要和其它進程中進行通訊時,只要定義自己的Binder對象,然後把這個Binder對象的遠程介面通過其它途徑傳給其它進程後,其它進程就可以通過這個Binder對象的遠程介面來調用我們的應用程式進程的函數了)
 System Server進程啟動完成後的地址空間:  Android應用程式進程回收機制Linux的記憶體回收機制-- Out of Memory Killer
  1. 每一個進程都有一個oom_adj值,取值範圍[-17,15],可以通過/proc/<pid>/oom_adj訪問
  2. 每一個進程的oom_adj初始值都等於其父進程的oom_adj值
  3. oom_adj值越小,越不容易被殺死,其中,-17表示不會被殺死
  4. 記憶體緊張時,OOM Killer綜合進程的記憶體消耗量、CPU時間、存活時間和oom_adj值來決定是否要殺死一個進程來回收記憶體
 Android的記憶體回收機制— Low Memory Killer
  1. 進程的oom_adj值由ActivityManagerService根據運行在進程裡面的組件的狀態來計算
  2. 進程的oom_adj值取值範圍為[-16,15], oom_adj值越小,就不容易被殺死
  3. 記憶體緊張時, LMK基於oom_adj值來決定是否要回收一個進程
  4. ActivityManagerService和WindowManagerService在特定情況下也會進行進程回收
  5. 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殺掉那些包含有視窗的應用程式進程

【轉】Android進程機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.