### **概述**
Android系統里面的應用程序進程有一個特點,那就是它們是被系統托管的。也就是說,系統根據需要來創建進程以及回收進程。進程創建發生在組件啟動時,它們是由Zygote進程負責創建。Zygote進程是由系統中的第一個進程init負責啟動。此外,用來運行各種系統服務的System Server進程也是由Zygote進程創建的。進程回收發生在內存緊張時,由Low Memory Killer執行。此外,組件管理服務ActivityManagerService和窗口管理服務WindowManagerService也會在適當的時候主動進行進程回收。每一個應用程序進程根據運行情況被賦予優先級,當需要回收進程的時候,就按照優先級從低到高的順序進行回收。
主要講Android應用程序進程的啟動和回收,主要涉及到Zygote進程、System Server進程,以及組件管理服務ActivityManagerService、窗口服務WindowManagerService,還有專用驅動Low Memory Killer。通過了解Android系統對應用程序進程的管理,我們就能更清楚應用程序的運行機制。
* Android系統啟動概述
* Zygote進程啟動過程分析
* System Server進程啟動過程分析
* Android應用程序進程啟動過程分析
* Android應用程序進程回收機制
#### **Android系統啟動概述**

#### **Zygote進程啟動過程分析**
**Zygote進程由Init進程啟動**

* 加載文件:/system/app_process
* --start-system-server:啟動System Server進程
* 創建名稱為zygote的socket:用來和ActivityManagerService通信
**app_process**

**AndroidRuntime::start**

**啟動Dalvik虛擬機**
* 創建一個Dalvik虛擬機實例
* 加載Java核心類及其JNI方法
* 初始化主線程的JNI環境
**加載部分Android核心類及其JNI方法**
* android.os.*
* android.graphics.*
* android.opengl.*
* android.hardware.*
* android.media.*
* ……
**ZygoteInit.main**

**Preload Classes**
* 參考frameworks/base/preloaded-classes文件
* android.accounts.*
* android.app.*
* android.view.*
* ……

**Preload Drawables**
* 參考frameworks/base/core/res/res/values$/arrays.xml文件
* @drawable/toast_frame_holo
* @drawable/btn_check_on_pressed_holo_light
* @drawable/btn_check_on_pressed_holo_dark
* ……

**Preload Color State List**
* 參考frameworks/base/core/res/res/values$/arrays.xml文件
* @color/primary_text_dark
* @color/primary_text_dark_disable_only
* @color/primary_text_dark_nodisable
* ……

**runSelectLoopMode**

**Zygote進程啟動完成后的地址空間**

#### **System Server進程啟動過程分析**
**Zygote在啟動的過程中創建System Server進程**

**startSystemServer**

**備注**
用戶組ID定義參考system/core/include/private/android_filesystem_config.h
Capability權限定義參考kernel/goldfish/include/linux/capability.h
**handleSystemServerProcess**

**RuntimeInit.zygoteInit**

**nativeZygoteInit--啟動Binder線程池**


**applicationInit—調用SystemServer.main**

**SystemServer.main**

**Init1—啟動C/C++ Rutime Framework Service**

**Init2—啟動Java Runtime Framework Service**

**ServerThread.run**

**System Server進程啟動完成后的地址空間**

#### **Android應用程序進程啟動過程分析**
**ActivityManagerService.startProcessLocked**

**Process.start**

**Process.startViaZygote**

**Process.zygoteSendArgsAndGetResult**

**ZygoteConnection.runOnce**

**ZygoteConnection.handleChildProc**

**RuntimeInit.zygoteInit**
* nativeZygoteInit
* applicationInit
* Invoke main of ActivityThread
**ActivityThread.main**

#### **Android應用程序進程回收機制**
**Linux的內存回收機制--Out of Memory Killer**
* 每一個進程都有一個oom_adj值,取值范圍[-17,15],可以通過`/proc/<pid>/oom_a`dj訪問
* 每一個進程的oom_adj初始值都等于其父進程的oom_adj值
* oom_adj值越小,越不容易被殺死,其中,-17表示不會被殺死
* 內存緊張時,OOM Killer綜合進程的內存消耗量、CPU時間、存活時間和oom_adj值來決定是否要殺死一個進程來回收內存
**備注**:
oom_adj值定義可以參考kernel/goldfish/include/linux/oom.h
**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
**注意**:
android: cantSaveState保存在ApplicationInfo中,ApplicationInfo由PackageManagerService維護,應用程序不能修改
**ActivityManagerService在以下四種情況下會更新應用程序進程的oom_adj值,以及殺掉那些已經被卸載了的App所運行在的應用程序進程**
* activityStopped:停止Activity
* setProcessLimit:設置進程數量限制
* unregisterReceiver:注銷Broadcast Receiver
* ?finishReceiver:結束Broadcast Receiver
**WindowManagerService在處理窗口的過程中發生Out Of Memroy時,也會通知ActivityManagerService殺掉那些包含有窗口的應用程序進程**
- 前言
- Android組件設計思想
- Android源代碼開發和調試環境搭建
- Android源代碼下載和編譯
- Android源代碼情景分析法
- Android源代碼調試分析法
- 手把手教你為手機編譯ROM
- 在Ubuntu上下載、編譯和安裝Android最新源代碼
- 在Ubuntu上下載、編譯和安裝Android最新內核源代碼(Linux Kernel)
- 如何單獨編譯Android源代碼中的模塊
- 在Ubuntu上為Android系統編寫Linux內核驅動程序
- 在Ubuntu上為Android系統內置C可執行程序測試Linux內核驅動程序
- 在Ubuntu上為Android增加硬件抽象層(HAL)模塊訪問Linux內核驅動程序
- 在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問硬件服務接口
- 在Ubuntu上為Android系統的Application Frameworks層增加硬件訪問服務
- 在Ubuntu上為Android系統內置Java應用程序測試Application Frameworks層的硬件服務
- Android源代碼倉庫及其管理工具Repo分析
- Android編譯系統簡要介紹和學習計劃
- Android編譯系統環境初始化過程分析
- Android源代碼編譯命令m/mm/mmm/make分析
- Android系統鏡像文件的打包過程分析
- 從CM刷機過程和原理分析Android系統結構
- Android系統架構概述
- Android系統整體架構
- android專用驅動
- Android硬件抽象層HAL
- Android應用程序組件
- Android應用程序框架
- Android用戶界面架構
- Android虛擬機之Dalvik虛擬機
- Android硬件抽象層
- Android硬件抽象層(HAL)概要介紹和學習計劃
- Android專用驅動
- Android Logger驅動系統
- Android日志系統驅動程序Logger源代碼分析
- Android應用程序框架層和系統運行庫層日志系統源代碼分析
- Android日志系統Logcat源代碼簡要分析
- Android Binder驅動系統
- Android進程間通信(IPC)機制Binder簡要介紹和學習計劃
- 淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路
- 淺談Android系統進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路
- Android系統進程間通信(IPC)機制Binder中的Server啟動過程源代碼分析
- Android系統進程間通信(IPC)機制Binder中的Client獲得Server遠程接口過程源代碼分析
- Android系統進程間通信Binder機制在應用程序框架層的Java接口源代碼分析
- Android Ashmem驅動系統
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)驅動程序源代碼分析
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)在進程間共享的原理分析
- Android系統匿名共享內存(Anonymous Shared Memory)C++調用接口分析
- Android應用程序進程管理
- Android應用程序進程啟動過程的源代碼分析
- Android系統進程Zygote啟動過程的源代碼分析
- Android系統默認Home應用程序(Launcher)的啟動過程源代碼分析
- Android應用程序消息機制
- Android應用程序消息處理機制(Looper、Handler)分析
- Android應用程序線程消息循環模型分析
- Android應用程序輸入事件分發和處理機制
- Android應用程序鍵盤(Keyboard)消息處理機制分析
- Android應用程序UI架構
- Android系統的開機畫面顯示過程分析
- Android幀緩沖區(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現原理分析
- SurfaceFlinger
- Android系統Surface機制的SurfaceFlinger服務
- SurfaceFlinger服務簡要介紹和學習計劃
- 啟動過程分析
- 對幀緩沖區(Frame Buffer)的管理分析
- 線程模型分析
- 渲染應用程序UI的過程分析
- Android應用程序與SurfaceFlinger服務的關系
- 概述和學習計劃
- 連接過程分析
- 共享UI元數據(SharedClient)的創建過程分析
- 創建Surface的過程分析
- 渲染Surface的過程分析
- Android應用程序窗口(Activity)
- 實現框架簡要介紹和學習計劃
- 運行上下文環境(Context)的創建過程分析
- 窗口對象(Window)的創建過程分析
- 視圖對象(View)的創建過程分析
- 與WindowManagerService服務的連接過程分析
- 繪圖表面(Surface)的創建過程分析
- 測量(Measure)、布局(Layout)和繪制(Draw)過程分析
- WindowManagerService
- WindowManagerService的簡要介紹和學習計劃
- 計算Activity窗口大小的過程分析
- 對窗口的組織方式分析
- 對輸入法窗口(Input Method Window)的管理分析
- 對壁紙窗口(Wallpaper Window)的管理分析
- 計算窗口Z軸位置的過程分析
- 顯示Activity組件的啟動窗口(Starting Window)的過程分析
- 切換Activity窗口(App Transition)的過程分析
- 顯示窗口動畫的原理分析
- Android控件TextView的實現原理分析
- Android視圖SurfaceView的實現原理分析
- Android應用程序UI硬件加速渲染
- 簡要介紹和學習計劃
- 環境初始化過程分析
- 預加載資源地圖集服務(Asset Atlas Service)分析
- Display List構建過程分析
- Display List渲染過程分析
- 動畫執行過程分析
- Android應用程序資源管理框架
- Android資源管理框架(Asset Manager)
- Asset Manager 簡要介紹和學習計劃
- 編譯和打包過程分析
- Asset Manager的創建過程分析
- 查找過程分析
- Dalvik虛擬機和ART虛擬機
- Dalvik虛擬機
- Dalvik虛擬機簡要介紹和學習計劃
- Dalvik虛擬機的啟動過程分析
- Dalvik虛擬機的運行過程分析
- Dalvik虛擬機JNI方法的注冊過程分析
- Dalvik虛擬機進程和線程的創建過程分析
- Dalvik虛擬機垃圾收集機制簡要介紹和學習計劃
- Dalvik虛擬機Java堆創建過程分析
- Dalvik虛擬機為新創建對象分配內存的過程分析
- Dalvik虛擬機垃圾收集(GC)過程分析
- ART虛擬機
- Android ART運行時無縫替換Dalvik虛擬機的過程分析
- Android運行時ART簡要介紹和學習計劃
- Android運行時ART加載OAT文件的過程分析
- Android運行時ART加載類和方法的過程分析
- Android運行時ART執行類方法的過程分析
- ART運行時垃圾收集機制簡要介紹和學習計劃
- ART運行時Java堆創建過程分析
- ART運行時為新創建對象分配內存的過程分析
- ART運行時垃圾收集(GC)過程分析
- ART運行時Compacting GC簡要介紹和學習計劃
- ART運行時Compacting GC堆創建過程分析
- ART運行時Compacting GC為新創建對象分配內存的過程分析
- ART運行時Semi-Space(SS)和Generational Semi-Space(GSS)GC執行過程分析
- ART運行時Mark-Compact( MC)GC執行過程分析
- ART運行時Foreground GC和Background GC切換過程分析
- Android安全機制
- SEAndroid安全機制簡要介紹和學習計劃
- SEAndroid安全機制框架分析
- SEAndroid安全機制中的文件安全上下文關聯分析
- SEAndroid安全機制中的進程安全上下文關聯分析
- SEAndroid安全機制對Android屬性訪問的保護分析
- SEAndroid安全機制對Binder IPC的保護分析
- 從NDK在非Root手機上的調試原理探討Android的安全機制
- APK防反編譯
- Android視頻硬解穩定性問題探討和處理
- Android系統的智能指針(輕量級指針、強指針和弱指針)的實現原理分析
- Android應用程序安裝過程源代碼分析
- Android應用程序啟動過程源代碼分析
- 四大組件源代碼分析
- Activity
- Android應用程序的Activity啟動過程簡要介紹和學習計劃
- Android應用程序內部啟動Activity過程(startActivity)的源代碼分析
- 解開Android應用程序組件Activity的"singleTask"之謎
- Android應用程序在新的進程中啟動新的Activity的方法和過程分析
- Service
- Android應用程序綁定服務(bindService)的過程源代碼分析
- ContentProvider
- Android應用程序組件Content Provider簡要介紹和學習計劃
- Android應用程序組件Content Provider應用實例
- Android應用程序組件Content Provider的啟動過程源代碼分析
- Android應用程序組件Content Provider在應用程序之間共享數據的原理分析
- Android應用程序組件Content Provider的共享數據更新通知機制分析
- BroadcastReceiver
- Android系統中的廣播(Broadcast)機制簡要介紹和學習計劃
- Android應用程序注冊廣播接收器(registerReceiver)的過程分析
- Android應用程序發送廣播(sendBroadcast)的過程分析