欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

测试人员应该了解的Android 内存优化之图片资源

程序员文章站 2022-05-27 10:25:39
...

对比新旧版本的内存测试结果,我们发现新版本的内存占用提高了不少。借助MAT工具对APP占用内存进行分析发现占用APP内存资源最大的还是图片资源,Bitmap对象。我们的开发人员主要在以下几个方面进行了优化:

 

1、将部分默认图片资源放置到更高屏幕分辨率文件夹(针对所有机型)。

 

2、使用纯色的背景皮肤,取代APP原本的渐变色背景图(针对低端机)。

 

3、延迟初始化图片(针对低端机)。

 

4、禁用圆角处理(针对低端机)。

 

5、禁用Gif,由于Gif图一般有很多帧的图片构造,因此内存占用很大,同时需要不断进行渲染,会导致卡顿与耗电(针对低端机)。

 

6、关闭动画效果,动画需要不断的绘制,会导致界面卡顿与耗电(针对低端机)。

 

本文主要分析第一点优化措施背后涉及的技术原理。(其余的优化措施实际上是去掉了一些功能,牺牲部分功能换取更好的性能)

 

这里涉及几个基本概念:像素,分辨率,density,target density,indensity,ARGB8888,图片资源所占用的内存空间的计算方法

 

像素:每张图片都是由色点组成的,每个色点称为一个像素。

 

分辨率:横纵2个方向的像素点的数量,比如分辨率720*1280的意思是水平像素数为720个,垂直像素数1280个。在屏幕尺寸一样的情况下,分辨率越高,显示效果就越精细和细腻。

 

density值表示每英寸有多少个显示点。它的单位是dpi:dot per inch,通常屏幕大时,density就大,屏幕小时,density就小。

 

inDensity表示被设定的图像密度,决定这个值的是图片所放置的文件目录,比如drawable-hdpi、drawable-xhdpi等等,如果图片放在drawable-hdpi下,inDensity=240,如果放在drawable-xhdpi下,inDensity=320。

密度 ldpi mdpi hdpi xhdpi xxhdpi
密度值 120 160 240 320 480
代表分辨率 240*320 320*480 480*800 720*1280 1080*1920

 

 

TargetDensity表示最终需要适配到的图片密度,这个值由手机设备来决定,手机屏幕越高清这个值越大。

 

ARGB8888:Android设备上图片都被处理成Bitmap对象。生成Bitmap有一个非常重要的参数Config,属性值有ALPHA_8、RGB_565、ARGB_4444、ARGB_8888四种。不同的属性值对应的图片每个像素点占用内存大小不同,ALPHA_8每个像素占用1byte,RGB_565和ARGB_4444占用2byte,ARGB_8888占用4byte,其中ARGB_4444在高版本中已经废弃。ARGB指的是一种色彩模式,里面A代表Alpha(A值代表透明度,当 A == 0xff 时不透明,当 A == 0x00 时完全透明),R表示red,G表示green,B表示blue,ARGB分别占8bit即1byte,因此一个像素占4byte。

 

在Android中,在不同的屏幕密度下,加载同一套资源所占用的内存空间是不一样的,Android在加载默认图资源时会根据资源所在的文件对应的像素密度以及自身像素密度比例缩放,具体公式如下(默认ARGB8888) :

BitmapSize = 4* WIDTH * (TargetDensity  /  inDensity)*HEIGHT *  (TargetDensity /  inDensity) 

 

假设一个Android APP的默认图片资源放在xhdpi下,在一台720*1280分辨率的手机上,加载到内存中的大小是4*720*1280=3.5MB,但是在一台1080*1920分辨率的手机上,加载到内存中的大小是4*720*(480/320)*1280*(480/320)= 7.1MB。可以看出将图片放到不同分辨率文件夹下,在不同density手机下加载到内存所占大小相差很多,因此图片放置的目录一定要慎重。我们可以将APP中一些较大的默认图片资源放到xxhdip文件夹下,这样在1080p手机下加载就不会缩放,在720p下加载会减少内存占用,虽然可能会导致渲染效率降低,但是基本影响不大。