Android应用性能优化最佳实践导读

前  言

为什么写这本书

一个好的应用,除了要有吸引人的功能和交互之外,在性能上也应该有高的要求,即使应用非常具有特色,或者功能和业务具有唯一性,在产品前期可能吸引了部分用户,但用户体验不好的话,也会给产品带来很差的口碑,如果有在体验上更好的竞品,用户也会很快转移。那么一个好的应用应该如何定义呢?主要有三方面:

业务/功能

符合逻辑的交互

优秀的性能

众所周知,Android系统作为以移动设备为主的一款操作系统,硬件配置有一定的限制,虽然配置现在越来越高级,但仍然无法和PC相比,在CPU和内存上的使用不合理或者耗费资源多时,就会碰到内存不足导致的稳定性问题、CPU消耗太多导致的卡顿问题等。例如,我们发布一款产品后会收到很多的反馈,这些反馈来自很多渠道,有用户反馈,有应用发布平台的反馈通道等。

面对这些问题时,大家想到的都是联系用户,然后看日志,特别是有关性能类问题的反馈,原因也非常难找,日志大多用处不大,为什么呢?因为性能问题大部分是非必现的问题,定位时很难复现,而又没有关键的日志,当然就无法找到原因了。这些问题非常影响用户的体验和功能的使用,所以解决这些问题是非常重要的。当前市场上讲解性能优化的书太少,即使有些书讲到,很多也是一笔带过,没有深入分析和寻找解决方案,所以有必要用一本书来从多个维度讲解在性能上我们面临了什么问题,如何解决这些问题,并在实际的项目中来优化我们的应用,以提高用户体验。

本书面向的读者

本书适合所有Android应用开发从业人员及在校学生,特别是有一定Android应用开发经验的开发人员,高级开发人员也可以通过本书了解更多的性能调优知识。

本书特色

本书为进阶类图书,对于一些基础技术和基础理论知识不会做过多的阐述,特别是入门类的知识点,大家可以从其他书籍获取相关的知识。书中以性能优化为核心,深入剖析性能优化具体涉及的技术背景与优化方案,同时提供典型案例,帮助读者更深入地掌握Android应用开发技术,理解Android的运行机制和原理,掌握Android性能优化的思想,让开发者快速成长,打造高质量的Android应用。

本书的主要内容

可以把用户能体验到的性能问题主要总结为4个类别:

流畅

稳定

省电

省流量

性能问题的主要原因是什么,原因有相同的,也有不同的,但归根结底,不外乎内存使用、代码效率、合适的策略逻辑、代码质量这一类问题。本书讲解内容的目标和方向如下图所示。

从上图可以看到,打造一个高质量的应用应该以4个方向为目标:快、稳、省、小。

快:使用时避免出现卡顿,响应速度快,减少用户的等待时间,满足用户预期。

稳:降低crash率和ANR率,不要在用户使用过程中崩溃和无响应。

省:节省流量和耗电,减小用户使用成本,避免使用时导致手机发烫。

小:安装包小可以降低用户的安装成本。

这4类问题需要从根源上解决,也就是要解决图中第二个框里的问题:卡顿、内存使用不合理、代码质量差、代码逻辑不优秀、安装包过大。这些问题也是在开发过程中碰到最多的问题,在实现业务需求的同时,也需要考虑到这些点,多花时间去思考,避免功能完成后再来做优化和修复Bug,这个时候带来的成本会增加。如果是维护之前的代码,就需要使用一系列工具来发现问题点。

性能优化不是更新一两个版本可以解决的,是持续性的需求,结合到实际中,在一个新产品/项目开始时,由于人力和上线时间的限制,可以把优先级放低,但有些点是在写代码时就要考虑的,这就体现出程序员的技术功底。

本书强调性能调优的核心思想和方向如下:

发现问题→分析问题原因及背景→寻找最优解决方案→解决问题。

本书一共7章,在简单介绍了Android Studio的使用指南后,分别从绘制(UI)、内存、存储、稳定性、耗电以及安装包6个方面进行优化,从系统上深入分析绘制和内存的原理,一步步深入了解导致性能问题的本质原因,同时讲述了多种性能优化工具的使用,通过分析典型案例,得到有效的优化方案,从而实现更高质量的应用。书中所讲述的内容均基于Android 6.0系统。

勘误和资源下载

由于写作时间实在有限,在书稿交付时仍有些许不安,为此先为此书可能存在的错误或者描述不清楚的地方致以真诚的歉意,如果你发现此书存在瑕疵或者有任何建议,请发邮件到5482586@qq.com,我会尽快回复,非常期待大家的反馈。

本书代码的下载地址:https://github.com/lyc7898/AndroidTech。

致谢

由于时间的问题,本书写作时间非常长,非常感谢杨福川编辑对我的鼓励和宽容,并且分享了非常有用的碎片化写作方法,使我一直坚持把本书写完。同时感谢李艺编辑的校对和勘误,才完成了这本图文并茂、格式清晰的技术书籍。

感谢我的妻子李萍女士对我的理解和支持,在我几乎将所有的时间投入工作中时一直给予最大的宽容和鼓励,使我每天即使再忙再累时仍然可以回到温馨的家。同时感谢我的父母和岳父母,感谢他们对我无私的帮助,他们都是伟大的父母。

特别感谢我的爷爷罗志华老先生,在我的学习生涯中给予的无私帮助,在工作和生活上的谆谆教诲。还要感谢刘景瑜老师,在求学阶段的鼓励和教诲,告诉我有很多需要去做的事情。

最后感谢我现在工作的公司,在这里我得到了最快的成长,学习到非常多的东西,感谢公司领导及所有同事,在这里工作,能感受到大家每天都在成长。

目  录

前 言

第1章 Android Studio使用指南  

1.1 Android Studio的优势  

1.2 Android Studio使用入门 

1.3 Android Studio实用技巧  

1.4 本章小结 

第2章 绘制优化  

2.1 Android系统显示原理  

2.2 性能分析工具  

2.3 布局优化 

2.4 避免过度绘制 

2.5 启动优化 

2.6 合理的刷新机制 

2.7 提升动画性能

2.8 卡顿监控方案与实现  66

2.9 本章小结  

第3章 内存优化  80

3.1 Android内存管理机制  81

3.1.1 Java对象生命周期  81

3.1.2 内存分配  82

3.1.3 内存回收机制  84

3.1.4 GC类型  86

3.2 优化内存的意义  87

3.3 内存分析工具  90

3.3.1 Memory Monitor  90

3.3.2 Heap Viewer  91

3.3.3 Allocation Tracker  94

3.4 避免内存泄漏  96

3.4.1 内存泄漏定义  97

3.4.2 使用MAT查找内存泄漏  97

3.4.3 常见内存泄漏场景  103

3.4.4 内存泄漏监控  106

3.5 优化内存空间  109

3.5.1 对象引用  109

3.5.2 减少不必要的内存开销  110

3.5.3 使用最优的数据类型  112

3.5.4 图片内存优化  117

3.6 图片管理模块设计与实现  120

3.6.1 实现异步加载功能  121

3.6.2 实现三重缓存  130

3.6.3 开源图片组件  140

3.7 本章小结  142

第4章 存储优化  144

4.1 存储方式  144

4.1.1 SharedPreferences  145

4.1.2 文件存储  145

4.1.3 SQLite(需要扩展)  146

4.1.4 ContentProvider  147

4.2 序列化  147

4.2.1 Serializable与Parcelable  148

4.2.2 Gson实现JSON的序列化和反序列化  148

4.2.3 Nano Proto Buffers  149

4.2.4 FlatBuffers  149

4.2.5 小结  150

4.3 SharedPreferences优化  150

4.4 数据库使用及优化  151

4.4.1 数据库实现  152

4.4.2 数据库优化  157

4.5 本章小结  161

第5章 稳定性优化  162

5.1 提高代码质量  162

5.1.1 代码审查  163

5.1.2 代码静态扫描工具  166

5.2 Crash监控  168

5.2.1 Java层Crash监控  168

5.2.2 Native层Crash监控  171

5.2.3 Crash上报机制  173

5.3 ANR剖析  173

5.3.1 ANR介绍  173

5.3.2 ANR分析  174

5.3.3 ANR监控  176

5.4 提高后台进程存活率  178

5.4.1 应用进程优先级  178

5.4.2 利用SyncAdapter提高进程优先级  180

5.5 本章小结  183

第6章 耗电优化  184

6.1 耗电检测工具  184

6.2 三大模块省电优化  187

6.2.1 显示  187

6.2.2 网络  188

6.2.3 CPU  189

6.3 应用常用优化方案  191

6.3.1 计算优化  191

6.3.2 避免WakeLock使用不当  192

6.3.3 使用Job Scheduler  193

6.4 Doze模式  197

6.4.1 Doze模式介绍  197

6.4.2 Doze模式应用策略  198

6.4.3 测试Doze模式应用工作状态  199

6.5 本章小结  199

第7章 安装包大小优化  200

7.1 应用装包的构成  200

7.2 减少安装包大小的常用方案  203

7.2.1 代码混淆  203

7.2.2 资源优化  204

7.2.3 其他优化  206

7.3 本章小结  207

结束语  208

时间: 2024-10-03 04:21:37

Android应用性能优化最佳实践导读的相关文章

Android应用性能优化最佳实践.

移动开发 Android应用性能优化最佳实践 罗彧成 著 图书在版编目(CIP)数据 Android应用性能优化最佳实践 / 罗彧成著. -北京:机械工业出版社,2017.1 (移动开发) ISBN 978-7-111-55616-9 I. A- II. 罗- III. 移动终端-应用程序-程序设计 IV. TN929.53 中国版本图书馆CIP数据核字(2016)第315986号 Android应用性能优化最佳实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037

Android应用性能优化最佳实践.1.2 Android Studio使用入门

1.2 Android Studio使用入门 1.2.1 Android Studio安装 这里我们以在Windows系统上安装Android Studio为例,具体的安装步骤如下: 1)安装JDK,且为JDK 1.6及以上版本. 2)下载Android Studio安装包:developer.android.com/sdk/installing/studio.html. 3)单击安装包开始安装,首先进入选择组件界面,如图1-1所示.   图1-1 选择安装组件 一般已经安装Eclipse或其他

Android应用性能优化最佳实践.2.2 性能分析工具

2.2 性能分析工具 从前一节可以看到,Android系统在4.1以后从框架上解决了由于系统问题导致的卡顿现象,但在实际的使用过程中,在用户的感受上,卡顿仍然是应用开发中主要面临的问题,而原因从上一节的分析中也知道本质是VSync信号到来时,不能及时处理绘制事件导致,本节先抛出以下两个问题: 1)应用层做了什么会导致VSync事件不能及时处理? 2)卡顿能监控吗? 性能问题并不容易复现,也不好定位,光从几个场景不能完全覆盖所有的问题,因此在做性能优化时,最直接有效的方法,就是尽量复现存在性能问题

Android应用性能优化最佳实践.2.5 启动优化

2.5 启动优化 随着应用的功能越来越丰富.启动时需要初始化的工作多.界面的元素复杂等,启动速度不可避免地受到影响,比如一开始单击时出现黑屏或者白屏,甚至在低端机型上出现假死的现象,本节通过学习应用的启动流程.启动速度的监控,发现影响启动速度的问题所在,并优化启动的逻辑,提高应用的启动速度. 2.5.1 应用启动流程 Android应用程序的载体是APK文件,其中包含了组件和资源,APK文件可能运行在一个独立的进程中,也有可能产生多个进程,还可以多个APK运行在同一个进程中,可以通过不同的方式来

Android应用性能优化最佳实践.2.3 布局优化

2.3 布局优化 布局是否合理主要影响的是页面测量时间的多少,我们知道一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h相关,其时间复杂度为O(h),如果层级太深,每增加一层则会增加更多的页面显示时间. 任何时候View中的绘制内容发生变化时,都需要重新创建DisplayList.渲染DisplayList,更新到屏幕上等一系列操作.这个流程的表现性能取决于View的复杂程度.View的状态变化以及渲染管道的执行性能.例如,假设某个Button的大小需要增大到目前的两

Android应用性能优化最佳实践.2.1 Android系统显示原理

绘?制?优?化 Android应用启动慢,使用时经常卡顿,是非常影响用户体验的,应该尽量避免出现.卡顿的场景有很多,按场景可以分成4类:UI绘制.应用启动.页面跳转.事件响应,如 图2-1所示.在这四种场景下又有多个小分类,基本上覆盖了卡顿的各个场景.   图2-1 卡顿主要场景 这4种卡顿场景的根本原因又可以分成两大类. 界面绘制:主要原因是绘制的层级深.页面复杂.刷新不合理,由于这些原因导致卡顿的场景更多出现在UI和启动后的初始界面以及跳转到页面的绘制上. 数据处理:导致这种卡顿场景的原因是

Android应用性能优化最佳实践.2.7 提升动画性能

2.7 提升动画性能 在打造优秀体验的应用和实现酷炫效果的过程中,动画是不可或缺的重要组成部分.Android平台提供了三个动画框架:帧动画(Frame Animation).补间动画(Tween Animation)和属性动画(Property Animation).属性动画在Android 3.0开始支持,开发者使用这些动画框架来实现各种动画效果,这三个框架都有其优势和局限性,要深入了解就需要明白它们的实现原理. 属性动画只有Android API 11(Android 3.0)以上才支持,

Android应用性能优化最佳实践.1.4 本章小结

1.4 本章小结 Android Studio的安装并不复杂,首次使用可能会不适应并觉得效率甚至低于以前使用的其他IDE,但相信使用一段时间后,一定能体验到它的灵活和强大之处,同时Android Studio的技巧非常多,大家可以多从网上找到各种技巧. 古人云,"工欲善其事,必先利其器",Android应用开发者的"器"则是指Android Studio,熟练运用开发工具,能极大程度提高开发效率.在掌握Android Studio这个开发神器后,再通过接下来的章节的

Android应用性能优化最佳实践.2.4 避免过度绘制

2.4 避免过度绘制 过度绘制(Overdraw)是指在屏幕上的某个像素在同一帧的时间内被绘制了多次.在多层次重叠的UI结构(如带背景的TextView)中,如果不可见的UI也在做绘制的操作,就会导致某些像素区域被绘制了多次,从而浪费多余的CPU以及GPU资源. 当设计上追求更华丽的视觉效果时,我们很容易陷入采用复杂的多层次重叠视图来实现这种视觉效果的怪圈.这很容易导致大量的性能问题,为了获得最佳性能,必须尽量减少Overdraw情况发生. 我们一般在XML布局和自定义控件中绘制,因此可以看出导