讲到Android开发,就不得不谈一下Android的优化,不管是平时开发中我们需要注意的一些Android对Java的一些类的优化,还是实际开发中对性能的优化,其实早在15年的google全球大会上google就Android的性能优化就给我们做了很好的介绍:点击打开链接。
接下来本文从几个方面入手讲一讲Android 的优化,主要从以下几点:布局优化,绘制优化,内存优化,响应速度优化,bitmap优化(主要结合listview),线程优化,其他常用性能优化;内存检测工具mat分析与提高。
为了达到优化的目的,我们先来看看应用市场的现状和优化需要从哪些方面着手优化。
应用现状
l 约60%应用冷启动时间超过2S
l SDK的不合理使用(基础类型和装箱类型、HashMap和SparseArray)
l 在系统回调或频繁调用的代码块中创建新的实例
l 几乎所有的APP都存在过渡绘制问题,Activity和Window都设置了背景
l json库的不合理使用,导致Launcher严重卡顿
l 近10个应用监听开机广播,导致开机后一段时间内Launcher严重卡顿
l 应用内存占用不合理(适配不规范、缓存不合理、回收不及时)
l 系统SDK导致的内存泄漏(InputMethodManager、WebView,AndroidExcludedRefs.java等)
l 非静态内部类导致的内存泄漏(Handler、Observer、AsyncTask)
l 四大组件的Context和ApplicationContext的不合理使用
l IO操作完成后没有关闭文件(Cursor、TypedArray、File等)
l 功耗问题明显(循环动画、过渡绘制、网络请求不合理、后台服务常驻等)
性能优化指标
- 不能凭感觉,要看数据说话,有足够多的测量
- 尽量使用低配置设备进行测试
- 权衡利弊,以保证进度、稳定为主
- 改善后一定要验证,保证每一次改善都有效,不会导致其它问题
性能优化步骤
常用性能优化方案
AS Inspect Code
- Inspect Code检测出来的常见的错误有:
- Missing translations (and unused translations) 没有翻译的文本
- Layout performance problems (all the issues the old layoutopt tool used to find, and more) 布局性能
- Unused resources未使用的冗余资源
- Inconsistent array sizes (when arrays are defined in multiple configurations)在多个配置中的数组大小不一致文件
- Accessibility and internationalization problems (hardcoded strings, missing contentDescription, etc)
- Icon problems (like missing densities, duplicate icons, wrong sizes, etc)
- Usability problems (like not specifying an input type on a text field)
- Manifest errors
AS Performance Monitor(性能监视器)
AS Data Analysis
使用步骤如下:
- 打开app,手动触发GC;
- 内存降低
- 点击memory useage选项查看当前进程的内存和组件使用情况
- 生成内存占用的文案,然后分析
过渡绘制
蓝色1x过度绘制
绿色2x过度绘制
淡红色3x过度绘制
红色超过4x过度绘制,3,验收标准:
控制过度绘制为2x
不允许存在4x过度绘制
不允许存在面积超过屏幕1/4区域的3x过度绘制(淡红色区域)
- 移除不必要的background
- 减少不必要的层次:巧用Hierarchy Viewer
StrictMode
- 自定义的耗时调用 使用detectCustomSlowCalls()开启
- 磁盘读取操作 使用detectDiskReads()开启
- 磁盘写入操作 使用detectDiskWrites()开启
- 网络操作 使用detectNetwork()开启
- Activity泄露 使用detectActivityLeaks()开启
- 未关闭的Closable对象泄露 使用detectLeakedClosableObjects()开启
- 泄露的Sqlite对象 使用detectLeakedSqlLiteObjects()开启
- 检测实例数量 使用setClassInstanceLimit()开启