对比新旧版本的内存测试结果,我们发现新版本的内存占用提高了不少。借助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下加载会减少内存占用,虽然可能会导致渲染效率降低,但是基本影响不大。
相关推荐
在Android平台上,电池和内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨一系列针对Android设备电池寿命和内存管理的优化策略、工具以及方法。 一、电池优化 1. **减少唤醒源(Wakelocks)**:...
《陈德春-Android优化技术详解》是一本深入探讨Android系统优化的专业书籍,适用于开发者、技术爱好者以及希望提升Android应用性能的技术人员。本书全面覆盖了Android优化的各种层面,旨在帮助读者掌握提高Android...
【KEmulator手机模拟器】是一款强大的Android应用模拟工具,专为开发者和测试人员设计,以便在PC上运行和测试Android应用程序。它提供了对内存查看功能,使得用户能够深入理解程序运行时的内存状态,这对于调试和...
3. **Android Profiler**:集成的性能分析工具,帮助开发者优化内存使用、CPU负载和网络性能。 总结 Android SDK (SDK Platforms)-android-25是Android 7.1 Nougat开发的关键组成部分,它包含了一系列增强的API、...
综上所述,对于Android开发人员来说,掌握单元测试、对象回收机制以及APK文件结构和压缩方法是提升个人技术水平和开发质量的必要知识。通过系统地学习和实践这些高级知识点,可以在日常开发工作中避免许多常见的问题...
8. **资源提取**:可以提取APK中的资源文件,如图片、布局XML等,便于修改和重打包。 9. **代码混淆和反混淆**:为了保护代码,开发者会使用混淆工具,而AndroidKiller可能包含相应的混淆和反混淆功能。 10. **ADB...
《Android_v9开发手册》是针对Android开发人员的一份详细指南,由阿里巴巴集团精心编纂。这份手册旨在提供一套统一的开发规范,帮助开发者提升代码质量和项目效率,从而实现更高效、更稳定、更可维护的Android应用...
通常,这个目录结构会包含项目的源代码文件、资源文件、构建脚本、测试用例以及相关的文档。开发者可以通过解压并导入这些文件到他们的IDE(如Android Studio)来使用或贡献于该项目。 总的来说,jpegkit-android是...
这些可能包括内存管理、图片加载优化(如使用 Fresco 图片库)、后台任务调度(如使用WorkManager)以及对大型数据集的高效显示(如使用RecyclerView和Paging库)。 7. **安全性**: 对于一个社交应用来说,安全性...
压缩包中的《Android开发者资料大全(开发人员必看).xlsx》可能包含更详细的资源列表,如博客文章、视频教程、论坛讨论和其他有价值的链接,可以帮助开发者进一步扩展知识面。 而《Android_内部培训教材》很可能是...
5. **资源提取与修改**:用户可以使用此工具集提取APK中的资源文件,如图片、XML布局文件等,并进行修改,然后再重新打包,这在进行应用定制或UI优化时十分实用。 6. **签名与重打包**:AndroidKiller可能包含了...
【Android-PictureTagView】是一个专门为Android平台设计的图片标注视图库,它允许用户在图片上添加标签,实现类似照片编辑应用中的功能。这个压缩包包含了一个项目的源码,可能用于开发人员学习或者集成到自己的...
� 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...
在本资源中,我们得到了一个名为"Android应用源码之大型游戏源码AndroidGameSourceCode.zip"的压缩包,这是一份专为Android平台开发的大型游戏的源代码。通过研究这份源码,开发者可以深入理解Android游戏开发的各个...
综上所述,这份源码示例应该包含了如何在Android应用中高效、无故障地运行GIF的各个方面,包括解析、绘制、内存管理、性能优化以及用户体验设计。通过学习和理解这些技术,开发者能够更好地在Android应用中集成GIF...
【Android购物APP源代码】是一套完整的Android应用开发项目,主要涵盖了移动电商领域的技术实现,为开发者提供了深入了解和学习Android应用程序开发,特别是购物类应用设计的宝贵资源。这个源代码集合可能包括了从...
8. **性能优化**:为了提供流畅的用户体验,我们需要关注性能优化,包括减少内存泄漏、避免过度绘制、合理使用线程以及对SQLite查询的优化。 9. **测试与调试**:项目中可能包含单元测试、集成测试以及性能测试,...
ImageLoader结合了LruCache(最近最少使用)算法,高效管理内存中的图片资源。 3. **NetworkImageView**: 这是一个自定义的ImageView,可以直接绑定网络URL,Volley会自动处理加载和错误状态。 ### 三、测试与...