首页 > 系统 > Android > 正文

关于Android App性能优化的个人见解

2019-11-09 14:03:25
字体:
来源:转载
供稿:网友

随着移动应用在中国6、7年的发展,手机应用的开发已经很完善了,如果boss让你开发一个应用,你会发现你要开发的功能在公司里面基本都能找到类似的实现代码,就算在公司找不到,在网上也有大把的demo,这样程序开发的门槛就降低了,无非是代码的解读与拼凑(仅在实现功能的角度来说),所以为了成为一个优秀的程序员,大家就不能仅满足于实现功能,更重要的是写出优秀的程序。在这篇文章里,我会结合过去的开发经验—特别是图库的开发,谈谈对于Android性能优化的个人见解。

一、            概述

概括来说,我认为Android应用性能优化包括如下几方面:

内存 、线程、流程逻辑、数据结构、逻辑算法、系统配置、编程语言

1.        内存优化

开发过程中内存优化涉及到如下区域:

寄存器(Register):速度最快,位于服务器内部,一般我们无法控制

栈(Stack) :存放基本数据类型与指向对象的指针的地方

堆(Heap):存放对象的地方,受GC管理

 

Android 应用有内存大小限制,超过了会引发oom,具体的限制值可以在/system/build.PRop中查看:

   -dalvik.vm.heapstartsize 表示默认分配的内存

-dalvik.vm.heapgrowthlimit   表示默认情况下内存的最大允许值

-dalvik.vm.heapsize当我们在AndroidManifest.xml中设了largHeap = true时,内存的最大允许值。   

当然我们在开发的时候也可以通过Runtime.getRuntime().maxMemory();取得当前最大允许的内存值。

 

5R:

内存的优化工作也可以从以下5个方面思考。

1.Reckon(计算)

首先需要知道你的app所消耗内存的情况,知己知彼才能百战不殆

2.Reduce(减少)

消耗更少的资源

3.Reuse(重用)

当第一次使用完以后,尽量给其他的使用

5.Recycle(回收)

返回资源给生产流

4.Review(检查)

回顾检查你的程序,看看设计或代码有什么不合理的地方

 

1.        

1.1.       充分使用缓存机制

我们的应用并不是使用内存越少越好,相反充分的使用内存,能有效的提高效率,Chrome浏览器占用内存明显比较高,一定程度上也可以看做内存换效率。

以从网上加载一张图片为例:

 

 

其中涉及到图片下载、图片保存、图片解码、内存管理、图片信息管理。

     在文件下载到ram,以及保存到disk中,比较好理解,当然把图片的id用数据库保存起来, 记得close数据流,防止内存泄漏。至于内存中的缓存,我们要在应用内存大小的限制之类,尽量高效率的复用bitmap,以前我们用软引用/弱引用的机制来保存图片对象,然而自Android2.3版本(API Level 9)开始,垃圾回收器更着重于对软/弱引用的回收,这使得上述的方案相当无效。幸好Google给了我们Lrucache,它将被引用的对象保存在LinkedHashMap中,并且当缓存超过指定大小后,释放最不常使用对象。

 

关于图片缓存,我们有很多开源项目:

Android-Universal-Image-Loader 图片缓存、picasso square开源的图片缓存、ImageCache图片缓存,包含内存和Sdcard缓存。

 

1.2.       尽量不使用全局变量

首先这里不包括static final的基本数据类型。

处女座的老板可能会要求你完全消灭全局变量。全局变量不单会一直占据内存资源,关键是内存不足的情况下,系统会回收一部分资源,由于APP切换到后台,所以之前的全局变量可能被回收,这样应用面临一个很不确定的风险。

要解决这个问题,建议:

1)      把全局变量序列化之后保存到本地。

2)       把变量放到application中声明,除非应用退出,否则Application不会被回收,作为Application的成员变量也就不会被回收,同时,在应用内部Application的成员变量的作用域也类似于全局变量了。

1.3.       提防内存泄漏,比如context被长于Activity的声明周期的对象引用,bitmap要recycle,数据流要close,数据库要close,广播要unregister

1.4.       按需加载图片

1) 通过设置BitmapFactoryOption.sampleSize 修改加载的图片大小而不是加载了图片之后再缩放。

2) 设置图片像素的质量。分别是:

          ALPHA_8:每个像素占用1byte内存 (只有透明度)ARGB_4444每个像素占用2byte内存  (有透明度但没那么细腻)ARGB_8888每个像素占用4byte内存 (默认)RGB_565每个像素占用2byte内存 (没有透明属性)

3) 通过计算当前应用允许的最大占用内存值,决定缓存的大小(可以在LruCache中设定),一般是最大值的1/8,按应用实际需求决定。

2.        线程优化

般的应用都会涉及到多线程吧,特别是耗时逻辑放在主线程容易引起anr,很影响用户体验(为了让屏幕的刷新帧率达到 60fps,我们需要确保 16ms 内完成单次刷新的操作,一旦刷新帧率降到 20fps左右,用户就可以明显感知到卡顿不流畅了)。我们应该关注的怎样合理使用、管理多线程。

1)    选择适当的工具

AyncTask

HandlerThread

IntentService

2)    关注线程的并发数

3)    关注线程的优先级

 

3.         

4.         

5.        数据结构

  使用recycledView

  使用sparseArray代替hashMap

(待续)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表