资源生活Android Class

APP性能优化从“娃娃”抓起

2016-09-12  本文已影响1418人  为梦拼命的攻城狮

转载请注明转自:http://www.jianshu.com/p/836c02791ec0 

上篇文章APP淘宝,你为什么这么慢卡? 通过对淘宝APP进行简单的分析,介绍了很多性能优化的工具。结合工具去优化,网上谷歌一大堆文章。其实APP性能出现问题,始作俑者基本都是程序猿,我们在开发过程中埋下的坑,然后通过工具去找到坑,最后填坑。APP性能优化从“娃娃”抓起,就是总结和整理下一些好的代码的实践。少埋坑,性能自然就上来,也不用再花很多时间去找坑。但是无可厚非,没有埋过坑的程序猿,不是一个正常的程序猿。我们所要做的就是掌握一些好的代码的实践,尽最大可能少埋坑。下面仅仅是列出的相当于是“索引”,如果不是特别清楚的,可以自己进行扩展下。掌握这些“索引”,编写代码时,多少会考虑到很多,不再是只要能跑就好,而是,如何能够更加快速高效的跑!

一、避免OOM

1.简介:OOM及内存溢出(Out Of Memory),内存占有量超过了VM所分配的最大,android程序内存一般限制在16M,也有的是24M。

2.出现原因:加载资源过多,来不及释放,加载对象过大,内存不足

3.避免方法:

3.1动态回收内存,当界面不可见时释放内存,当内存紧张时释放内存。

3.2优化Dalvik虚拟机的堆内存分配

3.3自定义堆内存大小

3.4在内存引用上做些处理,常用的有软引用、强引用、弱引用

3.5加载图片时直接在内存中作处理,如边界压缩。对于大图片,先获取图片的大小信息,根据实际需要展示大小计算inSampleSize,最后decode

3.6使用轻量的数据结构,如使用ArrayMap/SpareseArray代替传统的HashMap

3.7避免在Android中使用Enum

3.8避免对象的内存泄露

3.9内部类引用导致Activity的泄露,典型的是Handler导致的Activity泄露,具体细节请自行谷歌

3.10Activity Context被传递到其他实例中,可能导致自身被引用而发生泄露

3.11注意广播和服务的及时注销,在程序里面注册的广播等,要及时在不需要的时候进行释放和移除

3.12注意cursor对象是否关闭

3.13谨慎使用large heap,特殊情况下可以在manifest中使用largeheap=true声明一个更大的heap空间,但会导致每次gc的运行时间更长,切换任务时性能大打折扣。

3.14谨慎使用多进程

3.15避免在onDraw方法里面执行对象的创建

3.16使用到大量的字符串拼接的操作用StringBuilder来替代频繁的“+”

3.17资源文件需要选择合适的文件夹进行存放,我们知道hdpi/xhdpi/xxhdpi等等不同dpi的文件夹下的图片在不同的设备上会经过scale的处理。例如我们只在hdpi的目录下放置了一张100*100的图片,那么根据换算关系,xxhdpi的手机去引用那张图片就会被拉伸到200*200。需要注意到在这种情况下,内存占用是会显著提高的。对于不希望被拉伸的图片,需要放到assets或者nodpi的目录下。

3.18节制使用Services

3.19谨慎使用“抽象”编程

3.20使用nano protobufs序列化数据,由Google为序列化结构数据而设计的,类似XML,却比XML更加轻量,快速,简单。

3.21谨慎使用依赖注入框架,虽然它从某种程度上可以简化你的代码,但是注入框架会通过扫描你的代码执行许多初始化的操作,占用内存。

3.22使用ProGuard来剔除不需要的代码

3.23慎用异常,异常对性能不利,异常只能用于错误处理,不应该用来控制程序流程

二、避免ANR

1.简介:全称Application Not Responding,意思就是程序未响应。如果一个应用无法响应用户的输入,系统就会弹出一个ANR对话框

2.出现原因:

2.1.主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞

2.2.主线程中存在耗时的计算

2.3主线程中错误的操作,比如Thread.wait或者Thread.sleep等

3.避免方法:

3.1Activity的onCreate和onResume回调中尽量避免耗时的代码(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)

3.2使用AsyncTask处理耗时IO操作。

3.3使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。

3.4使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。

3.5BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。IntentService是对service的一个很好的封装,

3.6提高用户感知响应,通常100到200毫秒就会让人察觉程序反应慢,为了更加提升响应。如果程序正在后台处理用户的输入,建议使用让用户得知进度,加入一个加载的控件,比如使用ProgressBar控件。程序启动时可以选择加上欢迎界面,避免让用户察觉卡顿。

三、安全性

1.使用Android Studio的analyze,代码检测会检测到一些不合理的地方,也会有相应的提示及如何修改

2.粗暴简单的方法可以使用比较出名的第三方平台加密比如爱加密,梆梆,阿里聚安全

3.阿里聚安全提供了项目安全性的扫描,可以使用它得到一份内部安全问题的检测报告,加以修改

4.使用严苛模式(StrictMode),主要检测两大问题,一个是线程策略,即TreadPolicy,另一个是VM策略,即VmPolicy

四、用户流量

1.避免在onresume里面执行过多的网络请求

2.避免没必要的地方加载高清大图

3.善用图片三级缓存机制

4.gzip压缩数据

5.请求加载大量数据时,判断网络环境,若非wifi,提示给予提示。

五、总结

上面列出来的,比较多,相当于来说会看着比较烦吃力。慢慢消化吧。性能优化从娃娃“”抓起,一个优秀的APP不是一个人能够做出来的,需要团队成员共同努力,避免一些常用导致性能的设计,需要大家一起努力!!

欢迎关注微信公众号,专注于Android深度文章和移动前沿技术分享


参考资料:

1.http://hukai.me/android-performance-oom/

2.http://blog.sina.com.cn/s/blog_618199e60101kvbl.html

3.http://droidyue.com/blog/2015/07/18/anr-in-android/index.html

上一篇下一篇

猜你喜欢

热点阅读