性能优化的目标

快

如何让 app 在运行过程过不卡顿,运行流畅,速度快,也就是说如何解决卡顿呢?我们先看看那些因素影响卡顿?

  1. UI,包括ui的绘制,刷新等

  2. 启动,包括冷启动,热启动,温启动等

  3. 跳转,页面跳转,前后台切换

  4. 及时反馈,点击事件,滑动,系统事件

UI

这个涉及到 android 的系统显示原理,我们简单了解一下:

Android 显示过程可以简单概括为:Android 应用程序把经过测量,布局、绘制后的 surface 缓存数据,通过 SurfaceFlinger 把数据渲染到显示屏幕上, 通过 Android 的刷新机制来刷新数据。也就是说应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层服务通过刷新机制把数据更新到屏幕上。

换一种方式说:Android 系统每隔 16ms 发出 VSYNC 信号,触发对 UI 进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需的 60FPS。(注:FPS 表示每秒传递的帧数。)在理想情况下,60 FPS 就感觉不到卡,这意味着每个绘制时长应该在16 ms 左右。如果某个操作花费的时间是 24ms ,系统在得到 VSYNC 信号时就无法正常进行正常渲染,这样就发生了丢帧现象。也就是延迟了,这种现象在执行动画或滑动列表比较常见,还有可能是你的 Layout 太过复杂,层叠太多的绘制单元,无法在 16ms 完成渲染,最终引起刷新不及时.

那么我们如何解决呢,主要从两点入手:ui布局,绘制优化和主线程优化?

布局优化

  • 避免ui布局优化可以先从合理使用背景色开始,比如:如果子view和父布局公用一个背景色就没有必要了。

  • 减少不必要的嵌套,一般建议不超过5层

  • 合理使用各种布局,尽量使用 LinearLayout 和 FrameLayout,因为 RelativeLayout 需要比较复杂,测绘也比较费时,强调一下这个是相对的,不是说 LinearLayout 一定比 RelativeLayout 好。

  • 合理使用 include、merge 和 ViewStub,使用include和merge增加复用,减少层级; ViewStub 按需加载。

  • 推荐使用 google 已经出来的新的布局 ConstraintLayout,这个有机会说。

绘制优化

我们之前说过根据 Android 系统显示的原理,View 的绘制频率保证 60fps 是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),因此要减轻 onDraw() 的负担。所以在绘制时要注意两点:

  1. onDraw 中不要创建新的局部对象。

  2. onDraw 方法中不要做耗时的任务。

还有就是刷新,刷新的话尽量减少不必要的刷新和尽可能减少刷新面积

启动优化

冷启动

冷启动是指安装 apk 后首次启动应用程序,或者应用程序上次结束,进程被杀死后重新打开app.

在冷启动开始时,系统有三个任务。这些任务是:

  1. 加载并启动应用程序

  2. 启动后立即显示应用程序的空白启动窗口

  3. 创建应用程序进程

当系统为我们创建了应用进程之后,会执行以下的操作:

  • application 的初始化

  • 启动 UI 线程

  • 创建 Activity

  • 导入视图(inflate view)

  • 计算视图大小(onmesure view)

  • 得到视图排版(onlayout view)

  • 绘制视图(ondraw view)

应用程序进程完成首次绘制后,系统进程会交换当前显示的背景窗口,将其替换为主活动。此时至此启动完成,用户可以使用程序(app)了,那么这里就会有两类创建:

  • Application 的创建

    当 Application 启动时,会有一个空白的启动窗口保留在屏幕上,直到系统首次完成绘制应用程序,白屏才会消失,这也是为什么启动app会出现白屏,这个问题,我也有提到过解决方式 Anroid 白屏

  • Activity的创建

    当 Application 首次启动完成绘制后,我们的 UI 线程会执行主活动进行以下操作:

    • 初始化值。

    • 执行其构造函数。

    • 执行其回调方法,比如 Activity 的 onCreate()对应生命周期的状态,onCreate() 方法做的事情越多,冷启动消耗的时间越长。暖(温)启动

暖(温)启动

暖启动比冷启动时间更短。在暖启动中,系统都会把你的 Activity 带到前台。如果应用程序的 Activity 仍然驻留在内存中,那么应用程序可以避免重复对象初始化、布局加载和渲染,但系统依然会展示闪屏页,直到第一个 Activity 的内容呈现为止。比如:当应用中的 Activities 被销毁,但在内存中常驻时,应用的启动方式就会变为暖启动 。

热启动

热启动的启动时间比暖启动还要更短。你比如,我用户 Back 退出应用程序,然后又重新启动,应用程序会再次执行 Activity 的 onCreate(),但会从 Bundle(savedInstanceState)获取数据,我们平时应用成勋崩溃,不也是通过该方法保存数据的吗。

针对启动方式的优化

Application 的创建过程中尽量少的进行耗时操作。比如:

Application 的 onCreate() 中进行友盟,bugly, okhttp,地图,推送等 init() 等操作。如果是必须在 onCreate 中进行的如:okhttp 等网络请求框架我们在 onCreate 中进行,其他的友盟,百度地图啥的我们可以等程序起来后再 onResume 方法中执行,bugly 等 sdk 可以异步加载。

在生命周期回调的方法中尽量减少耗时的操作

这个里面的优化方式就是:避免 I/O 操作、反序列化、网络操作、布局嵌套等。

省

省内存

主要是加载图片,动不动就 OOM,对于图片的压缩无非是:

  • 图片尺寸压缩

  • 图片质量压缩

此处代码省略,网上一大堆。Glide就是采用了 Lrucache 和 LruDiskCache 推荐使用。

其他

这都是本人的一些建议:

  • 序列化采用推荐的 Parcelable 代替 Serializable

  • 集合如果是插入和删除用的多,建议使用 LinkList。如果修改用的多,建议 ArrayList。

  • 写程序要思考,避免创建不必要的对象。

  • 对常量使用 static final,适用于基本类型和 String 常量。

  • 使用增强的 for 循环语法(foreach)。

  • 避免使用浮点数,浮点数比 Android 设备上的整数慢约2倍。

  • 尽可能少用 wrap_content,wrap_content 会增加布局 measure 时计算成本。

  • 删除控件中无用的属性。

  • 合理使用动画,某些情况下可以用硬件加速方式来提供流畅度,或者采用自定义view代替动画,最后记得在Activity的ondestory()方法中调用Animation.cancle()进行动画停止。

  • 注意 webview 和 handler,一般在首次加载后 webview 就会存在于内存中,容易内存泄漏。

  • 考虑 StringBuilder 代替 String

  • 数据量比较大或者内存比较宽裕考虑 HashMap,其他建议使用 SpareArray

Android----APP性能优化的更多相关文章

  1. Android APP 性能优化的一些思考

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  2. 包建强的培训课程(9):Android App性能优化

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  3. Android app 性能优化的思考--性能卡顿不好的原因在哪?

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  4. android app性能优化大汇总

    这里根据网络上各位大神已经总结的知识内容做一个大汇总,作为记录,方便后续“温故知新”. 性能指标: (1)使用流畅度:  图片处理器每秒刷新的帧数(FPS),可用来指示页面是否平滑的渲染.高的帧率可以 ...

  5. fir.im Weekly - 如何进行 Android App 性能优化

    关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...

  6. Android App 性能优化实践

    本文记录了Android App优化需要用到的工具和以及在实践中的Tips.也算对我这半年来部分工作的总结. 工具 Hierarchy Viewer 是 Android SDK 自带的 Layout ...

  7. android app性能优化大汇总(内存性能优化)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...

  8. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...

  9. android app性能优化大汇总(google官方Android性能优化典范 - 第1季)

    大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计师的角度,他们希望App能够有更多的动画,图片等时尚元素来实现流畅的用户体验.但是Android系统很有可能无法及时完成那些复杂的界 ...

  10. Android App性能优化笔记之一:性能优化是什么及为什么?

    By Long Luo   周星驰的电影<功夫>里面借火云邪神之口说出了一句至理名言:“天下武功,唯快不破”. 在移动互联网时代,同样如此,留给一个公司的窗口往往只有很短的时间,如何把握住 ...

随机推荐

  1. 破解wingide编辑器

    先到官网下载最新版的wingide(我下载的是5.1.11-1),然后安装,打开,出现下面的界面时选第三个,然后输入“ENX27-HWM6G-XYVFA-165PG”,如下图所示: 接下来你软件会给你 ...

  2. Hadoop及Zookeeper+HBase完全分布式集群部署

    Hadoop及HBase集群部署 一. 集群环境 系统版本 虚拟机:内存 16G CPU 双核心 系统: CentOS-7 64位 系统下载地址: http://124.202.164.6/files ...

  3. Codeforces Round #341 (Div. 2)A

    A. Wet Shark and Odd and Even time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  4. [ubuntu]对指定区域截图

    ctrl+shift 鼠标变成正十字. 按住右键就可以随意截图了. 设置方法: 打开系统设置面板 system settings --> keyboard -->  shortcuts - ...

  5. ACE服务端编程1:使用VS2010编译ACE6.0及从ACE5.6升级的注意事项

    ACE是一个跨平台的用于并发通信的C++框架,项目开始时使用的是ACE 5.6发布版,目前最新的ACE版本是6.3.0. 网上一直有一种黑ACE的氛围,主要黑点在于ACE的复杂和作者的背景,结合实际应 ...

  6. SQL Server作业没有执行的解决方法

    SQL Server作业没有执行的解决方法  确保SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行    设置方法:  我的电脑--控制面板--管理工具--服务--右键 SQLSE ...

  7. 关于MyBatis一些小错误,元素内容必须由格式正确的字符数据或标记组成.

    今天在Mapper.xml文件写查询语句报了个奇怪的错误 Caused by: org.apache.ibatis.builder.BuilderException: Error creating d ...

  8. vijos 1153 背包+标记

    描述 新一年度的猫狗大战通过SC(星际争霸)这款经典的游戏来较量,野猫和飞狗这对冤家为此已经准备好久了,为了使战争更有难度和戏剧性,双方约定只能选择Terran(人族)并且只能造机枪兵. 比赛开始了, ...

  9. CSS hack浏览器兼容一览表

    CSS hack是指我们为了兼容各浏览器,而使用的特别的css定义技巧.这是国外摘来的一张CSS hack列表,显示了各浏览器对css hack的支持程度,对我们制作兼容网页非常有帮助.

  10. unity ugui消息透传

    公司要做一个这东西. A是滑动区域,ScrollRect组件. B是各种选项. C是拾取到鼠标(或触点)的选项. D是拖放区域. 大概要求是这样. 因为B的条目很多,放在A里可以滑动查看.如果要选择一 ...