APP性能优化从“娃娃”抓起
Posted 第十六感
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APP性能优化从“娃娃”抓起相关的知识,希望对你有一定的参考价值。
转载请注明转自:http://blog.csdn.net/u011176685/article/details/52511046
上篇文章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的目录下放置了一张100100的图片,那么根据换算关系,xxhdpi的手机去引用那张图片就会被拉伸到200200。需要注意到在这种情况下,内存占用是会显著提高的。对于不希望被拉伸的图片,需要放到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不是一个人能够做出来的,需要团队成员共同努力,避免一些常用导致性能的设计,需要大家一起努力!!
如果觉得不错,欢迎关注微信公众号和点赞。专注于干货的分享!!公众号历史文章那有福利噢!!
参考资料:
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以上是关于APP性能优化从“娃娃”抓起的主要内容,如果未能解决你的问题,请参考以下文章
9岁玩转Python,11岁创作游戏,学python从娃娃抓起!!!
计算机要从娃娃抓起---------正则表达式(学习笔记一)
读完小学生编程考试大纲,不妨重新讨论一下「计算机从娃娃抓起」这件事