### **概述**
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系统启动概述**
![](https://box.kancloud.cn/645e9c852b0f6a8589b988fa74d363a4_654x574.jpg)
#### **Zygote进程启动过程分析**
**Zygote进程由Init进程启动**
![](https://box.kancloud.cn/09c3c00db3db5d603e73be7b9c703a54_645x142.png)
* 加载文件:/system/app_process
* --start-system-server:启动System Server进程
* 创建名称为zygote的socket:用来和ActivityManagerService通信
**app_process**
![](https://box.kancloud.cn/8d48058d23772392e460f8030809b43e_519x304.png)
**AndroidRuntime::start**
![](https://box.kancloud.cn/6ee694ef0f6eddd177a6ea921f94ff19_599x511.png)
**启动Dalvik虚拟机**
* 创建一个Dalvik虚拟机实例
* 加载Java核心类及其JNI方法
* 初始化主线程的JNI环境
**加载部分Android核心类及其JNI方法**
* android.os.*
* android.graphics.*
* android.opengl.*
* android.hardware.*
* android.media.*
* ……
**ZygoteInit.main**
![](https://box.kancloud.cn/ec79009573d4dad2ee87a99bbbc074f2_455x433.png)
**Preload Classes**
* 参考frameworks/base/preloaded-classes文件
* android.accounts.*
* android.app.*
* android.view.*
* ……
![](https://box.kancloud.cn/0546d509c4350bafba5af7450d44ce73_645x358.png)
**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
* ……
![](https://box.kancloud.cn/ccc4077543342863d109796d135de604_644x362.png)
**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
* ……
![](https://box.kancloud.cn/07dbe665b359697928bee34030265864_644x351.png)
**runSelectLoopMode**
![](https://box.kancloud.cn/57777c0cba975060a3c84b2aeef345e5_556x561.png)
**Zygote进程启动完成后的地址空间**
![](https://box.kancloud.cn/80e15f559f49997ed9ae57eff6dace18_591x447.png)
#### **System Server进程启动过程分析**
**Zygote在启动的过程中创建System Server进程**
![](https://box.kancloud.cn/41fe6a64c19d5dec909ddd237b73ee1d_455x433.png)
**startSystemServer**
![](https://box.kancloud.cn/b2bfa15b915443cd2720296023330750_753x564.png)
**备注**
用户组ID定义参考system/core/include/private/android_filesystem_config.h
Capability权限定义参考kernel/goldfish/include/linux/capability.h
**handleSystemServerProcess**
![](https://box.kancloud.cn/4a2a8bf4306efb417f7370bb74bc88f8_884x431.png)
**RuntimeInit.zygoteInit**
![](https://box.kancloud.cn/0df5b6e1c59f6bdf3b6baab6baf9c590_695x185.png)
**nativeZygoteInit--启动Binder线程池**
![](https://box.kancloud.cn/76b1a1d777c548e15310ef7a17bbff36_841x70.png)
![](https://box.kancloud.cn/f271357457d502cd24efb9e5435eb924_512x242.png)
**applicationInit—调用SystemServer.main**
![](https://box.kancloud.cn/7c820776e1f920ebc3890235c7190541_703x358.png)
**SystemServer.main**
![](https://box.kancloud.cn/50a258cfc64516c90c30668b859210a3_452x190.png)
**Init1—启动C/C++ Rutime Framework Service**
![](https://box.kancloud.cn/5584d00313d6410a1787d005df26cc72_556x564.png)
**Init2—启动Java Runtime Framework Service**
![](https://box.kancloud.cn/40f79adb2fcad60ae59887192011c571_490x198.png)
**ServerThread.run**
![](https://box.kancloud.cn/c94e0ec28b620f8f99264e0303092959_614x533.png)
**System Server进程启动完成后的地址空间**
![](https://box.kancloud.cn/3508c7c8e1fe9fb500b6d2e1d5d949f2_675x465.png)
#### **Android应用程序进程启动过程分析**
**ActivityManagerService.startProcessLocked**
![](https://box.kancloud.cn/a92b45a7de116e86a1e1799f0f44a9a8_695x556.png)
**Process.start**
![](https://box.kancloud.cn/66e4361b6275323d946789054fe9f383_690x338.png)
**Process.startViaZygote**
![](https://box.kancloud.cn/b4bf6ed73eb846dd10a07ec89d3691e7_652x558.png)
**Process.zygoteSendArgsAndGetResult**
![](https://box.kancloud.cn/97d2c2b39ed1bf96db82fc7b684f70ac_629x527.png)
**ZygoteConnection.runOnce**
![](https://box.kancloud.cn/1bc4a18848ad3401cfa82e9c58c1e67f_682x559.png)
**ZygoteConnection.handleChildProc**
![](https://box.kancloud.cn/1b2c78950a039f17dddb6618f17d530a_794x309.png)
**RuntimeInit.zygoteInit**
* nativeZygoteInit
* applicationInit
* Invoke main of ActivityThread
**ActivityThread.main**
![](https://box.kancloud.cn/754b52ab968f4ebb332f41d3b9889497_684x273.png)
#### **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值最大并且消耗内存最多的进程来回收
![](https://box.kancloud.cn/2d71992bf1b34112c5419c2c4b8326ca_685x366.png)
* 应用程序进程的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)的过程分析