欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa
说明
在上一篇中介绍了“垃圾清理”,在系统优化中有一个功能往往是与垃圾清理分不开的,那就是“手机加速”。目前流行的管理软件中以及网络上并没有明确的定义什么叫“垃圾清理”什么叫“手机加速”。结合上一篇的“垃圾清理”这里统一做一个在本系列文章中的定义:
n 垃圾清理:在本系列文章中认为扫描和清理的是静态内容,包括应用的文件缓存、缩略图、日志等系统或应用创建的文件,这些文件不具有“运行时”特征。
n 手机加速:在本系列文章中认为清理的是动态内容,包括杀死运行时进程、限制开机自启动、限制后台自启动,以及应用运行时所占用的内存等,这些内容都与进程相关,具有“运行时”特征。
在对垃圾清理和手机加速做了简单的区分以后,本篇接下来将研究一下手机加速的相关内容。
清理运行时进程
清理运行时进程也就是清理后台进程,有些手机管理软件中也叫“一键加速”或者“一键清理”等,其实指的都是这个功能。
在正式介绍介绍进程清理之前,先简单介绍一些Android中进程的内存管理策略。
Android内存管理策略
Android中,进程的生命周期都是由系统控制的,即使用户关掉了程序,进程依然是存在于内存之中。这样设计的目的是为了下次能快速启动。当然,随着系统运行时间的增长,内存会越来越少。Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。
在Android对内存管理引入了Linux中使用的一种名称为OOM(Out Of Memory,内存不足)的机制来完成这个任务,该机制会在系统内存不足的情况下,选择一个进程并将其Kill掉。在Android中对Linux原生的OOM机制根据嵌入式设备的特点进行了一些改造,于是就有了Low Memory Killer。
内存管理不是本文的重点,想了解Low Memory Killer的朋友可以自己查阅相关资料或者查看源码,这里不做详细介绍。Low Memory Killer在源码中的位置为:@/kernel/goldfish/drivers/staging/android/lowmemorykiller.c。这里要明确的问题由两点:
A. Low Memory Killer在用户空间中指定了一组内存临界值,当其中的某个值与进程描述中的oom_adj值在同一范围时,该进程将被Kill掉。
B. Android中的oom相关参数在init.rc中进行初始化配置,在系统运行时由ActivityManagerService进行动态调整。
Android进程优先级
根据oom_adj,Android将进程分为6个等级,它们按优先级顺序由高到低依次是:
1) 前台进程( FOREGROUND_APP)
2) 可视进程(VISIBLE_APP )
3) 次要服务进程(SECONDARY_SERVER )
4) 后台进程 (HIDDEN_APP)
5) 内容供应节点(CONTENT_PROVIDER)
6) 空进程(EMPTY_APP)
这六类进程所对应的oom_adj的值在不同的手机中可能会有所不同。下面是在我的小米2S手机上的参数如下:
注意值越大说明进程重要程度越低。
在我的小米2S上这几种进程会被杀死的时机如下:
注意这些数字的单位是page. 1 page = 4 kB。
对于单个进程的oom_adj的值可以查看/proc/pid/oom_adj的值,如下:
清理运行时进程
在简单的了解了Android对进程和内存的管理策略以后,我们会发现这样一个问题:Android中的Low Memory Killer策略会定时扫描,并根据其策略选择杀死进程的。那能给我们清理运行时进程带来什么参考呢?
我们在杀死运行时进程的一种可行性方案:可以根据oom_adj的值制定一个阀值,在用户触发(当然也可以定时触发)时,判断如果进程的oom_adj的值大于阀值,则杀死。杀死进程有两种方式,下面分别介绍:
选择在Linux层面杀死进程
可以选择根据1.2中的方式读取/proc/pid/oom_adj的值进行判断,然后通过Linux中的kill函数杀死进程。
在Android层面,系统是通过如下属性定义进程的重要程度的:
@/frameworks/base/core/java/android/app/ActivityManager$RunningAppProcessInfo
其中,importance的取值如下,关于各个值的含义在下面的注释中:
采用这种方式杀死进程的部分示例代码如下: