Android高性能编程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-24 16:49:41

点击下载

作者:叶坤

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Android高性能编程

Android高性能编程试读:

内容简介

本书旨在为Android开发者指明提高应用程序性能的方向。第1章就什么是高性能、为什么需要高性能展开讨论。第2章为读者展示了一些用于调试应用程序的工具、方案以及技巧。第3~8章围绕着布局、内存、多线程、网络、安全、电量消耗等多个方面,阐述如何打造高性能应用程序。第9章相对独立,介绍的是原生开发。第10章与前面章节的关系也不大,涵盖了一些琐碎但对性能至关重要的小技巧,例如,图像处理、序列化、优化APK文件,等等。

本书面向具有一定Android开发经验,希望得到进一步提升的工程师。

译者序

2016年9月13日,我开始着手翻译这本书。我记得自己在大学期间,经常会抱怨一些技术类书籍翻译得不够好。但当自己在做这样一件事情时,才体会到这项工作的不易,我也很担心自己会成为读者抱怨的对象。因此,对于这项工作我十分慎重。

对于技术类书籍,不仅仅是将英文翻译成中文,更需要确保书中所提及内容的正确性,并对其中存在的疑问及错误,进行验证和纠正。在第一遍翻译结束后,确实发现了原书中存在的一些问题,并通过邮件和原作者沟通确认后,得以修订。尽管如此,由于译者能力有限,无法确保书中内容的绝对准确性。并且,随着Android系统版本的不断迭代,某些特性或API也可能会被废弃。这也决定了,本书的内容不可能永远正确。书本只是对知识点的归纳总结,搜索引擎才是工程师学习技术的最佳手段。对于书中所提及的知识点,基本上都可以在Google中搜索到相应的内容,若有必要,读者可进一步深入学习。

在过去一年多的时间里,我把工作以外的大部分时间,都花在这本书的翻译上,有时经常工作到凌晨两三点才休息,除了偶尔参加马拉松比赛,基本上没有周末和假期。豆瓣办公室和颐堤港东隅酒店二楼的咖啡厅,大概是我最经常出现的地方。翻译这本书对我来说意义重大,不仅学习到一些新知识,也是对自己多年来,在Android研发技术方面的一种肯定。对于即将步入而立之年的我来说,这本书算是最好的礼物了。

致谢

这本书能够顺利出版。首先我需要感谢我的同事苏丹,为我引荐电子工业出版社的张春雨先生和符隆美女士。同时,也需要感谢张春雨先生对我的信任。感谢符隆美女士为本书出版所付出的巨大努力。

感谢豆瓣公司,豆瓣宽松的办公环境和工程师文化,让我有时间和精力翻译这本书。当然,也需要感谢阿北,为中国的互联网创造了一个精神角落。

感谢耿新跃、潘海东、栾谦,让我有机会加入豆瓣。栾谦专业的工作态度和技术能力,对我在豆瓣的工作帮助巨大,非常感谢。

感谢豆瓣FM团队,这是一个非常棒的团队,十分荣幸能够成为团队的一员。感谢Jason一直以来对我的信任。感谢我的同事党路、钟凌峰、仇志飞,在我最困难的时候对我的帮助和鼓励。

感谢搜狐畅游17173,以及网龙公司的前同事们,为我打下的坚实基础。

感谢我的父亲叶碧何先生,教会我做一个坚强正直的人。感谢我的母亲陈忠英女士,你是我最坚实的后盾。感谢我的妹妹叶闽,一直在我身后支持我,帮助我。以及,我可爱的外甥女林楉熙,小外甥林宇钒,感谢你们给我带来的快乐,希望你们健康幸福地成长。

最后,那些我没有提及名字,但曾经帮助过我,对我同样十分重要的亲人、朋友、老师、同学、同事,由衷谢谢你们,感恩。叶坤

关于作者

Enrique López Mañas是Google公司的一位研发专家和独立IT顾问。他从2007年开始学习并从事移动技术研发。他是一名狂热的开源社区贡献者,一位免费开源软件拥护者,德国排名前10的Java开源贡献者。他加入了Google创业加速器计划,在其中参与并影响了来自全球的几百个最佳孵化项目。同时,他也是一位大数据和机器学习爱好者。

业余时间,他喜欢骑自行车、摄影、旅行,直到精疲力尽。他也创作文学作品,并且喜欢各种艺术。他喜欢以第三者的视角来描写自己。你可以关注他的推特(@eenriquelopez)以获取他的最新动态。

Diego Grancini拥有佩鲁贾大学的电信IT工程学位。他致力于研究Android开发超过6年的时间,领导并促成了多个项目,在他的职业生涯中,十分热衷于教授和分享他的技术。

毕业后他加入了 Engineering Ingegneria Infomatica S.P.A.公司,致力于研究Java和Android开发,并引领Android开发者多年。之后他加入了摩根大通,强化了他在软件开发,尤其是Android平台上,关于安全和性能方面的技术。

感谢Murvin Bhantooa对我所写内容的帮助,我想向他表达我的感激之情,感谢Gil McErlane及所有我在摩根大通的同事们的支持,感谢Gianluca Polegri及所有我在Engineering Ingegneria Infomatica S.P.A.的前同事们为我奠定了知识基础。

感谢我的父亲Augusto指导和培养了我,感谢我的母亲Argia Flavia、我的妹妹Agostina、我所有的家人,以及Utah Capo对我的支持。

特别感谢Helen McKenna对我在语言表达方面的巨大帮助。

我也要谢谢Enrique López Mañas、Parshva Sheth以及Emil Atanasov,感谢他们为这本书做出的伟大贡献。

最后,恕我不能一一指明,那些我没有提及,但在我的人生旅途中伴随着我的人们,感谢你们,你们对我来说同样重要。

关于审稿人

Emil Atanasov 是一位在移动技术方面有着丰富经验的IT顾问。他从2006年就开始探索移动研发技术。

Emil获得了德国亚琛工业大学的媒体信息硕士学位,以及保加利亚圣索非亚大学的计算机科学硕士学位。他曾就职于多家美国大型公司,还曾经做过几年的自由职业者。Emil在软件设计和研发方面有着丰富的经验。他参与设计、完善了一批移动应用程序。现在,他专注于一个快速增长的移动领域,并管理着一个优秀的研发团队,为世界各地的客户提供软件解决方案。他也是ApposeStudio公司的联合创始人。

作为一个Android研发团队的领导和项目经理,Emil领导着一个技术团队,研发部分Nook Color的固件——一种能支持Barnes&Nobel格式以及其他电子书格式的电视杂志/电子书阅读器。

他是“Getting Started with Flurry Analytics”的作者之一。他也对“Objective-C Memory Management Essentials”和“Android Application Development Cookbook,Second Edition”两本书贡献很大。

我想感谢我的家人和朋友的理解。谢谢你们支持我,即使面对的是我这样一个花大量时间沉迷于数字世界的怪人。谢谢大家!

序言

应用程序在移动世界中能否成功,性能是其中一个关键的因素。运行缓慢的应用程序很可能会遭到弃用。学习如何构建一个应用程序,让它在速度、性能以及功能交互之间达到平衡,将会是一个挑战。做到这点比以往任何时候都更重要。《Android高性能编程》将让你学习到,如何让应用程序运行在尽可能多的硬件设备上,覆盖更多的用户。本书首先对Android开发中一些最先进的技术进行简要介绍,讨论了性能对Android应用程序的重要性。接着,介绍了使用Android SDK工具,对Android应用程序进行调试和分析的常规做法。我们还将学习一些先进的主题,例如,打造布局、多线程、网络以及安全。电池电量是应用程序的最大瓶颈之一,本书将通过典型的代码示例,阐释如何减少电量消耗,以及如何在不同情形下测量电量的消耗。

本书所探讨的技术,围绕着如何打造一个优化高效的系统。这是一个不会消耗大量电量,或引起内存泄漏,并随着时间的推移,运行越来越慢的系统。

这本书涵盖了什么

第1章,引言:为什么需要高性能 对主题进行概要介绍,简要分析了Android平台的现状,以及高性能对Android应用程序的重要性。

第2章,高效调试 涵盖了调试和分析Android应用程序常用的一些工具,不仅限于Android SDK 所提供的,还包括一些第三方的。

第3章,打造布局 提供了许多UI设计方面的见解,通过学习这些内容,打造加载迅速,更新高效,不会令用户察觉到延迟的UI界面。

第4章,内存 展示了优化Android应用程序的相关技术,编写内存高效的应用程序,并介绍内存分配以及垃圾回收的相关概念。

第5章,多线程 介绍了Android应用程序中可供使用的各种线程,以及它们特定的使用场景。其他一些先进的技术,例如IPC,将会通过代码示例来展示。

第6章,网络 介绍了高效操作网络的相关技术,以及从服务端获取数据的一些技术,例如,指数退避算法、避免轮询。

第7章,安全 涵盖了确保Android应用程序安全的相关技术。如何使用Android自带的安全加密机制,如何获取网络连接相关的信息,并在连接发生变化时得到通知。

第8章,优化电量消耗 通过典型的代码,演示如何耗尽或阻止电量的消耗,以及在各种情形下,如何权衡电量的消耗;许多开发者不知道,在开发一个拍照或录制视频的应用程序时,该如何处理预览以及保存数据。

第9章,Android中的原生代码 这一章将全部用于介绍Android中的原生代码和C++以及它们的用法。

第10章,提高性能的小技巧 帮助开发者在平时的开发中,避开影响效率的方案;这是前面章节中未涉及的一个最佳实践指南。

你需要准备什么

你需要准备以下硬件设备。

·运行环境为Windows、Linux或者Mac OS X 的PC/笔记本电脑。

·Android手机。最好是高端一点的,并且系统版本高于Android 5.0。

这本书为谁而写

这本书是为那些已经拥有丰富的Android知识,想要进一步巩固和学习技术,以提高应用程序性能的开发者而写。我们假设他们已经熟悉整个Android SDK,且为此工作了多年。他们也熟悉Android框架,比如,能使用对性能至关重要的NDK编写原生代码。

约定

本书会涉及几种不同的文本样式,分别代表不同类型的信息。以下展示了其中一些样式及它们代表的意思。

代码文本、数据库表名、文件名、文件扩展名、路径、URL、用户输入以及推特账号名的文本样式如下。

“If you go to this folder and call the command adb, you will see on the screen a list of available options.”

代码块的格式如下。

命令行输入输出的格式如下。

新条款以及重要的词会以黑体展示。屏幕上显示的单词,例如菜单或者对话框内出现的文本,格式类似这样:“To debug the overdraw on the device,Android provides a helpful tool that can be enabled inside the Developer options.”

警告或重要提示会出现在这样的一个方框中。

提示及小技巧会以这样的形式出现。

下载示例代码和本书的彩图

你可以从http://www.broadview.com.cn的“下载专区”,下载所有已购买的博文视点书籍的示例代码文件和本书的彩图。

勘误表

虽然我们已经尽力谨慎地确保内容的准确性,但错误仍然存在。如果你发现了书中的错误,包括正文和代码中的错误,请告诉我们,我们会非常感激。这样,你不仅帮助了其他读者,也帮助我们改进后续的出版。如发现任何勘误,可以在博文视点网站相应图书的页面提交勘误信息。一旦你找到的错误被证实,你提交的信息就会被接受,我们的网站也会发布这些勘误信息。你可以随时浏览图书页面,查看已发布的勘误信息。

读者服务

轻松注册成为博文视点社区用户(www.broadview.com.cn),您即可享受以下服务:

·下载资源:本书如提供示例代码及资源文件,均可在 下载资源 处下载。

·提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

·交流互动:在页面下方 读者评论 处留下您的疑问或观点,与我们和其他读者一同学习交流。

页面入口:http://www.broadview.com.cn/32887第1章引言:为什么需要高性能

剑桥词典中对“性能”的其中一个解释是:“一个人、机器等,完成一份工作或一个活动的情况。”按照这个解释,我们可以根据一个任务执行完成后的产出和效率,判断该任务是否为“高性能”。

在软件开发中,高性能指的是,开发者在开发过程中,所编写的程序是否能高效地执行。当我们在开发移动应用时,高性能涉及许多方面。例如,布局界面的编写、电池电量管理、安全问题、多线程的效率、设计模式以及调试技术等。

完成一件事情和正确地完成一件事情有着巨大的差别。在现实中,软件开发包含了截止日期、预算、管理。软件工程师往往很容易陷入技术债务中,这个技术债务通常也是自己埋下的。当一个系统没有被完全或者适当地设计好,就进行开发,在遇到问题时,如果没有合理地去解决它,而是暂时不去处理,这样就会造成雪球效应。随着项目的推进,技术债务越来越高,以致开发的成本也非常高,这将会导致项目失败,或者使得开发成本远远超过组织所给的预算。

在项目截止日期通常不可避免的情况下,采用高效的开发流程来保证,在合理的花费内得到质量可靠的软件,这对任何软件开发都是至关重要的。这也意味着,开发者要让自己的开发技巧变得成熟,而不仅仅是实现任务,满足要求。这样才能开发出高效的、健壮的,并且在未来可进一步扩展的程序(这也就是我们常说的可维护性)。

本书旨在介绍为Android设备打造高性能软件的技术。第2章高效调试

开发者从接触软件研发开始,就必然要与“bug”打交道,并且这种关系将会持续整个职业生涯。bug是软件系统中的一个错误或瑕疵,它可能会引发一个异常或错误的结果。

关于bug这个词的来源,存在一些争议。该词的首次使用可以追溯到,托马斯·爱迪生用它来描述一个硬件系统的技术故障。1946年,一位计算机先驱格蕾丝·霍珀,在对Mark II计算机的一次故障排查中,发现是一只被困在继电器中的飞蛾导致了故障。后来,bug不仅代表着物理硬件上的错误,也被引申为逻辑错误,或软件错误。

Debugging指的是,在软件系统中找出bug或故障的这样一个过程。Debugging包括众多方面,例如,读取日志、内存调试分析、系统监测等等。无论是在开发阶段,还是在运行环境中,一旦发现bug,开发者都需要调试应用程序,定位bug并修复它。

如果你是一位Android开发者,Google为你提供了大量的工具,用于调试应用程序。本书的调试环境将基于Android Studio套件和Google的官方SDK,当然,还有其他一些工具对调试也大有帮助。ADB

Android调试桥(Android Debug Bridge),也就是我们常说的ADB,它是Android开发中一个重要的工具。它位于Android SDK的/platform tools目录下。进入到该目录下,调用adb命令,就能在屏幕上看见一系列的选项。

这里有一个提高效率的方法,能让你在第一时间使用ADB。将Android SDK所在的目录添加到PATH环境变量中。这样你就能在系统的任意位置调用该目录下的任意一个工具。

通过adb命令,可以执行多种操作,包括显示当前连接着的设备、截屏、连接或断开与各种设备的连接。本书的目的不是为了告诉你工具的各种功能,但在此,我们还是列出了adb命令中最常用及最有用的一些功能:

有趣的是,adb作为一个命令行工具,也可以被用于编写脚本,集成到Continuous Integration(CI)系统中,例如Jenkins。通过adb shell,我们可以在设备上执行任何命令。例如,从设备上截屏就是一个非常有用的脚本。

adb还有很多的可能性,我们将在本书中进一步探讨它。DDMS

Dalvik调试模拟服务(Dalvik Debug Monitor Server),也就是我们常说的DDMS。它运行在adb之上,提供了功能强大的图形化接口,包括线程和堆信息、logcat、短信/电话模拟、位置信息模拟,等等。下图是DDMS启动时的样子。

该截图由多个部分组成。

1.左上方显示的是当前连接着的设备,以及运行在该设备上的不同进程。

2.右上方是各种不同的选项卡,默认选中的是File Explorer。位于底部的是LogCat。

除此之外,DDMS中还有其他一些功能选项,让我们仔细看看都有哪些。首先,请关注截图的左上部分。

1.图标,开始调试所选中的进程。

2.图标,每次GC触发时,所选中进程的堆空间会得到刷新(后面会详细介绍)。

3.下一个图标,将HPROF存储为一个文件。HPROF为二进制格式,包含了一个应用程序堆信息的快照。通过一些工具可以查看它,例如jhat。后面我们会通过一个示例,演示如何转换该文件并查看它。

4.该选项会触发应用程序的GC(这对前面介绍的几点很有用)。

5.该按钮可以在DDMS中更新线程。当我们要处理多线程应用程序时,这会非常方便。

6.该图标可帮助我们分析线程,并显示它们的精确信息。后面我们会通过一个完整的示例进行演示。

7.停止一个进程,我们可以使用图标。

8.对应用程序截图,可以点击图标。

9.点击该图标,我们可以得到一个视图层级结构的快照,并将它发送给UI Automator。

10.该选项,使用Android的systrace工具,捕获系统范围的追踪。

11.该选项启动对OpenGL的追踪。采集和分析线程信息

现在,让我们来看看如何调试线程。传统的方式是设置一个断点,然后等待线程被调用。但这种调试方式在多线程环境中并不适用,因为在一个多线程应用程序中,同一时间内可能会有多个线程在运行,并且它们之间相互独立。因此,我们希望能够可视化线程并单独访问它们。

在DDMS窗口左边的进程列表中选中某个进程,然后点击图标。此时,如果你点击右边的“Threads”选项卡,就能看见该选项卡中显示着当前进程的线程信息。

一些开发者会对进程(Process)和线程(Thread)的概念感到困惑。举例来说,进程为程序(Program)的执行提供所需的各种资源(虚拟地址空间、可执行代码、安全上下文,等等)。进程是计算机中已运行程序的一个实例(在某些情况下它也被称为Task)。同一个程序可以产生多个进程,这些进程在机器重启时消失。线程是进程的一个子集。一个进程可由多个线程组成,多线程利用多处理器系统并行。同一个进程中的所有线程共享同一空间地址、堆栈、文件描述符以及其他一些东西。

我们可以在屏幕上看到每个线程不同的信息,每个线程都有一个ID、一个线程ID(Tid)、一个状态(Status)、一个utime(执行用户代码累计花费的时间,以jiffies为单位,jiffies的默认值通常为10毫秒)、stime(执行系统代码累计花费的时间,也是以jiffies为单位),以及一个名字。点击选中其中一个线程,就能立刻在下方看见该线程的栈信息。

我们已经提到过,线程是可以被分析的,并且这通常被用于调试内存泄漏。在开始分析之前,需要留意以下两个条件。

·系统版本低于API Level 7(Android 2.1)的设备,需要有一张SD卡,因为分析的信息会被保存在上面。

·系统版本高于API Level 7的设备则不需要SD卡。

点击图标,在系统版本高于API Level 19(Android 4.4)的设备上,系统会让你选择采样频率,如果你选择的是trace-based profiling,那么DDMS会在激活时自动采集所选中进程的相关信息,你只需与应用程序交互即可。当你准备好后,再次点击该按钮(按钮现在看起来是这样的)以停止采集并打印所采集的信息。此时,会出现一个类似以下截图的界面。

每一行代表着一个独立的线程,随着时间的推移,从左到右不断变化着。每个方法的执行用不同的颜色表示。

该截图底部是一个分析面板。它以百分比和绝对值两种方式展示了Exclusive Time和Inclusive Time。Exclusive Time指的是CPU单独花费在该方法上的时间,不包括该方法所调用的子方法;而Inclusive Time指的是CPU花费在该方法及其所调用到的方法上的时间。主调方法(calling method)为Parents,被调用的方法(called method)称为Children。

采集器有一个众所周知的问题,即虚拟机重用线程ID。比如,一个线程停止后,另一个线程启动了,他们可能会有同一个ID。这可能会导致数据混乱,因此我们在分析的时候要注意到这一点。堆分析和可视化

我们已经学习了如何使用DDMS调试线程。现在,我们将学习如何分析应用程序的内存堆,也就是系统为应用程序分配的那一部分内存。这对调试内存泄漏来说非常重要。

让我们通过堆转储(heap dump)来定位问题。点击图标生成HPROF文件,此时会弹出一个对话框,让你选择HPROF文件要保存的目录。接着我们需要运行hprof-conv工具转换该文件。hprof-conv是一个Android工具,用于将.hprof文件从Dalvik格式转为J2SE HPROF格式,这样就可以使用标准工具来打开它。hprof-conv工具可在/platform-tools目录下找到。键入以下命令可运行它。

运行成功之后,就得到了一个能被其他标准工具所打开的文件。

我们可以使用MAT来打开该文件,从这里下载它。

MAT是一个非常复杂的强大工具。点击File并打开Heap Dump。你会看到一个类似下方截图所示的窗口。

点击饼图中的某一块,能看见一系列的选项。特别有意思的是直方图(Histogram),在直方图中,可以看到类按照实例的数量进行分类,内存被使用的总量,或可用的内存总量。

右键点击一个类,选择List objects选项中的incoming references子选项,当前堆中的类将会以列表的形式呈现出来。列表可根据习惯进行排序。选中一个对象,可以看到造成该对象不被回收的相关引用链。虽然不能确定这是否意味着内存泄漏,但拥有相关领域知识的开发者,应该能知道其中的某个值是否应该被回收。

我们还可以在DDMS中对堆进行查看。选中某个进程,再点击图标,Heap选项卡会显示出当前应用程序中所有不同的数据类型和对象的信息。手动触发GC可以保证DDMS中显示的信息是最新的。

在该选项卡中,还可以看到每种类型对象的数量、它们各自的大小(包括最小对象和最大对象的值,这对于找出

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载