• 【转】Android进程机制


    以下资料摘录整理自老罗的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杀掉那些包含有窗口的应用程序进程
  • 相关阅读:
    Eclipse调试常用技巧
    12个小技巧,让你高效使用Eclipse
    Java程序生成exe可执行文件详细教程(图文说明)
    手机打开PDF文档中文英文支持(乱码问题)解决攻略
    Java修饰符public,private,protected及默认的区别
    Eclipse 各种小图标的含义
    continue break return的区别
    Android开发快速入门(环境配置、Android Studio安装)
    Struts2中的Unable to load configuration错误的分析与解决方法
    认识与入门 Markdown,Markdown教程
  • 原文地址:https://www.cnblogs.com/didiaoxiong/p/9144091.html
Copyright © 2020-2023  润新知