Android应用优化方案

4,043 阅读5分钟

前言:

前面两篇文章主要是讲关于activity、fragment生命周期方面的总结,这篇文章主要是总结在android应用开发过程的优化方案,还有一些常用的优化工具。优化的方向包括:启动速度、界面流畅性、内存使用情况、apk体积、耗电量、流量等方面。

app启动速度

1、通过style 设置一个默认的启动图来过度,从交互体验上来提高启动速度

2、分析application和首屏的业务逻辑异步初始化第三方组件,防止阻塞主线程(或者延迟初始化(用的时候再初始化))

3、闪屏的2秒停顿可以利用起来,把一些耗时操作延迟到这里来初始化

4、同工具DDMS中的TraceView来检测耗时的点在哪里,做针对的处理

5、mainActivity的onCreate流程,特别是UI的布局与渲染操作,如果布局过于复杂很可能导致严重的启动性能问题;(可以考虑先把mainActivity需要的数据请求回来),根据首页的结构可以考虑懒加载。

Android APP启动优化: wuxiaolong.me/2017/03/13/…

App启动速度优化之耗时检测处理: www.jianshu.com/p/a0e242d57…

使用 TraceView 找到卡顿的元凶: blog.csdn.net/u011240877/…

上面的几篇文章基本上描述了应用的启动流程,如何优化白屏,检测耗时以及一些SDK的懒加载等等...

界面流畅性

1、谈到UI流畅度,一般就是不要在主进程去做耗时的操作,提升UI的绘制速度(减少View的布局层级,避免过渡绘制等)

2、merge、include、ViewStub标签的合理使用减少布局层级

3、自定义view的ondraw里面不要做耗时的任务

Android UI性能优化实战 :blog.csdn.net/lmj62356579…

性能优化之布局优化: www.trinea.cn/android/lay…

当然了对于UI卡顿,不可避免的要引入检测的方案:

方式1:一般有监听Looper的日志

方式2、利用Choreographer

当然也相应的有一些开源工具:

github.com/markzhai/An… [方式1]

github.com/wasabeef/Ta… [方式2]

github.com/friendlyrob… [方式2]

内存优化

内存优化那么主要就是去消除应用中的内存泄露、避免内存抖动。

1、安卓studio的内存分析工具 + mat可以很好的检测内存抖动和内存泄露

2、常见的内存泄露情况:

● 单例:生命周期很长,会引用生命周期比较短的变量,导致无法释放。例如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

apk体积优化

代码瘦身

● 移除无用代码、功能;

● 移除无用的库、避免功能雷同的库;

● 启用Proguard;

● 缩减方法数;

●第三方开源库的瘦身,仅保留自己需要的部分

资源瘦身

● 移除无用的资源文件;

● Drawable目录只保留一份资源;

● 对图片进行压缩;

● PNG转换JPG;

● 使用矢量图;

● 使用WebP;

● 资源混淆;

● 资源在线化;

● 能不用图片的就不用图片实现,用代码实现

So瘦身

● 在允许的情况下,针对用户机型分布保留特定架构的So;

耗电量

电量是移动设备非常宝贵的资源,作为一名开发者,有必要为用户着想,减少电量的消耗.调查显示通常只有30%左右的电量是被程序核心的功能所消耗,比如界面渲染,剩下的70%则是被上报数据,位置更新,后台通知所消耗.

如何检测

1、手机选项中通过查看APP的电量消耗的统计数据

2、使用Battery Historian Tool来查看详细的电量消耗

如何优化

●减少唤醒屏幕的次数与持续的时间,正确的使用WakeLock.

●延迟非必须的操作到充电状态时,比如日志上报完全可以在夜间充电时完成,这点可以结合JobScheduler使用

●使用传感器采集数据时,一旦不需要记得取消注册.

●减少网络通信,合并通信.

●合理使用定位功能,减少位置更新频率以及根据实际情况使用不同精度的定位需求

网络优化

现在App几乎都需要联网操作,做好网络优化一方面可以提高体验,另一方面可以减少流量和电量的损耗.另外,无论是对用户还是网络服务提供者,网络同样是一种资源,任何开发者都不应该假设网络资源是无限制的

如何检测

●使用Android Studio里的Network Traffic Tools来查看网络请求

●使用Android Studio中的Monitor,安卓studio3.0新的性能分析工具更方便

●使用Fidder或者Charles等抓包工具分析网络数据包

如何优化

●有必要的时候务必做好缓存,无论是图片还是普通的数据,使用LruCache和DiskLruCache构建自己的缓存系统,并根据实际场景设计缓存策略

●避免过度的网络同步,合并相关的网络请求

●根据实际场景确定请求策略,避免使用固定的间隔频率来进行网络操作.比如连接WiFi并充电的情况下请求频率可以高,第一次网络请求失败后可以使用双倍的时间间隔来进行下一次

●减少数据传输量,对传输的数据做压缩.如果传输的是图片,需要选择合适的图片格式以及根据显示大小请求合适规格的图片.对于普通数据,可以考虑使用ProtocalBuffers来减小传输数据的大小.