Android应用性能优化最佳实践.html.pdf
《Android应用性能优化最佳实践.html.pdf》由会员分享,可在线阅读,更多相关《Android应用性能优化最佳实践.html.pdf(28页珍藏版)》请在三一文库上搜索。
1、前言 为什么写这本书 一个好的应用,除了要有吸引人的功能和交互之外,在性能上也应该有高的要求,即使应用非常具有特色,或者功能和业务具有唯一性,在产品前期可能吸引了部分 用户,但用户体验不好的话,也会给产品带来很差的口碑,如果有在体验上更好的竞品,用户也会很快转移。那么一个好的应用应该如何定义呢?主要有三方面: 业务/功能 符合逻辑的交互 优秀的性能 众所周知,Android系统作为以移动设备为主的一款操作系统,硬件配置有一定的限制,虽然配置现在越来越高级,但仍然无法和PC相比,在CPU和内存上的使用不 合理或者耗费资源多时,就会碰到内存不足导致的稳定性问题、CPU消耗太多导致的卡顿问题等。例如
2、,我们发布一款产品后会收到很多的反馈,这些反馈来自很多渠 道,有用户反馈,有应用发布平台的反馈通道等。 面对这些问题时,大家想到的都是联系用户,然后看日志,特别是有关性能类问题的反馈,原因也非常难找,日志大多用处不大,为什么呢?因为性能问题大部分是 非必现的问题,定位时很难复现,而又没有关键的日志,当然就无法找到原因了。这些问题非常影响用户的体验和功能的使用,所以解决这些问题是非常重要的。当前市 场上讲解性能优化的书太少,即使有些书讲到,很多也是一笔带过,没有深入分析和寻找解决方案,所以有必要用一本书来从多个维度讲解在性能上我们面临了什么问 题,如何解决这些问题,并在实际的项目中来优化我们的应
3、用,以提高用户体验。 本书面向的读者 本书适合所有Android应用开发从业人员及在校学生,特别是有一定Android应用开发经验的开发人员,高级开发人员也可以通过本书了解更多的性能调优知识。 本书特色 本书为进阶类图书,对于一些基础技术和基础理论知识不会做过多的阐述,特别是入门类的知识点,大家可以从其他书籍获取相关的知识。书中以性能优化为核心, 深入剖析性能优化具体涉及的技术背景与优化方案,同时提供典型案例,帮助读者更深入地掌握Android应用开发技术,理解Android的运行机制和原理,掌握Android 性能优化的思想,让开发者快速成长,打造高质量的Android应用。 本书的主要内容
4、 可以把用户能体验到的性能问题主要总结为4个类别: 流畅 稳定 省电 省流量 性能问题的主要原因是什么,原因有相同的,也有不同的,但归根结底,不外乎内存使用、代码效率、合适的策略逻辑、代码质量这一类问题。本书讲解内容的目标 和方向如下图所示。 从上图可以看到,打造一个高质量的应用应该以4个方向为目标:快、稳、省、小。 快:使用时避免出现卡顿,响应速度快,减少用户的等待时间,满足用户预期。 稳:降低crash率和ANR率,不要在用户使用过程中崩溃和无响应。 省:节省流量和耗电,减小用户使用成本,避免使用时导致手机发烫。 小:安装包小可以降低用户的安装成本。 这4类问题需要从根源上解决,也就是要解
5、决图中第二个框里的问题:卡顿、内存使用不合理、代码质量差、代码逻辑不优秀、安装包过大。这些问题也是在开发过 程中碰到最多的问题,在实现业务需求的同时,也需要考虑到这些点,多花时间去思考,避免功能完成后再来做优化和修复Bug,这个时候带来的成本会增加。如果是维 护之前的代码,就需要使用一系列工具来发现问题点。 性能优化不是更新一两个版本可以解决的,是持续性的需求,结合到实际中,在一个新产品/项目开始时,由于人力和上线时间的限制,可以把优先级放低,但有些 点是在写代码时就要考虑的,这就体现出程序员的技术功底。 本书强调性能调优的核心思想和方向如下: 发现问题分析问题原因及背景寻找最优解决方案解决问
6、题。 本书一共7章,在简单介绍了Android Studio的使用指南后,分别从绘制(UI)、内存、存储、稳定性、耗电以及安装包6个方面进行优化,从系统上深入分析绘制 和内存的原理,一步步深入了解导致性能问题的本质原因,同时讲述了多种性能优化工具的使用,通过分析典型案例,得到有效的优化方案,从而实现更高质量的应用。 书中所讲述的内容均基于Android 6.0系统。 勘误和资源下载 由于写作时间实在有限,在书稿交付时仍有些许不安,为此先为此书可能存在的错误或者描述不清楚的地方致以真诚的歉意,如果你发现此书存在瑕疵或者有任何建 议,请发邮件到,我会尽快回复,非常期待大家的反馈。 本书代码的下载地
7、址:https:/ 致谢 由于时间的问题,本书写作时间非常长,非常感谢杨福川编辑对我的鼓励和宽容,并且分享了非常有用的碎片化写作方法,使我一直坚持把本书写完。同时感谢李艺 编辑的校对和勘误,才完成了这本图文并茂、格式清晰的技术书籍。 感谢我的妻子李萍女士对我的理解和支持,在我几乎将所有的时间投入工作中时一直给予最大的宽容和鼓励,使我每天即使再忙再累时仍然可以回到温馨的家。同时 感谢我的父母和岳父母,感谢他们对我无私的帮助,他们都是伟大的父母。 特别感谢我的爷爷罗志华老先生,在我的学习生涯中给予的无私帮助,在工作和生活上的谆谆教诲。还要感谢刘景瑜老师,在求学阶段的鼓励和教诲,告诉我有很多 需要去
8、做的事情。 最后感谢我现在工作的公司,在这里我得到了最快的成长,学习到非常多的东西,感谢公司领导及所有同事,在这里工作,能感受到大家每天都在成长。 第1章 Android Studio使用指南 假设我们要选择一个IDE来开发应用,目前主流的IDE有Eclipse、Android Studio、Idea,在2015年前,这三个IDE各有优缺点,但现在,Android Studio是首选, 因为随着Google对Android Studio的大力完善和支持,优势已经越来越明显,但目前仍有不少开发人员在使用Eclipse。为什么要首选Android Studio,它有什么优势, 具体要如何使用,本章
9、将逐一揭示。 提示 本书的例子都是使用Android Studio开发的。 1.1 Android Studio的优势 为什么本书要推荐使用Android Studio呢,Android Studio的核心是一个智能代码编辑器,可进行高级代码完成、重构和调试。这款功能强大的代码编辑器可以帮 助你成为更高产的Android应用开发人员。虽然Android发布初期有很多bug,功能也不完善,但随着版本的更新,已经在各方面领先其他IDE,下面列出了Android Studio的几点优势。 稳定速度快:使用Eclipse的开发人员都会碰到突然假死、卡顿、内存占用高等一系列影响开发效率的老问题,Andr
10、oid Studio在这块性能上得到了明显的提升,并且 Android Studio使用了单项目管理模式,在启动速度上明显比Eclipse快。 功能强大的UI编辑器:集合了Eclipse+ADT的优点,并且能更实时地展示界面布局效果。 完善的插件管理:Android Studio支持了多种插件,可直接在插件管理中下载所需的插件。 完善地支持多种代码管理工具:不需要任何操作,直接支持SVN、Git等主流的代码管理工具。 整合了Gradle构建工具:Gradle继承了Ant的灵活性和Maven的生命周期管理,不使用XML作为配置文件格式,采用了DSL格式,使得脚本更加灵活简洁。 智能:智能保存,智
11、能补齐,在实际的编辑代码中熟练使用后,可极大提高代码编写效率。 内置终端:不需要自己打开一个终端来使用ADB等工具。 谷歌官方支持:是Google官方专门为Android应用开发打造的利器,也是目前Google官方唯一推荐,并且不再支持其他IDE。 Android Studio的更多优势会在开发工作的细节中体现出来,可以参考一些Android Studio的使用书籍和文档,以便了解它的强大之处。 1.2 Android Studio使用入门 1.2.1 Android Studio安装 这里我们以在Windows系统上安装Android Studio为例,具体的安装步骤如下: 1)安装JDK,
12、且为JDK 1.6及以上版本。 2)下载Android Studio安装包: 3)单击安装包开始安装,首先进入选择组件界面,如图1-1所示。 图1-1 选择安装组件 一般已经安装Eclipse或其他Android开发环境的,只需要安装默认的选项(Android Studio)即可。 4)单击Next,如果已经下载过SDK,并且在前面的组件没有选择安装SDK,会弹出一个设置本地SDK的界面,选择本地SDK目录,如图1-2所示。 图1-2 选择SDK目录 5)一直单击Next,直到安装完成,单击Finish,首次启动Android Studio会有一个配置的过程,需要等待一下。 因为本书主要是讲性
13、能优化,所以这里只是简单地介绍下基本的安装。需要了解更多安装细节,可以参考Android开发官网的详细介绍文档: http:/ 注意 如果首次启动出现错误导致启动失败,一般来说是因为联网下载一些配置文件失败,可以使用记事本打开studio的安装目录下/bin中的idea.properties文件, 在最后一行添加disable.android.first.run=true。 1.3 Android Studio实用技巧 1.3.1 代码管理 Android Studio支持Git、SVN等主流的源码管理工具,让开发者可以不用离开Android Studio就可以提交和管理代码。我们熟悉的开源社
14、区Github上的项目就是使 用Git来管理的,下面是使用Android Studio把本地代码托管到Github上的流程。 1)在本地安装Git,可以从官网下载安装包:https:/git- 2)配置FileSettingVersion Control,分别配置Git目录(安装路径下Bin目录的GIt.exe文件)和GitHub账号(没有GitHub账号则需要先申请,开源项目都是免 费使用的),如图1-6所示。配置完后可以单击测试按钮,配置没有问题就弹出测试成功提示框。 图1-6 配置代码管理工具Git 3)初始化Git项目:选择菜单栏CVSEnable Control Integratio
15、n,在弹出的配置对话框中选择Git,完成后工具栏会新增如图1-7所示的快捷工具。 图1-7 VCS快捷工具 4)如果需要过滤掉不需要上传的文件或者目录,可以在FileSettingVersionControlIgnored Files中选择不需要同步的文件或文件夹,如图1-8所示,也可以 通过修改项目目录下的.gitigonre文件来实现。建议使用前者,因为根据笔者实际的使用经验,修改.gitigonre文件有时会失效,而且管理也没有前者方便。 图1-8 过滤不需要同步的文件/文件夹 注意 可以通过选择VCSGitCompare With Branch,指定Branch(分支)和本地代码做比较
16、。提交前可以双击需要提交的文件来对比改动代码行。 5)同步代码到Github:选择VCSImport into Version ControlShare Project on GitHub,如图1-9所示。 6)在图1-9中,单击Share按钮,弹出提交文件列表(可以看到前面过滤的文件不在列表内),同步完成后就可以在Github上看到我们同步的项目了。 图1-9 同步代码到Github 7)后面需要提交代码,首先提交,然后选择VCSGitPush,即可同步代码到GitHub。 1.4 本章小结 Android Studio的安装并不复杂,首次使用可能会不适应并觉得效率甚至低于以前使用的其他ID
17、E,但相信使用一段时间后,一定能体验到它的灵活和强大之处,同 时Android Studio的技巧非常多,大家可以多从网上找到各种技巧。 古人云,“工欲善其事,必先利其器”,Android应用开发者的“器”则是指Android Studio,熟练运用开发工具,能极大程度提高开发效率。在掌握Android Studio这个开发神器后,再通过接下来的章节的学习,从UI性能、内存、稳定性等多个维度的优化,使Android应用程序更加高效、流畅地运行,从而打造出一款高质量 的Android应用。 第2章 绘制优化 Android应用启动慢,使用时经常卡顿,是非常影响用户体验的,应该尽量避免出现。卡顿的
18、场景有很多,按场景可以分成4类:UI绘制、应用启动、页面跳转、事 件响应,如图2-1所示。在这四种场景下又有多个小分类,基本上覆盖了卡顿的各个场景。 图2-1 卡顿主要场景 这4种卡顿场景的根本原因又可以分成两大类。 界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在UI和启动后的初始界面以及跳转到页面的绘制上。 数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据处理在UI线程(这种应该避免),二是数据处理占用CPU高,导致主线程拿不 到时间片,三是内存增加导致GC频繁,从而引起卡顿。 本章主要通过优化UI界面编程来减少卡顿,
19、以场景为纬度,通过工具深入分析症结所在,找到导致问题的根本原因,利用涉及的相关技术背景,以及了解当前业内主 流解决方案,然后结合实例来找到最终的优化方案,使应用流畅。 引起卡顿的原因有很多,但不管怎么样的原因和场景,最终都是通过设备屏幕上的显示来到达用户,归根到底就是显示有问题,所以,要解决卡顿,就要先了解 Android系统的显示原理。 2.1 Android系统显示原理 说到显示原理,相信大家从网上或其他书籍上看过相关的知识,但大部分人看得云里雾里,是因为整个显示系统很复杂吗?确实很复杂,但我们只需要了解整体流 程,抓住关键知识,从应用角度上来讲,需要掌握的不多,如果自己有兴趣,可以阅读专
20、门介绍系统框架的书籍,结合源码来分析,这里就不过多地介绍系统层的知识 了。下面我们首先介绍在应用开发上需要涉及的知识点和整体流程。 Android的显示过程可以简单概括为:Android应用程序把经过测量、布局、绘制后的surface缓存数据,通过SurfaceFlinger把数据渲染到显示屏幕上,通过 Android的刷新机制来刷新数据。也就是说应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层服务通过刷新机制把 数据更新到屏幕。 通过阅读Android系统的源码可以了解显示的流程,Android的图形显示系统采用的是Client/Server架构。
21、SurfaceFlinger(Server)由C+代码编写。Client端代 码分为两部分,一部分是由Java提供给应用使用的API,另一部分则是由C+写成的底层具体实现。下面通过介绍绘制原理和刷新机制来学习整个显示过程。 2.2 性能分析工具 从前一节可以看到,Android系统在4.1以后从框架上解决了由于系统问题导致的卡顿现象,但在实际的使用过程中,在用户的感受上,卡顿仍然是应用开发中主要面 临的问题,而原因从上一节的分析中也知道本质是VSync信号到来时,不能及时处理绘制事件导致,本节先抛出以下两个问题: 1)应用层做了什么会导致VSync事件不能及时处理? 2)卡顿能监控吗? 性能问
22、题并不容易复现,也不好定位,光从几个场景不能完全覆盖所有的问题,因此在做性能优化时,最直接有效的方法,就是尽量复现存在性能问题的场景,并监 控此过程中程序的执行流程,如果能够方便地分析程序中函数的调用关系和执行时间,自然也就很容易找出性能瓶颈。 分析问题和确认问题是否解决,都借助了相应的调试工具,比如查看Layout层次的Hierarchy View、Android系统上带的GPU Profile工具和静态代码检查工具Lint 等。这些工具对性能优化都起到非常重要的作用。本节将介绍这些工具和另外两个性能优化非常重要的工具:TraceView和Systrace。这两个工具除了在UI上,对于在后
23、面将要讲到的启动优化、动画优化等上都是很重要的工具,可以说大部分的性能分析都离不开这几个工具,接下来学习几个常用的与流畅度优化相关的工具的使用方法, 在后面实际的优化方案中也会介绍其他辅助工具。 2.3 布局优化 布局是否合理主要影响的是页面测量时间的多少,我们知道一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h相关,其时间复 杂度为O(h),如果层级太深,每增加一层则会增加更多的页面显示时间。 任何时候View中的绘制内容发生变化时,都需要重新创建DisplayList、渲染DisplayList,更新到屏幕上等一系列操作。这个流程的表现性能取决于View的复杂
24、程 度、View的状态变化以及渲染管道的执行性能。例如,假设某个Button的大小需要增大到目前的两倍,在增大Button大小之前,需要通过父View重新计算并摆放其他子 View的位置。修改View的大小会触发整个HierarcyView的重新计算大小的操作。如果是修改View的位置,则会触发HierarchView重新计算其他View的位置。如果布局 很复杂,就很容易导致严重的性能问题。 在优化前首先讲解两个布局优化的常用工具。 2.4 避免过度绘制 过度绘制(Overdraw)是指在屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构(如带背景的TextView)中,如果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 应用 性能 优化 最佳 实践 html
链接地址:https://www.31doc.com/p-5519003.html