`
dengzhangtao
  • 浏览: 679202 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android4.0 进程回收机制

阅读更多
Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收.
由此带来三个问题:
l 回收规则:  什么时候回收与回收哪一个
l 避免误杀:  如何阻止被回收
l 数据恢复与保存:  被回收了怎么办

Android将进程分为6个等级,它们按优先级顺序由高到低
依次是:
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3. 次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)

特征:
1.如果一个进程里面同时包含service和可视的activity,那么这个进程应该归于可视进程,而不是service进程.
2.另外,如果其他进程依赖于它的话,一个进程的等级可以提高.例如,一个A进程里的service被绑定到B进程里的组件上,进程A将总被认为至少和B进程一样重要.
3.系统中的phone服务被划分到前台进程而不是次要服务
进程.
android4.0的ProcessList.java中
    static final int HIDDEN_APP_MAX_ADJ = 15;
    static int HIDDEN_APP_MIN_ADJ = 9;
    static final int SERVICE_B_ADJ = 8;
    static final int PREVIOUS_APP_ADJ = 7;
    static final int HOME_APP_ADJ = 6;
    static final int SERVICE_ADJ = 5;
    static final int BACKUP_APP_ADJ = 4;
    static final int HEAVY_WEIGHT_APP_ADJ = 3;
    static final int PERCEPTIBLE_APP_ADJ = 2;
    static final int VISIBLE_APP_ADJ = 1;
    static final int FOREGROUND_APP_ADJ = 0;
    static final int PERSISTENT_PROC_ADJ = -12;
    static final int SYSTEM_ADJ = -16;
    static final int MIN_HIDDEN_APPS = 2;
    static final int MAX_HIDDEN_APPS = 15;

在android中以进程的oom_adj值也就代表了它的优先级.
oom_adj值越高代表该进程优先级越低.

回收时机:
private final int[] mOomAdj = new int[] {
            FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ,
            BACKUP_APP_ADJ, HIDDEN_APP_MIN_ADJ, HIDDEN_APP_MAX_ADJ
    };
// HVGA or smaller phone with less than 512MB.  Values are in KB.
    private final long[] mOomMinFreeLow = new long[] {
            8192, 12288, 16384,
            24576, 28672, 32768
    };
    // These are the high-end OOM level limits.  This is appropriate for a
    // 1280x800 or larger screen with around 1GB RAM.  Values are in KB.
    private final long[] mOomMinFreeHigh = new long[] {
            32768, 40960, 49152,
            57344, 65536, 81920
    };
通过计算最大和最小值,得出8084,10114,12144,14192,16222,20264
对应的mOomAdj里成员的内存阈值,一旦低于该值,Android
便开始按顺序关闭相应的进程 .
同时把计算结果保存在
cat /sys/module/lowmemorykiller/parameters/minfree


具体的回收实现在ActivityManagerService.java中的函
数trimApplications()
1.首先移除package被移走的无用进程.
2.基于进程当前状态,更新oom_adj值,然后进行以下操作.
l移除没有activity在运行的进程
l如果AP已经保存了所有的activity状态,结束这个AP.
3.最后,如果目前还是有很多activities 在运行,那么移除那些activity状态已经保存好的activity.
更新oom_adj的值

Android kernel中的low memory killer
Android的Low Memory Killer根据需要(当系统内存短
缺时)杀死进程释放其内存,源代码在
kernel/drivers/misc/lowmemorykiller.c
简单说就是寻找一个最合适的进程杀死,从而释放
它占用的内存.
最合适:
•oom_adj越大
•占用物理内存越多

一旦一个进程被选中,内核会发送SIGKILL信号将之杀死.
for_each_process(p) {
……
if(selected == NULL ||   p->oomkilladj > selected->oomkilladj ||
   (p->oomkilladj == selected->oomkilladj &&
tasksize > selected_tasksize))
{
selected = p;
}
}
if(selected != NULL) {
force_sig(SIGKILL, selected);
}

查看LRU列表:Adb shell dumpsys activity
当activitydemo在前台时:

包含Service的进程的优先级比较高,在computeOomAdjLocked
中将其分为了两小类:
static final int MAX_SERVICE_INACTIVITY = 30*60*1000;                 
if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if (adj > SECONDARY_SERVER_ADJ) {
                            adj = SECONDARY_SERVER_ADJ;
                            app.adjType = "started-services";
                            app.hidden = false;
                        }
                    }
if (adj > SECONDARY_SERVER_ADJ) {
                        app.adjType = "started-bg-services";
                    }
}

完全让进程不被kill是不可能的,我们可以通过一些操作
,使进程被kill的几率变小:
1.提高进程的优先级:
l后台操作采用Service形式,因为一个运行着service的进程比一个运行着后台activity的等级高。
l按back键使得进程中的activity在后台运行而不是destory,需重载back按键(没有任何activity在运行的进程优先被杀).
l依赖于其他优先级高的进程.

强制修改进程属性:
•在程序中设置setPersistent(true);
•在project的AndroidManifest.xml的<application>中加入属性android:persistent="true"
android:persistent(SDK)
    Whether or not the application should remain running at all times . The default value is "false". Applications should not normally set this flag; persistence mode is intended only for certain system applications(phone,system).

1.使用killProcess (int pid)可以杀死指定PID的进程
public void onClick(View v) {                
   android.os.Process.killProcess(android.os.Process.myPid());
}

使用System.exit(0);可以达到同样的效果.

2.使用finish()可以杀死当前的activity

1. 保存资料:最好在每次Activity 运行到onPause或
onStop状态时先保存资料,然后在onCreate时将资
料读出来(生命周期方法).
2. OnSaveInstanceState(非生命周期方法)
onRestoreInstanceState
0
1
分享到:
评论

相关推荐

    android4.0源代码

    通过关联这个源代码到Eclipse或Android Studio,开发者可以深入研究Android API的内部机制,调试问题,优化性能,甚至为Android系统做出贡献。这对于提升开发技能,解决复杂问题,以及创建高效能的应用程序都极其...

    android 4.0 source 源码

    本篇文章将围绕Android 4.0源码展开,揭示其内部工作机制,帮助开发者更好地理解和利用源码进行程序编写。 一、源码的用途与价值 在Android开发中,查看源码能够帮助开发者: 1. **理解API工作原理**:源码是API的...

    android4.0源代码下载地址

    ### Android 4.0 源代码下载及解析 #### Android 概述 Android 是一个基于 Linux 内核的开放源代码操作系统,主要用于各种移动设备,如智能手机和平板电脑等。自 2003 年由 Andy Rubin 开发以来,Android 经历了多...

    android4.0 Browser 浏览器 源码

    6. **多进程架构**:为了提高稳定性,Android 4.0 Browser采用了多进程架构,将渲染引擎放在单独的进程中运行,防止网页崩溃影响整个应用。 7. **缓存机制**:Browser使用本地缓存来加快页面加载速度,源码中可以...

    android4.0_Browser

    这个压缩包文件“android4.0_Browser”很可能包含与Android 4.0浏览器相关的源代码、资源文件和其他开发文档,帮助开发者理解和改进这个版本的浏览器。 Android 4.0浏览器采用了WebKit渲染引擎,WebKit是开源项目,...

    最新的Android4.0模拟器教程.doc

    ### 最新的Android 4.0模拟器安装与使用教程 #### 一、前言 随着移动互联网技术的发展,Android系统已成为智能手机市场的主导力量之一。为了更好地进行应用开发、测试及用户体验,开发者通常需要借助模拟器来模拟...

    android4.0

    【Android 4.0 系统详解】 Android 4.0,代号"Ice Cream Sandwich"(冰淇淋三明治),是Google在2011年推出的一个重要版本,旨在为智能手机和平板电脑提供统一的操作系统体验。这个版本的发布标志着Android系统在...

    android4.0camera源码

    在Android 4.0(Ice Cream Sandwich)系统中,Camera模块是系统的重要组成部分,它为开发者提供了丰富的功能,包括拍照、录制视频、设置参数等。本文将深入探讨Android 4.0 Camera源码中的关键知识点。 一、Camera...

    Android 4.0 网络编程详解 王家林.pdf

    在Android 4.0中,开发者可以使用AsyncTask、HandlerThread、IntentService等机制来管理网络线程。 8. 网络安全性:随着网络应用的广泛普及,网络安全越来越受到重视。Android 4.0提供了SSL/TLS支持,开发者可以...

    android 4.0系统自带图标

    在Android 4.0(Ice Cream Sandwich,简称ICS)系统中,设计团队为用户带来了全新的图标设计风格,旨在提供更加统一、现代且易识别的视觉体验。这个压缩包文件"android 4.0系统自带图标"显然是包含了这一版本系统中...

    android4.0 日历源码

    以下是关于"android4.0 日历源码Calendar"的一些关键知识点: 1. **日历服务(Calendar Service)** - Android中的日历服务由`com.android.calendar`包下的`CalendarProvider2`类提供,它是Android系统的Content ...

    《细说Android 4.0 NDK编程》PDF

    《细说Android 4.0 NDK编程》是一本深入探讨Android Native Development Kit(NDK)的书籍,专为Android开发者提供关于NDK使用的详细指南。NDK是Google推出的一个工具集,允许开发者使用C/C++等原生代码在Android...

    android 4.0源码下载repo

    对于Android 4.0(也称为Ice Cream Sandwich,简称ICS),了解如何下载源码是开发者和研究者的基础工作。本文将详细介绍如何使用`repo`工具下载Android 4.0的源码。 首先,`repo`是一个由Google开发的Python脚本,...

    android 4.0 ics src 安卓 4.0 源代码

    4. **应用程序框架**:这部分源代码定义了Android应用程序的结构和行为,如Android运行时(ART)、Android应用程序组件模型、Intent机制等。开发者可以通过这些接口构建自己的应用程序。 5. **UI框架**:Android ...

    Axure组件库(android4.0 android4.4)

    本资源包含的" Axure组件库(android4.0 android4.4)"是专为设计Android系统应用原型而准备的,涵盖了Android 4.0(冰淇淋三明治)和4.4(奇巧)两个版本的界面元素。 Android 4.0(Holo Dark)组件库:这个库包含...

    android4.0测试代码

    在Android 4.0(代号Ice Cream Sandwich,简称ICS)时代,测试代码的重要性得到了显著提升,因为这个版本引入了许多新特性和优化,为开发者带来了更丰富的功能和更好的用户体验。以下是一些关于Android 4.0测试代码...

    android4.0sdk源码

    《深入剖析Android 4.0 SDK源码》 Android 4.0,也被称为Ice Cream Sandwich(ICS),是Google发布的一个重要版本,为移动设备带来了许多新的特性和改进。源码是理解Android系统运行机制的关键,它揭示了操作系统...

    android4.0 Launcher2

    本文将围绕"android4.0 Launcher2"这一主题,深入探讨其关键知识点。 一、Launcher2概述 Launcher2是在Android 4.0系统中默认的启动器,负责管理应用程序的快捷方式和小部件。它是一个基于组件的系统服务,运行在...

    android 4.0源码

    1. **Linux内核**:作为Android的基础,Linux内核提供了设备驱动、内存管理、进程调度等功能。在Android 4.0中,内核可能已经针对当时的硬件进行了优化,支持多核处理器,提高了设备的性能和能效。 2. **HAL(硬件...

Global site tag (gtag.js) - Google Analytics