电子发烧友网 > 存储技术 > 正文

基于Android系统的高效内存方法解析

2018年06月05日 20:23 次阅读

在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。

一、一张图片到底占用多少内存

我们先假设我们有一张图片是600 * 800像素的,图片磁盘占用空间大小假设是 100KB。

图片内存大小跟磁盘占用空间大小有什么关系?

磁盘占用空间的大小不是图片占用内存的大小,磁盘占用空间是在磁盘上存储图片需要的一个空间大小,内存大小是加载到内存中占用的内存大小。两个只是单位是一样的,本质不是一个概念。

一张图片到底占用多少内存呢?

图片占用内存的计算公式是:图片高度 * 图片宽度 * 一个像素占用的内存大小,在Android中一般情况下默认一个像素占用内存是4个字节,所以上面的图片占用内存是:800 * 600 * 4 byte = 1875KB = 1.83M。为什么是4个字节呢?一定是4个字节么?这两个问题后面仔细讲。

图片所在目录对内存的影响?

在Android中,图片的存放目录和手机的屏幕密度影响图片最终加载到内存的实际大小,举个例子:假设我们的图片放到xhdpi目录下,那么我们本文中的图片占用的内存大小如下:

• 屏幕密度为2的设备:800 * 600 * 4byte = 1.83M

• 屏幕密度为3的设备:800 * 1.5 * 600 * 1.5 * 4byte = 1.83 * 2.25M = 4.12M

• 这里所说的屏幕密度是指android.uTIl.DisplayMetrics类中的density变量,是一个float值,关于屏幕密度的更多内容本文不做介绍。

所以,计算图片占用内存大小的时候,要考虑图片所在的目录跟屏幕密度,这两个因素其实影响的是图片的高宽,Android会对图片进行拉升跟压缩。

二、 让你的图片省内存

2.1 让你的图片最小化

图片的内存占用计算方式为:图片高度 * 图片宽度 * 一个像素占用的内存大小,所以图片的高宽如果都变为原来宽高的2倍,那么内存将变为原来的4倍。所以图片的使用原则可以总结如下:

1. 使用尽可能小的图

2. 使用.9图,.9图本身也要尽可能的小

3. 自己绘制(覆写View的onDraw自己画)或者使用Drawable来绘制

比如要实现一个线性渐变效果可以采用以下drawable实现:

基于Android系统的高效内存方法解析

2.2 在内存中压缩图片

加载大图片时需要对图片进行压缩,使用等比例压缩方法直接在内存中处理图片。

OpTIons opTIons = new BitmapFactory.OpTIons(); options.inSampleSize = 5; // 原图的五分之一,设置为2则为二分之一 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options);

这样做要注意的是,图片质量会变差,inSampleSize设置的值越大,图片质量就越差。

2.3 读取位图尺寸和类型时不把图片加载到内存中

有时候我们取得一张图片,也许只是为了获得这个图片的一些信息,比如图片的width、height等信息,不需要显示到界面上,这个时候我们可以不把图片加载到内存中。

BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.id.myimage, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType;

2.4 用完就回收

由于Android外层是使用java,而底层使用的是C语言为图片对象分配的内存空间。所以我们的外部虽然看起来释放了,但里层却并不一定完全释放了,我们使用完图片后最好再释放掉里层的内存空间。

if (!bitmapObject.isRecyled()) { // Bitmap对象没有被回收 bitmapObject.recycle(); // 释放 System.gc(); // 提醒系统及时回收 }

2.5 降低要显示的图片色彩质量

2.5.1 颜色模型

RGB(ARGB)

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。在Android中还有包含透明度Alpha的颜色模型,即ARGB。

基于Android系统的高效内存方法解析

2.5.2 RGB在计算机中颜色值的数字化编码

在不考虑透明度的情况下,一个像素点的颜色值在计算机中的表示方法有以下3种:

1、 浮点数编码:比如float: (1.0, 0.5, 0.75),每个颜色分量各占1个float字段,其中1.0表示该分量的值为全红或全绿或全蓝。

2、 24位的整数编码:比如24-bit:(255, 128, 196),每个颜色分量各占8位,取值范围0-255,其中255表示该分量的值为全红或全绿或全蓝。

3、 16位的整数编码:比如16-bit:(31, 45, 31),第1和第3个颜色分量各占5位,取值范围0-31,第2个颜色分量占6位,取值范围0-63。

在Java中,float类型的变量占32位,int类型的变量占32位,short和char类型的变量都在16位,因此可以看出,用浮点数表示法编码一个像素的颜色,内存占用量是96位即12字节;而用24位整数表示法编码,只要一个int类型变量,占用4个字节(高8位空着,低24位用于表示颜色);用16位整数表示法编码,只要一个short类型变量,占2个字节;因此可以看出采用整数表示法编码颜色值,可以大大节省内存,当然,颜色质量也会相对低一些。在Android中获取Bitmap的时候一般也采用整型编码。

2.5.3 Android中RGB编码格式(整型编码)

• RGB888(int):R、G、B分量各占8位

• RGB565(short):R、G、B分量分别占5、6、5位

• RGB555(short):RGB分量都用5位表示(剩下的1位不用)

• ARGB8888(int):A、R、G、B分量各占8位

• ARGB4444(short):A、R、G、B分量各占4位

在Android的Bitmap.Config类中,有ARGB_8888、ARGB_4444、RGB565等常量,现在可以知道它们分别代表了什么含义。

基于Android系统的高效内存方法解析

在Android中系统默认使用的编码格式是ARGB_8888,所以在文章开头计算图片内存大小的时候每个像素占用内存大小是4byte,比如采用ARGB_8888编码载入一张1920*1200的图片,大概就会占用1920*1200*4/1024/1024=8.79MB的内存。

2.5.4 降低要显示的图片色彩质量

采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存,比如1920*1200的图片。

• ARGB_8888:1920*1200*4/1024/1024=8.79MB

• ARGB_4444,RGB565:1920*1200*2/1024/1024=4.39MB

三、总结

在Android中,对图片的使用一定要关注,大多数情况下,占用内存多,OOM发生都是因为图片资源使用不当。不要盲目加一个大图到Android项目中,能使用.9进来使用,而且.9图本身尽可能小,另外能使用绘制实现就不要加一个图片资源。有些时候,在不影响用户体验的情况下,可以降低图片色彩质量,比如不需要透明度的就不要了,有些透明度用肉眼看不出来。

技术专区

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

关于手机内存全解

经常关注手机圈的朋友都会对智能手机有着自己的倾向,这也是根据不同需求而定的,人们在挑选手机时也会不...

发表于 2018-06-06 03:00 22次阅读
关于手机内存全解

手机运行为什么会缩水6GB的运存为什么剩余只3G...

许多安卓用户在使用手机的时候都有这样一个困惑,一款6GB RAM 的手机,在后台没有运行任何软件的情...

发表于 2018-05-27 09:52 329次阅读
手机运行为什么会缩水6GB的运存为什么剩余只3G...

大家觉得64GB的手机真的够用了?

发表于 2018-05-07 10:16 854次阅读
大家觉得64GB的手机真的够用了?

高通谷歌携手助力旧手机更新Android 8.1...

据报道谷歌将联手高通助力旧手机进一步更新Android 8.1系统,推出Android Go计划,让...

发表于 2018-01-01 20:36 221次阅读
高通谷歌携手助力旧手机更新Android 8.1...

集邦科技黄郁琁:2018年手机内存暨智能手机市场...

台湾集邦科技的行动式记忆体研究经理黄郁璇指出,2018年,DRAM的供需缺口还会显现,特别是服务器使...

发表于 2017-12-26 14:22 1606次阅读
集邦科技黄郁琁:2018年手机内存暨智能手机市场...

Pixel C平板升级Android 8.1后,...

最近有则报道称谷歌推送安卓8.1正式版升级Pixel C后,机内的所有数据都发生自动恢复出厂设置的现...

发表于 2017-12-11 16:13 277次阅读
Pixel C平板升级Android 8.1后,...

Android存在安全漏洞,5.0系统版本以上都...

据调查指出,这项新的漏洞存在于Android 系统服务内一项名为「 MediaProjection ...

发表于 2017-11-23 17:06 199次阅读
Android存在安全漏洞,5.0系统版本以上都...

巧用imx6开发板烧写android系统的详细步...

平台:迅为iMX6开发板 iMX6可以使用OTG接口烧写镜像,OTG烧写也可以叫USB烧写。 1. ...

发表于 2017-11-16 03:27 1591次阅读
巧用imx6开发板烧写android系统的详细步...

10本Android开发类图书资料,供Android开发者参考学习

发表于 2017-09-20 16:05 1130次阅读
10本Android开发类图书资料,供Android开发者参考学习

SK海力士宣布出货8GB LPDDR4手机内存 ...

在 Samsung Electronics 之后,SK Hynix 也增加 8GB LPDDR4 产...

发表于 2016-12-22 09:40 312次阅读
SK海力士宣布出货8GB LPDDR4手机内存 ...

传1加3T将搭配android 7.0系统

购买安卓旗舰最明智的选择就是一加手机3T。一加手机3T真是一部超出预期的、最好的年度旗舰。

发表于 2016-12-14 14:51 1160次阅读
传1加3T将搭配android 7.0系统

三星手机内存称霸市场 份额高达64.5%

智能手机中,除了芯片是更新换代的大件,手机内存也是在每一年都会迎来新变化,作为手机内存生产大户,三星...

发表于 2016-11-30 10:10 430次阅读
三星手机内存称霸市场 份额高达64.5%

手工增加iPhone内存真的有那么好?

近期,不少手机维修门店都开始提供这项业务。只花四五百元,就可以让iPhone从“乞丐版”变成“高配版...

发表于 2015-11-04 08:23 14577次阅读
手工增加iPhone内存真的有那么好?

Android系统版本和它的Linux内核版本有没有必须的对应关系?

发表于 2015-01-11 11:56 3414次阅读
Android系统版本和它的Linux内核版本有没有必须的对应关系?

基于Android系统的车载娱乐系统构架

本文是对谷歌Android系统应用的一种创新扩展,它可以对第三方应用程序进行隔离,并使可信任的第三方...

发表于 2014-03-18 11:40 1159次阅读
基于Android系统的车载娱乐系统构架

谷歌积极布局欲垄断可穿戴式设备

谷歌的可穿戴式设备不仅仅在谷歌眼镜,在智能手表等其他领域亦积极布局,谷歌早在2012年就已经秘密收购...

发表于 2013-09-02 09:49 605次阅读
谷歌积极布局欲垄断可穿戴式设备

三星确认GALAXY Gear智能手表9月4日发...

据最新消息显示,三星移动副总裁李永熙已经通知韩国媒体KoreaTimes,三星将在9月4日IFA消费...

发表于 2013-08-29 14:12 640次阅读
三星确认GALAXY Gear智能手表9月4日发...

FBI:目前约44%的Android手机存在系统...

根据美国国土安全部(DHS)及联邦调查局(FBI)的最新内部通报文件显示,目前全世界已经有超过44%...

发表于 2013-08-27 09:28 305次阅读
FBI:目前约44%的Android手机存在系统...

手机内存持续走热 PC内存不足致价格飙涨

据业内人士透露,内存制造商目前将产能更多地生产手机用内存和其他非PC内存,已经导致PC用内存现货价格...

发表于 2013-01-15 10:12 305次阅读
手机内存持续走热 PC内存不足致价格飙涨

小米赶时髦或于11月底推出安卓4.0版MIUI

发表于 2011-10-28 11:05 1030次阅读
小米赶时髦或于11月底推出安卓4.0版MIUI

中国企业更偏好Android系统

中国企业更偏好Android系统 全球第二大处理器产权公司MIPS科技公司总裁兼首 席执行官San...

发表于 2010-03-02 09:34 192次阅读
中国企业更偏好Android系统