前 言
为什么写这本书
一个好的应用,除了要有吸引人的功能和交互之外,在性能上也应该有高的要求,即使应用非常具有特色,或者功能和业务具有唯一性,在产品前期可能吸引了部分用户,但用户体验不好的话,也会给产品带来很差的口碑,如果有在体验上更好的竞品,用户也会很快转移。那么一个好的应用应该如何定义呢?主要有三方面:
业务/功能
符合逻辑的交互
优秀的性能
众所周知,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.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