手机管理应用研究【4】—— 手机加速篇

本文深入探讨了Android系统的手机加速功能,包括清理运行时进程、开机自启动管理和后台自启动管理。阐述了Android内存管理策略,分析了不同进程优先级,并提供了多种清理和禁止自启动的方案,如通过Linux层面杀死进程、使用`forceStopPackage`方法等。同时,文章指出了当前清理和加速应用可能带来的问题,呼吁开发者采用更合理的策略以优化用户体验。
摘要由CSDN通过智能技术生成

欢迎转载,转载请注明: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的取值如下,关于各个值的含义在下面的注释中:




采用这种方式杀死进程的部分示例代码如下:




评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值