Android应用性能调优的技术点

原创 2016年08月30日 12:52:35

前言

其实性能调优涉及到多方面的工作,一晚上也只能想到这么多,而且都是一些老生常谈、炒冷饭的东西,在这里一起总结出来供大家参考。

目前也只能想起来这么多,还请大家有其他好的建议分享出来。

使用异步

  • 保持APP的高度响应,不要在UI线程做耗时操作,多使用异步任务
  • 使用线程时要做好线程控制;使用队列、线程池
  • 谨慎使用糟糕的AysncTask、Timer
  • 警惕异步任务引起的内存泄露
  • 应该异步任务分类,比如HTTP,图片下载,文件读写,每一类的异步任务维护一个任务队列,而不是每一 个任务都开一个线程(Volley表示我一个可以搞定这些全部 (:з」∠))
  • 这些常用的任务应该做好优先级处理(一般JSON数据优先于图片等静态数据的请求)
  • 一般异步任务应该开启一个SingleAsyncTask,保证一时只有一个线程在工作
  • HTTP和图片下载尽量使用同一套网络请求
  • 使用MVP模式规范大型Activity类的行为,避免异步任务造成的内存泄露

避免内存泄露

  • 了解虚拟机内存回收机制
  • 频繁GC也会造成卡顿,避免不必要的内存开销
  • 错误的引用姿♂势造成的内存泄露(啊~要泄了~)
  • 常见的Activity泄露(单例、Application、后台线程、无限动画、静态引用)
  • Bitmap泄露(HoneyComb这个问题之前压力好大)
  • 尽量使用IntentService代替Service,前者会自动StopItself
  • 排查内存泄露问题的方法(我一直以来都是简单暴力的人肉dump检查大法)
  • 使用LeakCanary自动检查Activity泄露问题
  • 对内存负载要保持敏感(Sharp)

视图优化

  • 布局优化、减少层次,Include Merge
  • 使用ViewStub避免不必要的LayoutInflate,使用GONE代替重复LayoutInflate同一个布局
  • 避免过度绘制,应该减少不必要的布局背景;布局层次太深会造成过度绘制以及Measure、Layout等方法时间复杂度的指数增长
  • 使用过渡动画,比如给图片的呈现加一个轻量的淡入效果会让视觉上变得流畅许多
  • 避免过度的动画,不要让一个界面同时出现多出动画,比如List滚动时Item项要停止播放动画或者GIF
  • 复杂动画使用SurfaceView或TextureView
  • 尽量提供多套分辨率的图片,使用矢量图

Adapter优化

  • 复用convertView,用ViewHolder代替频繁findViewById
  • 不要重复setListener,要使用v.getId来复用Listener,不然会创建一堆Listener导致频繁GC
  • 多布局要采用MutilItemView,而不是使用一个大布局然后动态控制需要现实的部分
  • 不要在getView方法做做耗时的操作
  • 快速滚动列表的时候,可以停止加载列表项的图片,停止列表项的动画,不要在这时候改变列表项的布局
  • 尽量用RecyclerView(增量Notify和RecycledViewPool带你飞)

代码优化

  • 算法优化,减少时间复杂度,参考一些经典的优化算法
  • 尽量使用int,而不是float或者double
  • 尽量采用基本类型,避免无必要的自动装箱和拆箱,浪费时间和空间
  • 选用合适的集合类(尽量以空间换时间)、选用Android家的SparseArray,SparseBooleanArray和LongSparseArray
  • 避免创建额外的对象(StringBuilder)
  • 使用SO库完成一些比较独立的功能(高斯模糊)
  • 预处理(提前操作)一些比较耗时的初始化工作统一放到启动图处理
  • 懒加载(延迟处理)规避Activity的敏感生命周期
  • Log工具类,要在编译时删掉调试代码,而不是在运行时通过判断条件规避
  • 优先使用静态方法、公有方法还是私有方法?速度区别很大哦
  • 类内部直接对成员变量进行操作,不要使用getter/setter方法,调用方法耗额外的时间
  • 给内部类访问的外部类成员变量要声明称包内可访问,而不是私有,不然编译的时候还是会自动创建用于访问外部类成员变量的方法
  • 遍历集合时,使用i++代替Iterator,后者需要额外的对象操作,应在循环体内避免这种情况
  • 如果一个基本类型或者String的值不会改变,尽量用final static,编译时会直接用变量的值替换变量,也就不需要在查询变量的值了

其他优化

  • 数据库优化:使用索引、使用异步线程
  • 网络优化 …… 一堆优秀的轮子
  • 避免过度使用依赖注入框架,大量的反射
  • 不过过度设计/抽象,多态看起来很有设计感,代价就是额外的代码、空间、时间
  • 尽量不要开启多进程,进程的开销很大

APK瘦身

  • 开启混淆
  • 使用zipalign工具优化APK
  • 适当有损图片压缩、使用矢量图
  • 删除项目中冗余的资源,之前写过一些删除没有res资源的脚本
  • 动态加载模块化,项目拆分啊!

性能问题的排查方法

  • GPU条形图,没事开来看看淘宝
  • 过度绘制颜色,嗯,不要一篇姨妈红就好
  • LeakCanary,自动检测Activity泄露,挺好用的
  • TraceView(Device Monitor),Systrace,分析哪些代码占用的CPU时间太大,屡试不爽
  • Lint,检查不合理的res资源
  • layoutopt(还是optlayout?),对当前布局提出优化建议,已被lint替代,但是还能用
  • HierarchyViewer,查看手机当前界面的布局层次,布局优化时常用(只用于模拟器,真机上用要ROOT,不想ROOT加得使用ViewServer)
  • StrictMode,UI操作、网络操作等容易出现性能问题的地方,如果出现异常情况StrictMode会报警

欢迎大家补充其他的一些优化方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011179438/article/details/52368283

ANDROID应用性能调优的技术点

ANDROID应用性能调优的技术点 作者:魔法使Kaede 链接:https://zhuanlan.zhihu.com/p/20326073 来源:知乎 著作权归作者所有。商业转载请联系作者获...
  • qq_31552755
  • qq_31552755
  • 2016-07-20 11:42:34
  • 163

Android 性能调优的技术点

要点 使用异步 保持 APP 的高度响应,不要在 UI 线程做耗时操作,多使用异步任务使用线程时要做好线程控制;使用队列、线程池谨慎使用糟糕的 AysncTask 、 Timer警惕异步任务引起的...
  • y505772146
  • y505772146
  • 2015-11-10 16:20:12
  • 342

Android技术点笔记--(安装应用和卸载应用广播)

Android技术点笔记--(安装应用和卸载应用广播)前言:总结Android中安装应用和卸载应用的广播使用。 android系统中,安装和卸载都会发送出相应的广播,当应用安装完成后系统会发andro...
  • gao_chun
  • gao_chun
  • 2015-11-23 15:03:58
  • 4144

2.1.2 android 项目技术点

技术点 实现方式 说明 项目的总体框架 主要的设计模式,使用的第三方框架 从整体说明项目的代码结构和设计思路 网络实现 ...
  • Rodulf
  • Rodulf
  • 2016-02-25 10:31:32
  • 653

Javascript常见技术点

前台技术容易上手,掌握主要账务一些细碎的技术点会给开发带来更大的便利。本文章持续更新,用于记录常见的javascript技术点, 1、javascript面向对象中继承实现 javascript面向...
  • liuyuwen11
  • liuyuwen11
  • 2013-10-30 16:39:51
  • 3796

Android高性能编程(1)--基础篇

关于专题       本专题将深入研究Android的高性能编程方面,其中涉及到的内容会有Android内存优化,算法优化,Android的界面优化,Android指令级优化,以及Android应用内...
  • litton_van
  • litton_van
  • 2014-03-21 11:15:48
  • 7528

Android开发技术点

Android通用流行框架大全: 1.缓存:DiskLruCache。 Java实现基于LRU的磁盘缓存。 Github地址:https://github.com/JakeWharton/Dis...
  • Jack_Chen3
  • Jack_Chen3
  • 2016-05-29 11:56:24
  • 2387

数据库性能调优.原理与技术2 - 中文电子书

  • 2009年06月29日 16:10
  • 5MB
  • 下载

Android 项目技术点

  • 2016年02月25日 10:22
  • 13KB
  • 下载

汽车电子 3C 行业应用点胶机技术参数

自动化技术的不断进步,人们对于点胶行业的要求也越来越高,FMM直线模组采用美国Parker直线电机,集成了传感器,高性能光栅或磁栅编码器可直接实现直线运动的成套产品,方便使用。其低摩擦使用寿命长,高性...
  • fastermotion
  • fastermotion
  • 2017-09-06 11:31:35
  • 167
收藏助手
不良信息举报
您举报文章:Android应用性能调优的技术点
举报原因:
原因补充:

(最多只允许输入30个字)