
本书旨在为Android开发者指明提高应用程序性能的方向。第1章就什么是高性能,为什么需要高性能展开讨论。第2章为读者展示了一些用于调试应用程序的工具,方案以及技巧。第3-8章,围绕着布局,内存,多线程,网络,安全,电量消耗,等多个方面,阐述如何打造高性能应用程序。第9章相对独立,介绍的是原生开发。第10章与前面章节的关系也不大,涵盖了一些琐碎,但对性能至关重要的提示,例如,图像处理,序列化,优化APK文件等等。
序言 应用程序在移动世界中能否成功,性能是其中一个关键的因素。如果一个应用程序运行缓慢,用户可能会放弃继续使用它。学习如何创建一个应用程序,让程序在速度、性能,以及功能交互之间达到平衡,将会是一个挑战。做到这点比以往任何时候都更重要。 《Android高性能编程》将让你学习到如何让程序能够运行到尽可能多的硬件设备上,使得应用程序覆盖更多用户。这本书首先简要地介绍了Android开发中一些最先进的技术,以及性能对Android应用程序的重要性。接着,介绍了使用Android SDK工具,对Android应用程序进行调试和分析的常规做法。本书将讨论一些先进的主题,例如,打造布局、多线程、网络以及安全。电池电量是应用程序的最大瓶颈之一,本书将通过典型的代码,阐释如何减少电量消耗,以及在不同情形下如何测量电量的消耗。 本书探讨的技术,是为打造一个优化高效的系统。这是一个不会消耗大量电量,或引起内存泄露,随着时间的推移,运行越来越慢的系统。 这本书涵盖了什么 第1章,引言:为什么需要高性能?对主题进行概要介绍,简要分析了Android平台的现状,以及高性能对Android应用程序的重要性。 第2章,高效调试。涵盖了调试和分析Android应用程序常用的一些工具, 不仅限于Android SDK 所提供的,还包括一些第三方的。 第3章,打造布局。展示优化Android程序的相关技术,编写内存高效的应用程序,并介绍内存分配以及垃圾回收的相关概念。 第4章,内存。提供了许多UI设计方面的见解,通过学习这些内容,打造加载迅速,更新高效,不会令用户察觉到延迟的UI界面。 第5章,多线程。介绍了Android应用程序中可供使用的各种线程,以及它们特定的使用场景。一些先进的技术,例如IPC,将会通过代码示例来展示。 第6章,网络。介绍了高效操作网络的相关技术,以及从服务端获取数据的一些技术,例如指数退避算法或避免轮询。 第7章,安全。涵盖了确保Android应用程序安全的相关技术,如何利用Android自带的安全加密机制,以及如何获取关于连接的信息,或者只是在连接变化的时候得到通知。 第8章,优化电量消耗。通过典型的代码,演示如何耗尽电池的电量,如何阻止它,以及在各种情形下如何权衡电量的消耗;许多开发者不知道,开发一个拍照或录制视频的应用程序时,任何处理预览以及保存数据。 第9章,Android中的原生代码。这一章节将全部用于介绍Android中的原生代码和C++以及它们的用法。 第10章,性能提示。帮助开发者在平时的开发中,避开影响效率的方案;这是前面章节中未涉及的一个最佳实践指南。 你需要准备什么? 你需要准备以下硬件设备。 ? 运行环境为Windows、Linux,或者Mac OS X 的PC/笔记本电脑。 ? Android手机。最好是高端一点的,并且系统版本高于Android5.0。 这本书为谁而写? 这本书是为那些已经拥有丰富Android知识,想要进一步巩固和学习技术,来提高应用程序性能的开发者而写的。我假设他们已经熟悉整个Android SDK,且为此工作了多年。他们也熟悉Android框架,比如,能使用NDK编写原生代码,NDK对性能来说至关重要。 约定 本书会涉及几种不同的文本样式,分别代表不同类型的信息。下面展示了其中一些样式及它们代表的意思。 代码文本、数据库表名、文件名、文件扩展名、路径、URLs、用户输入,以及推特账号名的文本样式如下。 “If you go to this folder and call the command adb, you will see on the screen a list of available options.” 代码块的格式如下。 <resources> <style name=”Theme.NoBackground”parent=”android:Theme”> <item name=”android:windowBackground”>@null</item> </style> </resources> 任何命令行输入输出的格式如下。 adb shell dumbsys gfxinfo <PACKAGE_NAME> 新条款以及重要的词会以黑体展示。屏幕上显示的单词,例如菜单或者对话框内出现的文本格式类似这样:“To debug the overdraw on the device,Android provides a helpful tool that can be enabled inside the Developer options.” 警告或重要提示或出现这样一个框框中。 提示及小技巧会以这样的形式出现。 读者反馈 欢迎读者反馈。你对这本书的看法——喜欢或者不喜欢。读者的反馈对我们来说非常重要,它能最大程度地帮助我们写出读者需要的内容。 发送邮件到feedback@packtpub.com,并在邮件的标题中附上书名,即可给我们反馈。 如果你对某个主题有丰富的经验并且有兴趣写作或者参与对某本书的编写,可以查看我们的作者引导页面www.packtpub.com/authors。 客服支持 很高兴您成为Packt系列丛书的拥有者,为此,我们会为您提供一系列服务。 下载示例代码 可以到http://www.packtpub.com登录账户,下载本书的示例代码文件。如果你从别处购买本书,可以访问http://www.packtpub.com/support并注册,我们会通过邮件直接将文件发送给你。 你可以通过下列步骤下载代码文件。 1.到我们的网站登录或注册。 2.点击网站顶部的SUPPORT tab页面。 3.点击Code Downloads & Errata。 4.在搜索框中输入书本的名字。 5.选中你要下载代码的对应的图书。 6.在下拉菜单中选择图书的购买地。 7.点击Code Download。 可以在Packt 出版社网站对应的书本页面,点击Code Files按钮来下载本书的代码文件。书本页面可以通过搜索框中输入书本名进入。注意,前提是你需要登录你的Packt账户。 文件下载好后,请确使用的解压工具是最新版本。 ? Windows使用WinRAR / 7-Zip ? Mac 使用 Zipeg / iZip ? Linux 使用 7-Zip / PeaZip 这本书的代码也存放在GitHub上https://github.com/PacktPublishing/ Android-High-Performance-Programming。 同时,我们也有其他丰富的代码、书本目录、视频等可以提供给你。 https://github.com/PacktPublishing/。 欢迎下载它们! 下载本书的彩图 我们也为你提供了本书所用到的截屏和图表。这些彩图更利于你理解和区别代码结果的变化。你可以在以下网址中下载这些文件 http://www.packtpub.com/sites/default/files/downloads/AndroidHighPerformanceProgramming_ColorImages.pdf。 勘误 尽管我们已经非常仔细,以确保书本内容的准确性,但是错误难免还是会发生。如果你在书中遇到一个错误(可能是一个文本错误或者代码错误),如果你能报告给我们,我们不甚感激。这样做能够减少对其他读者的困扰并能帮助我们在后续版本中改进这些问题。如果你遇到任何错误,请访问http://www.packtpub.com/submit-errata,选择你要报告的图书中,点击Errata Submission Form链接,输入你所遇到错误的详细信息,发送给我们。一旦错误被确认,你所提交的内容会被接受,并且更新到我们网站中,或者添加到要报告的图书中已有的相应章节下的勘误表中。 通过访问https://www.packtpub.com/books/content/support并输入图书名进行搜索,可以查看之前已经提交的勘误。相关的信息将会出现在Errata部分中。 版权保护 对互联网上所有的媒体资源来说,版权保护一直以来都是一个问题。Packt出版社十分重视对版权和许可证的保护。如果你在互联网上遇到以任何形式非法盗版我们内容的情况,请立刻为我们提供地址或网站名,以便我们及时补救。 请将涉嫌盗版的材料的链接地址发送到copyright@packtpub.com。 非常感谢您对维护我们作者的权益、打击盗版,并使得我们能为用户带来更好的内容所给予的帮助。 问题 如果有任何关于这本书的问题,可以通过questions@packtpub.com联系我们,我们将会尽可能为你解答。
1 引言:为什么需要高性能? 1 为什么应用程序的性能意味着这么多? 2 手动测试和自动测试 3 ANR和软件中的延迟 3 什么会触发ANR,我该如何避免它们? 4 Android架构 4 Dalvik虚拟机 5 内存管理 5 电量消耗 6 Java语言 7 NDK/在需要时进行原生开发 7 程序响应相关的3个临界值 8 软件质量的商业价值 8 总结 9 2 高效调试 11 ADB 11 DDMS 12 采集和分析线程信息 14 堆分析和可视化 16 Allocation Tracker 19 网络使用 20 Emulator Control 22 系统状态 23 调试UI 24 使用Hierarchy Viewer 26 Systrace 28 Android设备调试选项 29 Android即时运行 38 GPU分析器 39 使用GPU分析器进行调试 41 ClassyShark 42 开始使用 42 总结 46 3 打造布局 47 预览 47 渲染性能 47 屏幕撕裂和垂直同步 50 多窗口模式 57 最佳实践 63 布局概述 64 布局层次管理 64 布局复用 70 ViewStub 73 AdapterView和视图回收 74 自定义视图和布局 78 屏幕缩放 83 调试工具 84 Design窗口 85 Hierarchy Viewer 86 设备上的调试工具 90 Systrace 97 总结 101 4 内存 103 预览 103 内存如何工作 104 垃圾回收 104 内存共享 104 运行时 105 Android N 即时编译器 106 内存泄露 107 内存抖动 108 引用 108 内存相关的项目 109 最佳实践 111 数据类型 111 语法 117 常量 123 对象管理 124 内存设计模式 129 Android组件泄露 137 进程 150 内存API 151 主要组件和内存管理 153 调试工具 156 LogCat 156 ActivityManager API 159 StrictMode 160 Dumpsys 161 总结 168 5 多线程 169 预览 169 线程基础 170 Android多线程环境 174 Android应用程序线程 175 Android线程消息 176 最佳实践 179 线程 179 HandlerThread 179 AsyncTask 181 Loaders 185 Services 188 进程间通信 197 先进的技术 202 调试工具 210 StrictMode 210 总结 211 6 网络 213 预览 213 协议 215 方法 216 头部 216 超时 217 内容 217 响应码 218 连接类型 218 最佳实践 219 延迟测定 219 批量连接 221 对响应进行缓存 222 指数退避算法 226 轮询VS推送 228 所提供的API 229 Android N带来的新变化 234 调试工具 243 Android N网络ADB工具 244 Fiddler 244 Wireshark 245 Application Resource Optimizer 246 网络衰减 248 模拟网络加速和延迟 248 总结 252 7 安全 255 WhatsApp – 连续出现问题 256 深入代码 258 捕获APK文件 259 从设备上拉取APK文件 259 利用Wireshark捕获APK文件 260 利用外部网站 261 剖析APK文件 262 代码注入 267 操作码 270 注入新代码 270 签名并重新构建应用程序 273 保护应用程序 274 非安全存储 277 SharedPreferences 277 内部存储 278 外部存储 280 删除文件 282 使用外部存储还是内部存储 282 数据库 283 数据库中的性能 284 SQL注入 284 ORM框架 286 OrmLite 286 SugarORM 287 GreenDAO 288 Realm 289 网络 289 通信加密 290 嗅探 290 总结 292 8 优化电量消耗 295 分析 295 监测电池电量和充电状态 298 识别充电状态的变化 299 确定及响应电池电量的变化 300 Doze和App Standby 301 理解Doze 301 避免无用的网络请求 302 按需对待BroadcastReceivers 304 网络 305 总结 306 9 Android中的原生代码 309 入门——在系统中配置NDK 310 JNI 311 基本概念 312 创建首个JNI程序HelloWorld-JNI 313 使用Android NDK创建一个原生Activity 318 调试NDK 321 Android.mk 324 NDK定义的变量 325 TARGET_PLATFORM 325 TARGET_ARCH 325 TARGET_ABI 326 NDK提供的宏 326 Application.mk 327 引入已存在的库 329 导出头文件 330 总结 330 10 性能提示 333 位图 333 加载 334 处理 340 缓存 341 显示 346 管理内存 348 图像优化 352 分辨率 353 压缩 354 序列化 354 JSON的改进 354 JSON的替代品 356 本地序列化 363 代码改进 363 Getter和Setter 364 内部类 365 Android N中的Java 8 368 设置 368 特性 368 Jack工具链 372 APK优化 374 移除未使用的代码 374 移除未使用的资源 374 总结 376
叶坤,豆瓣Android工程师。负责豆瓣FM Android客户端研发。热爱运动、旅行、画画、探戈,偶尔玩玩钢琴。负责豆瓣FM Android客户端研发。热爱运动、旅行、画画、探戈,偶尔玩玩钢琴。