• 【转】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杀掉那些包含有窗口的应用程序进程
  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/didiaoxiong/p/9144091.html
Copyright © 2020-2023  润新知