前面两篇文章主要是讲关于activity、fragment生命周期方面的总结,这篇文章主要是总结在android应用开发过程的优化方案,还有一些经常使用的优化工具。优化的方向包括:启动速度、界面流畅性、内存使用状况、apk体积、耗电量、流量等方面。android
一、经过style 设置一个默认的启动图来过分,从交互体验上来提升启动速度git
二、分析application和首屏的业务逻辑异步初始化第三方组件,防止阻塞主线程(或者延迟初始化(用的时候再初始化))github
三、闪屏的2秒停顿能够利用起来,把一些耗时操做延迟到这里来初始化缓存
四、同工具DDMS中的TraceView来检测耗时的点在哪里,作针对的处理性能优化
五、mainActivity的onCreate流程,特别是UI的布局与渲染操做,若是布局过于复杂极可能致使严重的启动性能问题;(能够考虑先把mainActivity须要的数据请求回来),根据首页的结构能够考虑懒加载。网络
Android APP启动优化: wuxiaolong.me/2017/03/13/…架构
App启动速度优化之耗时检测处理: www.jianshu.com/p/a0e242d57…app
使用 TraceView 找到卡顿的元凶: blog.csdn.net/u011240877/…异步
上面的几篇文章基本上描述了应用的启动流程,如何优化白屏,检测耗时以及一些SDK的懒加载等等...工具
一、谈到UI流畅度,通常就是不要在主进程去作耗时的操做,提高UI的绘制速度(减小View的布局层级,避免过渡绘制等)
二、merge、include、ViewStub标签的合理使用减小布局层级
三、自定义view的ondraw里面不要作耗时的任务
Android UI性能优化实战 :blog.csdn.net/lmj62356579…
性能优化之布局优化: www.trinea.cn/android/lay…
固然了对于UI卡顿,不可避免的要引入检测的方案:
方式1:通常有监听Looper的日志
方式二、利用Choreographer
固然也相应的有一些开源工具:
github.com/markzhai/An… [方式1]
github.com/wasabeef/Ta… [方式2]
github.com/friendlyrob… [方式2]
内存优化那么主要就是去消除应用中的内存泄露、避免内存抖动。
一、安卓studio的内存分析工具 + mat能够很好的检测内存抖动和内存泄露
二、常见的内存泄露状况:
● 单例:生命周期很长,会引用生命周期比较短的变量,致使没法释放。例如activity泄露
● 静态变量:一样也是应为生命周期比较长
● 非静态内部类建立静态实例形成的内存泄漏
● handler内存泄露 (解决办法:Handler 声明为静态的,则其存活期跟 Activity 的生命周期就无关了。同时经过软引用的方式引入 Activity)
● 匿名内部类(匿名内部类会引用外部类,致使没法释放,好比各类回调)
● 资源使用完未关闭(BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap)
● 复用问题(bitmap释放)
Android 内存优化总结&实践: mp.weixin.qq.com/s/2MsEAR9pQ…
Android内存优化之OOM: hukai.me/android-per…
Android应用内存泄露分析、改善经验总结: zhuanlan.zhihu.com/p/20831913
代码瘦身
● 移除无用代码、功能;
● 移除无用的库、避免功能雷同的库;
● 启用Proguard;
● 缩减方法数;
●第三方开源库的瘦身,仅保留本身须要的部分
资源瘦身
● 移除无用的资源文件;
● Drawable目录只保留一份资源;
● 对图片进行压缩;
● PNG转换JPG;
● 使用矢量图;
● 使用WebP;
● 资源混淆;
● 资源在线化;
● 能不用图片的就不用图片实现,用代码实现
So瘦身
● 在容许的状况下,针对用户机型分布保留特定架构的So;
电量是移动设备很是宝贵的资源,做为一名开发者,有必要为用户着想,减小电量的消耗.调查显示一般只有30%左右的电量是被程序核心的功能所消耗,好比界面渲染,剩下的70%则是被上报数据,位置更新,后台通知所消耗.
如何检测?
一、手机选项中经过查看APP的电量消耗的统计数据
二、使用Battery Historian Tool来查看详细的电量消耗
如何优化
●减小唤醒屏幕的次数与持续的时间,正确的使用WakeLock.
●延迟非必须的操做到充电状态时,好比日志上报彻底能够在夜间充电时完成,这点能够结合JobScheduler使用
●使用传感器采集数据时,一旦不须要记得取消注册.
●减小网络通讯,合并通讯.
●合理使用定位功能,减小位置更新频率以及根据实际状况使用不一样精度的定位需求
如今App几乎都须要联网操做,作好网络优化一方面能够提升体验,另外一方面能够减小流量和电量的损耗.另外,不管是对用户仍是网络服务提供者,网络一样是一种资源,任何开发者都不该该假设网络资源是无限制的
如何检测
●使用Android Studio里的Network Traffic Tools来查看网络请求
●使用Android Studio中的Monitor,安卓studio3.0新的性能分析工具更方便
●使用Fidder或者Charles等抓包工具分析网络数据包
●有必要的时候务必作好缓存,不管是图片仍是普通的数据,使用LruCache和DiskLruCache构建本身的缓存系统,并根据实际场景设计缓存策略
●避免过分的网络同步,合并相关的网络请求
●根据实际场景肯定请求策略,避免使用固定的间隔频率来进行网络操做.好比链接WiFi并充电的状况下请求频率能够高,第一次网络请求失败后可使用双倍的时间间隔来进行下一次
●减小数据传输量,对传输的数据作压缩.若是传输的是图片,须要选择合适的图片格式以及根据显示大小请求合适规格的图片.对于普通数据,能够考虑使用ProtocalBuffers来减少传输数据的大小.