以下资料摘录整理自老罗的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进程机制的更多相关文章

  1. Android进程机制

    以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...

  2. android 进程/线程管理(一)----消息机制的框架

    一:android 进程和线程 进程是程序运行的一个实例.android通过4大主件,弱化了进程的概念,尤其是在app层面,基本不需要关系进程间的通信等问题. 但是程序的本质没有变,尤其是多任务系统, ...

  3. Android进程回收机制LMK(Low Memory Killer)

    熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系 ...

  4. android 进程/线程管理(四)续----消息机制的思考(自定义消息机制)

    继续分析handler 和looper 先看看handler的 public void dispatchMessage(Message msg) { if (msg.callback != null) ...

  5. android 进程/线程管理(四)----消息机制的思考(自定义消息机制)

    关于android消息机制 已经写了3篇文章了,想要结束这个系列,总觉得少了点什么? 于是我就在想,android为什么要这个设计消息机制,使用消息机制是现在操作系统基本都会有的特点. 可是andro ...

  6. 【朝花夕拾】Android性能篇之(六)Android进程管理机制

    前言        Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...

  7. Android内存管理篇 - 从updateOomAdjLocked看lowmemorykiller之外的Android进程回收机制

    提起android的进程回收机制,大家所熟知的是Android的lowmemroykiller的机制.当系统可用内存低于某个阀值时,即会杀死这个阀值对应的Adj值的所有应用.但是本篇文章并为是要介绍L ...

  8. android 进程间通信 messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯? android 消息机制 进程间 android 进程间 可以用 handler么 messenger 与 handler 机制 messenger 机制 是不是 就是 handler 机制 或 , 是不是就是 消息机制 android messenge

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯 ...

  9. Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

    在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...

随机推荐

  1. vmware Ubuntu忘记登录密码

    VMware Workstation 上的Ubuntu 11.10 登录时,用户密码忘记了,以下是我对此问题解决的方法: 1)重新启动Ubtuntu 16 系统,同时长时间按住(或连续点击)esc键进 ...

  2. Linux 进程等待队列【转】

    本文转载自:http://blog.csdn.net/dlutbrucezhang/article/details/9212067 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制 ...

  3. Dedecms(织梦)文章内容页和图片集内容页,调用缩略图的方法

    Dedecms(织梦)文章内容页和图片集内容页,调用缩略图的方法,亲测可用! Dedecms(织梦)首页的图片调用,相信大家已经非常的清楚,但是今天我在进行内容页的编写的时候,发现了内容页图片的调用问 ...

  4. poj 2406 Power Strings(kmp求一个串的重复子串)

    题意:重复子串次数 思路:kmp #include<iostream> #include<stdio.h> #include<string.h> using nam ...

  5. BZOJ_4423_[AMPPZ2013]Bytehattan_对偶图+并查集

    BZOJ_4423_[AMPPZ2013]Bytehattan_对偶图+并查集 Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的 ...

  6. 51Nod 1717

    链接 分析:对于任意一个数,它的约数总是成对出现的,但是对于完全平方数,它因为有两个约数不相等,所以只会出现奇数次,所以最终的结果就是减去完全平方数 #include "iostream&q ...

  7. 【SDOI2009】SuperGCD

    [题目链接] 点击打开链接 [算法] 1.关于求最大公约数的算法 若使用辗转相除法,那么显然会超时 不妨这样思考 : 要求gcd(a,b), 若a为偶数,b为偶数,则gcd(a,b) = 2 * gc ...

  8. 安卓开发eclipse如何导出项目

    安卓开发如何导出项目 方法/步骤   1 首先打开eclipse 2 选择file然后选择export 3 选择android application 4 点击next 5 选择项目browse可以更 ...

  9. merge和rebase

    git里面对于分支的合并处理其实有两种.合并与分基. 对于合并,非常简单.git merge [branch-name] 表示把目标分支合并进当前所在分支   至于分基,简单地讲就是换根.具体细节就不 ...

  10. 枚举与#define 宏的区别

    1),#define 宏常量是在预编译阶段进行简单替换.枚举常量则是在编译的时候确定其值.2),一般在编译器里,可以调试枚举常量,但是不能调试宏常量.3),枚举可以一次定义大量相关的常量,而#defi ...