小米工程师:MIUI 6是如何优化手机内存的?

【编者按】MIUI6发布后,大家的关注点首先集中在视觉风格改变方面。但实际上816当天洪锋不仅仅是讲了MIUI6的设计,还讲了八大功能,其中就着重介绍了MIUI在内存优化上所做的努力。本文作者为MIUI内存优化项目工程师闫昊,他介绍了MIUI6内存优化的具体原理。

手机操作系统不仅要好看,更要好用,还要有覆盖尽可能多不同世代机型的普适优化能力。MIUI 6为了让你在使用手机的过程中更爽,做了很多优化工作,比如省电优化、内存优化、下载优化、驱动级的性能优化。

我是内存优化项目的工程师,跟大家分享下我们在其中做的工作。

有必要说明的是,MIUI是高频优化演进的系统,内存优化机制不仅仅在MIUI 6中搭载,更在一些机型的V5版本中也已加载。

今年3月,我们启动了内存优化项目组,从那时开始一直做封闭开发。启动这个项目的
一个大的背景,是我们认识到,手机的内存资源是有限的,但第三方APP在使用内存时的欲望是无限的。所有的应用,都恨不得调用更多接口,启用更多服务,占
用更多资源。它们的欲望,让自己爽了,却让用户堵心。尤其是对于非旗舰配置的手机来说,内存资源一旦被占用,它正常运行起来就显得吃力。

从效果来看,MIUI内存优化基本上达到了我们预期的效果。我们在内存较小的红米系列、部分小米2机型上对内存作优化处理后,用户能够明显感觉到手机用起来更爽了。我们还正计划对小米3也启动内存优化,因为它用2GB内存跑着跟小米4一样的分辨率,有可以优化的空间。

项目启动时,我们的态度非常谨慎。我们采用的优化策略,首要一条是保证手机的稳定
性,为了保证手机的稳定性,我们避免在系统进程做更多的事情,而是通过应用进程来实现优化的策略。我们将各个内存优化的点组织起来,以APP为单位进行配
置,根据实际使用效果,实现对APP的差异化优化。


过去五个多月,我们的内存优化处理从以下四个方面着手。

第一种策略,是释放显示相关的内存。这是我们针对系统APP采用的一种调优策略。
图形内容,俗称位图是非常占用内存的,针对位图,我们采用异步加载的方法,将位图内容信息和位图的状态信息分别进行存储,将内容信息存储到机身存储上,而
把状态信息保留在RAM上。当APP再次显示时,不需要重新测量、布局,只在绘画的时候再把位图的内容信息加载回来。为了保证快速启用后台应用,我们在系
统发出切换的时候就通知APP进行位图内容信息的加载。这样运行内存被占用的情况就得到很大的改善。

第二种策略,是压缩后台内存。我们发现,手机后台运行的大部分内存是不经常使用
的,但由于安卓的多任务机制,它们又不能被直接释放,于是我们对这些后台运行的内存采用了压缩策略。像ZIP文件压缩一样,我们对不常使用的内存进行压
缩,现在我们能够做到5:1的压缩幅度。压缩了后台内存,就给前台正在使用的应用腾出了内存空间,让前台应用跑得更爽。

第三种策略,是从系统底层去释放内存。我们知道,现在很多APP的绘图用的是硬件
绘图,硬件绘图是运行在GPU上的,GPU在做图片合成的时候会保留一些缓存。我们修改了系统的接口,把硬件绘图缓存释放掉,下次需要使用的时候再进行申
请,以达到压缩内存的目的。另外我们在JAVA内存管理机制中,也对冗余内存进行了释放。

第四种策略,是优化自启动管理。无论是系统应用还是第三方应用,MIUI都对应用的自启动进行了约束。我们对后台应用数量、后台进程数量和空进程数量进行管束,拉长应用自启动的周期,禁止不必要的启动,从而实现内存的合理利用和释放。

以上几种策略,在针对具体APP时,都会有不同的组合,有些可能只采用一种策略,
有些可能四种策略同时使用。据我们实测,在同等低内存机型中,进行过内存优化的小米设备,能比同等配置的其他品牌机型多运行3个以上后台应用——我们的设
备可以运行到12-14个后台应用,其他品牌则可能最多运行到第9个安卓系统就已经开始“杀”后台应用了。更重要的是,为了兼顾前台应用操作流畅性和后台
应用响应速度的平衡,我们将已经做过的内存优化策略的具体参数设计为可配置,可以随时进行修改。

据我们观察,小米是目前唯一一家具备内存优化能力的手机厂商,后台内存压缩技术甚
至优于源生Android。通过把各类应用的“欲望”关到一个笼子里,尽量让他们不会“穷凶恶极”地征用内存,保证用户在使用手机的时候感觉到“爽”,这
是我们项目组成立时的初衷,现在来看,成效是明显的。不过由于安卓的开放性,及应用们难以填满的欲望,我们将会持续优化,给予用户最佳操控体验。

本文文字及图片出自 雷锋网

你也许感兴趣的:

共有 7 条讨论

  1. 云之君 对这篇文章的反应是赞一个
  2. fsdd 对这篇文章的反应是赞一个很实用
  3. 李炜 对这篇文章的反应是垃圾
  4. 大家都用这优化内存,而且还有很多其他方法。你还自称宇宙第一

    1. 额。。不使用displayUsed=realUsed*0.8就不错了。

  5. 张先生 对这篇文章的反应是很实用

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注