《Android进程管理机制及优化 for HTC HeRO》由会员分享,可在线阅读,更多相关《Android进程管理机制及优化 for HTC HeRO(7页珍藏版)》请在金锄头文库上搜索。
1、Android 进程管理机制及优化进程管理机制及优化 for HTC HeRO(其它设备也可参考)(其它设备也可参考)+自动内存管理程序自动内存管理程序 理论Android 采取了一种有别于 Linux 的进程管理策略,有别于 Linux 的在进程活动停止后就结 束该进程,Android 把这些进程都保留在内存中,直到系统需要更多内存为止。这些保留 在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程 时,提升了进程的启动速度。那 Android 什么时候结束进程?结束哪个进程呢?之前普遍的认识是 Android 是依据一个 名为 LRU(last recently
2、used 最近使用过的程序)列表,将程序进行排序,并结束最早的 进程。XDA 的楼主又进一步对这个管理机制进行研究,有了如下发现:1.系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,赋予各个 进程;(系统会根据“oom_adj”来判断需要结束哪些进程,一般来说, “oom_adj”的值越大, 该进程被系统选中终止的可能就越高)2.前台程序的“oom_adj”值为 0,这意味着它不会被系统终止,一旦它不可访问后,会获得 个更高的“oom_adj”,作者推测“oom_adj”的值是根据软件在 LRU 列表中的位置所决定的;3.Android 不同于 Linux,有一套
3、自己独特的进程管理模块,这个模块有更强的可定制性, 可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于 X 时,结束 “oom_adj”大于 Y 的进程”。这给了进程管理脚本的编写以更多的选择。4.Android 将进程分为六大类:1.前台进程(foreground):目前正在屏幕上显示的进程和一些系统进程。举例来说, Dialer Storage,Google Search 等系统进程就是前台进程;再举例来说,当你运行一个程序, 如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground) ,但一旦你按 home 回到主界面,浏览器就变成了后台程序
4、(background) 。我们最不希望终止的进程就 是前台进程。2.可见进程(visible):可见进程是一些不再前台,但用户依然可见的进程,举个例来说: widget、输入法等,都属于 visible。这部分进程虽然不在前台,但与我们的使用也密切相 关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等 widget 被终止,那它们 将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)3.次要服务(secondary server):目前正在运行的一些服务(主要服务,如拨号等,是不可 能被进程管理终止的,故这里只谈次要服务) ,举例来说:谷歌企业套件,Gmail
5、内部存储, 联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我 们时常需要用到它们,所以也太希望他们被终止4.后台进程(hidden):虽然作者用了 hidden 这个词,但实际即是后台进程(background) , 就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显 示在屏幕上时,他所运行的进程即为前台进程(foreground) ,一旦我们按 home 返回主界面(注意是按 home,不是按 back) ,程序就驻留在后台,成为后台进程 (background) 。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即 终
6、止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式, 尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动 的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点5.内容供应节点(content provider):没有程序实体,进提供内容供别的程序去用的,比如 日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权6.空进程(empty):没有任何东西在内运行的进程,有些程序,比如 BTE,在程序退出后, 依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程 序下次的启动速度或者记
7、录程序的一些历史信息。这部分进程无疑是应该最先终止的。实践说完理论,说些实践的东西,怎样管理这六类进程,如何来设置进程管理模块是这部分说 的内容。首先是软件,推荐使用 MinFreeManager,市场上就有下载,用于设置这六类进程的管理策 略。软件运行后有六个输入框,在输入框中只能输入数字,这些数字代表了这类进程的处理策 略,比如 Foreground App 下的输入框显示 6,就表示,当可用内存低于 6MB 时,终止 Foreground App。下面的类似,如 Empty App 下的输入框显示 24,则表示,当内存低于 24MB 时,终止 Empty App。从软件数值的设置不难看出
8、结束进程的有限顺序:EmptyContent ProviderHiddenSecondary ServerVisibleForeground。但默认设置确存在一些问题: 各类进程的管理策略的阀值相当接近:6,8,16,20,22,24,最大的相差也不到 8MB, 在实际程序运行中,很容易导致多种类型的进程同时被关闭。如可用内存在 25 时,突然启 动照相程序,系统可用内存急速,可能会导致空进程、内容供应节点、后台进程、次要服 务等同时被关闭 阀值上限较低:一般手机启动后,可用内存在 50-100 左右,但随着手机的使用,可用内存 会逐步减少,最后降低到 24MB 左右,则系统开始启动进程管理机
9、制,开始结束进程,但 这个阀限制设在了 24MB,相对来说偏低。其结果会导致系统使用一段时间后,整体速度 变慢。很明显的就是,当手机长时间使用后,开启电话拨号,相册,照相机等应用时,系 统的反应速度极慢。基于以上几个问题,不难看出,我们修改的目标也将非常明确,主要解决两个矛盾: 拉开各进程的阀值层次,使得进程管理机制能更有效得工作 提升阀值上限,空出更多的空余内存,以提升系统整体的运行速度进程管理策略设置原则: 前台进程、可见进程和次要服务是与用户体验息息相关的内容,这部分的进程管理策略要 相对保守,给这些进程留下足够的运行空间 压榨无用进程,腾出内存空间给主要程序使用下面笔者总结了几种设置方
10、式,适应不同的使用需要: 游戏玩家/重度浏览器使用者配置: 用户特点:长时间专注于某一特定的,高内存需求的程序,对多任务的需求不高配置参数:1.Foreground:6 2.Visible:8 3.Secondary Server:16 4.Hiden App:80 5.Content Provider:90 6.Empty:100配置理念:压榨后台进程,内容供应节点和空进程,将内存尽可能多得留给前台进程和系 统,提升游戏速度和浏览器体验 优点:程序启动和运行的速度最快 缺点:多任务处理不理想,开启程序较多时,后台进程会被终止多任务配置: 用户特点:同时运行多个应用程序,需要经常在多个程序间切
11、换配置参数:1.Foreground:6 2.Visible:8 3.Secondary Server:16 4.Hiden App:20 5.Content Provider:60 6.Empty:100配置理念:压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空 间,提升多任务的处理能力 优点:运行多个程序时,由于可支配内存较多,后台程序不容易被终止 缺点:程序启动的速度和整体系统的运行速度可能会比游戏玩家配置略慢一些,由于经常 运行多任务,平时系统的响应速度会受到一定影响 轻度用户/女生专用配置 用户特点:手机的主要功能是短信和电话,偶尔用用相机自拍配置参数:1.For
12、eground:6 2.Visible:8 3.Secondary Server:16 4.Hiden App:24 5.Content Provider:32 6.Empty:48配置理念:压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空 间,提升多任务的处理能力 优点:比较均衡的配置,提升了系统的可用内存,使得系统的整体速度得到了提高,拉开 了各级进程的管理策略层次,使得管理机制更有效率 缺点:比较均衡的配置,无明显缺点 总结阐述完了内存管理的机制,并推荐了一些配置参数,但这些参数并不一定适用于所有人, 大家也可以根据自己实际的使用习惯调整这些参数的设置。 我们一直听说
13、 Android 是一个多进程操作系统,那么它是如何处理每一个进程呢? 大家可能已经发现 Android 自身并没有所谓的关闭进程的说法 每当我们要退出一个进程 回到桌面/打开另一个程序的时候我们只能按“返回键“. 而当我们按下“返回键“后,该进程并 没有真正的关闭,仍然保存在内存中. 这样在下次调用的时候可以更快的打开该程序.要想真正的关闭一个已打开的进程,除了用第三方软件(例如 advanced task manager)外,还有 一个,那就是当 Android 系统认为当时已经没有足够的内存来运行新的进程,需要关闭一些虽 然已经开着,但是没有用了(具体怎样一个进程才会被 Android
14、系统认为是“没有用“下面就要 讨论到)的进程.而下面要研究的就是这个 Android 内部的 lowmemorykiller.ActivityManagerService.java 记录着每一个进程的优先级. 一个进程的 oom_adj 值也就代表 了它的优先级. oom_adj 值越高代表该进程优先级越低. 一个正在使用的进程的 oom_adj 值 为 0,一旦我们按下返回键,这个进程就会得到一个更高的 oom_adj 值(更低的优先级). 具体 多少取决于该进程在 LRU(last recently used) list 的位置.(未证实) 具体的细节保存在 Android 源文件 dri
15、vers/misc/lowmemorykiller.c 里.Android 将进程分为 6 个等级,它们按优先级顺序由高到低依次是:1. FOREGROUND_APP:This is the process running the current foreground app. Wed really rather not kill it!用户正在使用的程序. 这个设的太高,用户看到得就会是一个正在使用的程序莫名其妙的 消失了,然后自动回到桌面.(因为它被系统 kill 了.) 所以最好别动它.2. VISIBLE_APP:This is a process only hosting activ
16、ities that are visible to the user, so wed prefer they dont disappear.8 b2 ; p5 N; S跟 FOREGROUND_APP 类似,用户正在使用/看得到. 它们的区别就是 VISIBLE_APP 可 能不是用户 focus 的程序,但是用户看得到,或者没有覆盖到整个屏幕,只有屏幕的一部分. 所 以可以适当的比 FOREGROUND_APP 高一点.3. SECONDARY_SERVER:This is a process holding a secondary server - killing it will not have much of an impact as far as the user is concerned.所有应用的 service. 系统级的 service 比如 PhoneService 不属于这类,它们是绝不会被 Android 结束掉的. 所以这个可以适当的设高一点点 注意, HOME(SenseUI)也包括在这里 因此还是别设的太高.