资源描述
恰当时机?”“我们需要解 决什么样的问题?”“我们如何决定工具的形态?”这三个问题,然后对GT的基础能力在实际调测活动中起到的作用进行简要 的论证。 谁适合阅读本书 本书介绍了在移动应用体验中用户关心的几类痛点,如内存、流量、电量、流畅度等,从现象到本质,利用什么工具,发现 什么问题,抽丝剥茧,直追代码,找出问题的根因。每章通过一系列的案例描述移动应用的测试及优化的方法,并提供相应问题 的解决方案。本书最后一章讲解了测试利器GT,通过GT工具能够让测试更灵活,让开发更透明。 本书可能适合下面这些人: ·希望通过代码从本质上解决性能问题的开发人员。通过本书规范开发设计工作,减少性能开销,保证开发高质量的App。 ·希望提高质量、发现性能问题的测试人员。利用本书提供的方法以及思路,查找负责测试App的性能问题,并提供开发人 员相应问题如何解决的参考案例。 ·希望针对新领域进行专题研究的团队负责人。可以参考我们在成立专题研究时,如何进行问题的剖析、探索和实践。 ·希望从事测试相关行业的新手。通过本书了解目前在移动App上的专项测试维度有哪些,测试工作是如何开展的。 ·对腾讯移动品质中心(TMQ)专项测试团队感兴趣的同行。可以通过本书了解我们团队在测试方面的一些思考和尝试。 本书阅读建议 本书中第1章到第6章从移动App各个不同维度进行专题研究、深入分析,因此,没有很明显的顺序关系,读者可以根据需 要参考的维度或感兴趣的维度,查找相应的章节,进行阅读。 书中最后一章介绍我们团队自研的一款脱机测试工具GT。对于GT使用的各种问题或内部原理感兴趣的,可以直接阅读第7 章。 关于作者 本书的作者是来自腾讯移动品质中心(TMQ)专项测试团队的资深测试工程师们,他们长期负责腾讯公司部分重要的手机 应用(手机浏览器、手机管家、应用宝、腾讯地图等)的性能评测与优化工作。在App的内存、电量、流量、流畅度、网络、安 装包大小等核心性能维度,积累了相当丰富的评测、优化经验。 主要编著成员有:蒋翠翠、李金涛、廖志、廖海珍、罗家润、马蕾、秦守强、文娟、阳文彬、叶方正、翟翌华、张媛、张志 伟(按拼音顺序排列)。 TMQ(腾讯移动品质中心)是腾讯最早专注在移动APP测试的团队。TMQ微信公众号专注于移动测试技术精华,饱含腾讯 多款亿级APP的品质秘密,文章皆独家原创,我们不谈虚的,只谈干货!欢迎扫描二维码关注我们。 TMQ深圳 特别感谢 李金涛致谢: 感谢腾讯MIG应用宝项目组的支持和帮助,让我们的想法得以在应用宝上落地和实现!感谢廖志和叶方正两位Leader的指 导,在我们遇到难点时及时帮助和协调!感谢跟我一起做应用宝安装包瘦身的小伙伴王洋、曹荣丽、周茜以及开发和设计同学, 大家一起通力合作才达成我们的目标! TMQ北京 廖志致谢: 这辈子最想感谢的人是我的外公陈光煜老先生,他不仅尽力给予了我童年最好的教育,而且用他的言传身教教会了我为人正 直。 其次,我要感谢我的外婆赵碧君老太太,她不仅含辛茹苦地帮助我母亲把我抚养成人,也用她自身的言行教会了我善良。当 然,我也要感谢生我养我无私奉献她近乎所有给我的母亲陈正伟,希望她能一直健康、快乐的安享晚年。 再次,我自然要感谢全力支持我工作的妻子王维,若不是她在家撑起半边天、用心教育我们的儿子廖紫安,我就没有足够的 时间去思考、探索和沉淀我的各项测试技术经验。 最后,我想对五年来一路相伴、并肩战斗的专项测试团队的兄弟姐妹们真心说一句:我爱你们,你们是最棒的! 廖海珍致谢: 作为主编,首先感谢各位章节书写的负责人和领导麦克,廖叔。写书的工作历时很长,近半年了,大家都是靠工作之外的时 间来做,而且期间经过几轮思考,又不断的要求调整修改文章布局和细节,感谢各位的支持。通过大家克服各种工作忙,时间不 够,文笔如何表达优化思路等困难,才能将整本书完成。致以:写内存篇的张志伟、蒋翠翠,写电量篇的阳文彬、张媛,写流畅 度篇的罗家润、叶方正,写导航篇的马蕾、文娟,写网络优化篇的廖志、翟翌华,写应用安装包瘦身篇的李金涛,写工具GT篇 的秦守强,在此表示深深的感激。 其次,也要感谢当时周末非工作时间和我一起讨论书的脉络的罗小松,两个小时的碰撞,书的架构原型产生了。众人拾柴火 焰高,就是和小松,还有后面麦克,廖叔,不断的讨论交流,才慢慢形成了这本书的主要架构。其实,早期设计中他也有一部分 的写作工作,后面为了突出各案例技术点,内容做了调整,将他负责的章节砍掉了。还有张媛,因为我的时间安排不开,让她帮 忙修改写了网络优化部分内容,后来因为有更适合的表达方式,将她修改的都作废了,一并感谢。 最后,感谢我的老公王士伟和孩子开开。刚开始启动写书的时候,作为主编,觉得需要这么多人一起协助,还有安排各种组 织讨论工作,而且又不是擅长的领域,第一次做,个人表示亚历山大。最初自己也尝试写了网络优化部分的初稿,写了30页快 写崩溃了,当时很迷茫,不确定是否能把书写完,感谢老公不断的鼓励和孩子给我带来的快乐,让我更有动力和自信完成写书大 业。 罗家润致谢: 首先感谢专项组对我的培养和帮助。其次要感谢麦克,流畅度这块的测试一开始都是麦克带我着做的,教会了我很多东西。 最后感谢耿大师和曹老师,流畅度里的案例大部分工作都是和他们一起完成的。 马蕾致谢: 感谢专项组和地图组所有小伙伴们一直以来对我工作的支持和帮助。感谢廖叔和超姐对专项测试方向的指导和建议。感谢家 里的两只鹦鹉乖乖和萌萌一直以来的陪伴。 秦守强致谢: 感谢GT用户交流群里的各位业界朋友,正是他们旺盛的好奇心推动了GT这个工具产品的不断演进,这才有了本书中GT的相 关内容。 文娟致谢: 首先,感谢专项组和地图组的小伙伴们给予的支持和鼓励,感谢廖叔提供诱导专项优化的机会以及对我的指导,感谢项目建 立初期参与调研的小洪同学,还有在整个过程中给我提供各种意见和建议的allison,以及提供工具支持的金涛和明明。 再次,感谢家人的陪伴。 叶方正致谢: 感谢所有有目标、有理想的人。 翟翌华致谢: 首先感谢我的Leader廖叔,在工作中他开阔的思路,追求极致的工作方式,给了我不少帮助,得益于他的指导,我的网络 流量优化项目开展得井井有条,做到了极致,得到了项目组的大力认可,个人也得到了快速的成长。 其次也要感谢项目参与者罗家润、王洋、朱明,我们都投入了很多精力在网络流量优化项目上,所有的成果都是属于大家 的,也感谢组内所有给与我帮助的同事们,项目组氛围非常融洽,大家和睦得像一家人。 最后感谢我的老婆和孩子,家庭方面老婆付出了很多,才使得我能更专心的投入工作,感谢你们对我工作的理解,最后把这 本书送给你们,我最爱的老婆周洋和儿子帅帅。 张媛致谢: 感谢我的同事袁建发。文中提到的PowerStat2.0工具,是在他之前开发的电量分析工具基础之上再次开发并优化完善的。 工具对实际项目的电量测试分析起到了很大的作用。 张志伟致谢: 感谢我的家人,有他们的陪伴我才能完成书里的内容。献给乐乐! 第1章 越用越卡为哪般——降低待机内存 在智能手机兴起的这几年中,我们见证了手机内存从256MB到4GB的巨大变化,进程可用的内存也从仅有16/32MB到现在 可以使用2GB以上的内存。与此同时,应用的功能也日益复杂,也有更多的进程在同时运行,需要协作和互相切换的应用越来越 多。 因此,在硬件资源增长后,应用开发者们依然会感觉到内存是稀缺资源。我们仍然需要每个应用开发者了解内存的消耗情 况,并尽量节约使用内存。否则,应用会越用越卡。本章将从内存分析入手,讲解如何降低App的待机内存。 1.1 新手入门 当软件实现了新功能后,准备发布版本前,往往需要进行一轮性能测试以确定没有性能问题,这类测试通常包括功能的流畅 度、电量消耗和内存使用情况等。 由于内存组成具有复杂性,实际上并没有简单通用的方法就能够发现所有的内存问题。下面,我们会围绕一组案例展开,通 过对案例的分析讲解各种内存测试的工具和方法。这些例子都是从真实的测试案例中提取的,经过加工后使得问题表现得更加明 显。 接下来我们从一个最常见的内存泄漏开始,作为最典型的内存问题,类似的情况可能在无数应用的无数版本中出现过,而且 还会不断地在新版本里出现。对于这样的问题,我们必须要准确识别出来。 在大部分应用中,经常会有一类功能是需要加载附加资源的,比如显示从网络下载的文本或图片。这类功能往往需要在内存 中存放要使用的资源对象,退出该功能后,就需要将这些资源对象清空。如果忘了清理,或者是代码原因造成的清理无效,就会 形成内存泄漏(GC)。我们的测试任务就是保证功能的正常,并且不会有遗留的内存对象造成泄漏。 要开始进行性能测试,测试工具是必不可少的。我们一般都会优先使用SDK/IDE自带的工具,因此首先会想到的工具就是和 IDE集成在一起的Android Device Monitor/Android Studio了。 大多数情况下,功能代码都是由Dalvik虚拟机里执行的Java代码实现的,因此主要的内存消耗也是由Java代码使用new分配 的内存。Android Device Monitor和Android Studio能够方便地观察Heap Alloc部分的大小,进行初步的统计,还能够观察到 GC发生时的内存变化情况,如图1-1和图1-2所示。 图1-1 使用Android Device Monitor观察应用的内存消耗 图1-2 使用Android Studio观察应用的内存消耗 在图1-1中,我们能够看到应用当前消耗了多少内存,以及各种不同类型对象的初步统计。在图1-2中,Android Studio进 一步将内存数据进行了图形化,这样就能方便地看出GC(垃圾回收)情况和明显的内存趋势。如果存在明显的内存泄漏,那么 在图中就会表现为随着功能的反复使用,内存值不断升高,即使出现GC也没法降下来,如图1-3所示。 图1-3 典型的内存泄漏 发现了内存泄漏,通常就可以交给开发去处理了。但我们并不只是给开发人员丢一个问题描述和复现路径过去,而是利用手 头的工具,获得一些更详细的数据,能够使大家更快地定位和解决问题,并对内存进行分析。这样分析内存获得详细数据的首选 工具就是Eclipse Memory Analyzer Tool(MAT)。 MAT是使用非常广泛的Java内存分析工具,功能强大。已经有很多关于它的详细教程,在本书中就不再细述用法。本节主 要介绍使用MAT在分析Android应用时的一些常用技巧。 通常我们用MAT打开hprof文件后,能够在首页看到Top Consumers和Component Report等功能,使用这些功能能够快 速定位一些大块的内存消耗。但对于Android应用的hprof文件,我们在使用了Top Consumers统计使用情况后,往往只能看到 如图1-4所示的情况。 图1-4 使用MAT分析内存构成 系统的资源类占据了很大一部分的内存,而其余的前几名也往往是系统类。这是由于从虚拟机角度不会区分系统框架和应用 自身的对象,后面的1.4.3节会详细说明出现这种现象的原因。 为了去除这部分对分析的干扰,我们在用AndroidSDK提供的hprof-conv转换时需要增加一个参数: hprof-conv [-z] -z: exclude non-app heaps, such as Zygote 另一种可替代的方法是使用OQL。如果hprof文件是已经转换过的,可以在数据中寻找应用的Application类对象,将对象 地址转换为十进制后输入以下查询语句: select * from instanceof java.lang.Object s where s.@objectAddress 1107296256 使用-z参数转换或OQL查询后得到的对象集合就只包含应用代码分配的部分了。在此基础上使用MAT提供的Top Consumers和Component Report等功能就能够得到比较准确的结果,如图1-5所示,没有了系统类所占内存的干扰,只有应 用自身代码创建的对象,对于发现内存问题比较有帮助。 图1-5 分离之后再次分析内存构成 对于一般的内存泄漏类问题,使用以上方法后通过MAT提供的分析报告就很容易识别出来。在我们以往的测试经历中,用 这种方法发现了上百次的内存问题。这些内存往往是加载后忘了释放的Bitmap,临时生成的byte数组和文件缓冲区,包含 Handler的Activity,等等。 接下来我们看一个真实的应用测试案例。在这个案例里,有些位图在使用完之后由于种种原因,一直没有销毁而存在于 ImageLoader里,使用一段时间后ImageLoader会变得越来越庞大。使用上面介绍的方法去除了系统的影响后,MAT的泄漏报 告给出了结果,如图1-6所示,ImageLoader消耗了接近1/3的内存。 有了这样的数据,接下来就可以结合图片追踪代码,看引用到ImageLoader的代码部分哪里有问题,从而快速修复问题。 图1-6 MAT识别出来的问题 1.2 规范测试流程及常见等问题 最开始进行内存测试时,我们可能还有些摸不着头脑,试着找了些工具,看了看教程就开始动手了。有时候因为问题比较明 显,就真的发现了问题。再之后遇到类似的测试需求,我们就会按上次的经验去做。有时候可能发现问题,也可能发现不了,还 有些时候甚至是在白费工夫。因为随着明显的问题逐渐被找出来,剩下的都是更加复杂而不太明显的问题了,甚至有些问题更是 可以归属到优化范畴或者产品策略之内,而不再是简单的内存问题。 随着经验的逐渐增加,我们逐渐意识到,以前的很多测试方法都属于随机乱测。对于较为成熟的软件,这类方法的测试有效 性往往比较低,运气好了才会遇到问题。如果是较深层次的问题,要么遇不到,要么遇到了也找不出原因。因此,有必要总结出 一套成熟的流程方法,能够考虑到各个方面,才能提高测试的有效性。 1.3 新问题的进一步挖掘 上一节介绍了内存测试的基本流程,讲述了如何发现并处理简单的内存问题。对于Dalvik Heap部分总结出了一些常见的问 题模式,以及如何使用工具识别和处理这些常见的内存问题。 当简单问题不再是问题的时候,我们就会开始遇上一些奇怪问题了,类似于下面这些: “我们这个版本引入了一个挺简单的库,内存就涨了2MB。” “这些代码只是初始化了几个对象,还没有开始用呢。” “我只是改了一行代码,没有创建新对象。” “我一行代码都没改,怎么会涨呢?” 这次出现的问题就是这样一类问题,新版本的Dalvik Heap Pss内存出现了2MB左右的增长,但Dalvik Heap Alloc只增长了 273KB,而从Dalvik Heap Free也能看出大部分增长的内存是处于空闲状态的。 对问题经过一段时间的观察,我们有以下几点发现: ·经过较长时间待机后也没有被释放回系统。 ·有几处代码会导致内存增长,只要将这些代码屏蔽掉,内存使用情况就下降到正常水平。 ·这些代码分配的内存并不多,甚至有些地方是不需要分配内存的。 ·有些代码并不是这个版本新加入的,已经存在较长时间了。 ·使用裁剪功能的方法编译并分析内存后,基本可以确定是新加入代码消耗了内存,但并没有内存泄漏,代码经过审查也没 有发现问题。 这个结果让我们陷入了困惑,常用的方法找不出问题,说明有更深层次的原因。接下来要从更底层的DVM虚拟机寻找问 题。 1.4 进阶:内存原理 在上一节里,我们通过深入调查Dalvik虚拟机的方式,解决了Dalvik Heap Pss消耗内存过高的问题。除了Dalvik Heap Pss 部分之外,应用还有其他许多消耗内存的部分。本节主要介绍其他部分的内存是如何被分配和消耗的。 同样以我们的应用为例,在几个版本之后,新加入了一个缓存功能。缓存功能会预先取一些手机的信息,并放在内存中供其 他功能使用,这样可以减少后续功能的消耗,加快运行速度。 有了之前的经验,我们自然会想到不能简单粗暴地将所有缓存一次生成,这样可能会产生大量的碎片,因此需要选择一种合 适的策略来进行。在选择新功能的缓存策略时,内存测试也同样有用,通过对不同策略的测试,决定哪种策略比较有效,并且消 耗内存比较少。 在测试过程中我们发现,随着使用不同的策略,Dalvik Heap部分会随之增减。与此同时,不同策略执行代码的时机也会使 Dalvik Other和Dex Mmap的内存消耗变化。总结规律如下: ·不生成缓存时,Dalvik Other和Mmap会随之下降。 ·按需生成缓存时,即使只生成一条记录,Dalvik Other和Mmap也会增加。 ·生成多条缓存记录时,Dalvik Other和Mmap会在开始增加,然后一直保持不变。 ·Dalvik Other不会下降,Mmap偶尔会下降。 通常我们只是大致了解到,Dalvik Other和Mmap和代码数量相关,对于越复杂的应用,这部分内存就越多,并没有进行 过定量的分析。但现在随着对Dalvik Heap部分的优化,我们发现Dalvik Other和Mmap在内存中的比重越来越大。在这个版本 里,占总内存的将近一半,不能再置之不理,而是要寻找办法对这部分内存进行优化。 对于这些不熟悉的部分,我们首先要先去了解背后的原理,才能够针对性地去研究这些内存是如何被消耗的。 1.5 案例:优化dex相关内存 上一节提到,随着代码功能的增加,代码复杂度也在不断地变大,这时我们往往会发现Dalvik Other和Dex Mmap这两部 分消耗的内存也在不断增加。在之前的例子里,我们知道这两部分的内存已经接近总内存的一半。在Dalvik Heap已经充分优化 的情况下,我们有必要继续研究这部分内存如何优化。 我们已经知道Dalvik Other存放的是类的数据结构及关系,而Dex Mmap是类函数的代码和常量。通常情况下,要减少这 部分内存,需要从代码出发,精简无用代码,或者将功能插件化。但如果我们深入理解了系统,也能够找到一些其他方法来降低 这部分的内存消耗。 1.6 本章小结 在这一章里,我们通过对几个案例的分析,基本了解了Android应用的各种内存组成,以及这些成分是如何被消耗的,也总 结出了一些节约和优化内存的经验。在这一小节里我们把经验都列出来供读者参考。 内存的主要组成索引: ·Native Heap:Native代码分配的内存,虚拟机和Android框架本身也会分配 ·Dalvik Heap:Java代码分配的对象 ·Dalvik Other:类的数据结构和索引 ·so mmap:Native代码和常量 ·dex mmap:Java代码和常量 内存工具: ·Android Studio/Memory Monitor:观察Dalvik内存 ·dumpsys meminfo:观察整体内存 ·smaps:观察整体内存的详细组成 ·Eclipse Memory Analyzer:详细分析Dalvik内存 测试经验: ·MAT是探索Java堆并发现问题的好帮手,能够迅速发现常见的图片和大数组等问题。 ·仅靠MAT提供的功能也不是万能的,比如内存碎片问题就隐藏在对象的地址中。 ·要测试非Dalvik部分,有必要了解Linux的进程和内存原理、内存共享机制,熟悉常用命令行工具。 ·内存分配的最小单位是页面,通常为4KB,这个限制往往会引发各种碎片问题。 ·碎片不仅仅是Dalvik内存,包括各种文件的mmap也有可能产生碎片。 性能优化: ·尽量不要在循环中创建很多临时变量。 ·可以将大型的循环拆散、分段或者按需执行。 ·引入SDK库和调用新的系统API时需要考虑成本。有可能一些不常用的功能会导致大量的消耗。这时候有可能需要多进程 方案,将这些影响内存的操作放入临时进程执行。 ·除了Dalvik堆内存,还有其他类型的内存在了解了原理后也能够进行分析和优化。 ·dex文件有很多优化空间。在仔细统计并调整了dex文件的顺序后,往往能够节约1MB以上的mmap内存。 第2章 手机发烫是为何——降低耗电量 智能手机兴起的时候,坊间流传着这样么一句话:“用智能手机的男人一定是个好男人,因为他每天必须回家充电!”,这 句调侃的话说出多少手机用户的辛酸。随着智能手机的实用性、娱乐性越来越完善,我们对其依赖程度日益加深,甚至到了寸步 不离的地步,衣食住行都依赖这个小小的移动终端。不管是在餐厅、地铁、商场甚至大街上,我们都能看到大片的低头族,且其 数量呈崛起之势。我们每天将大部分珍贵的碎片时间献给了它。然而由于电池技术的局限性,智能手机这个全民好伴侣“偶 尔”会在我们沉浸其中时戛然而止,让人生无可恋。 在我们日常使用智能手机过程中也会有体会,当我们的手机安装了市场top100的应用,即使不怎么使用手机也会很快没 电,而如果将手机恢复出厂设置,三方应用都不安装,放置一周拿起来还是电量充足。真相只有一个:手机耗电的最终元凶是软 件。 那么要怎么改善软件的耗电状况呢?我们可以从两个方向着手,一是从应用软件的运行载体手机系统入手,即操作系统厂商 Google和ROM厂商,在系统层面做一些策略,在保证应用的用户体验的前提下尽量限制应用的不必要耗电;二是从应用软件本 身入手,在保证用户的必要体验前提下,尽可能减少不必要的操作。 本章将分享我们在降低耗电方面做的一些工作。 2.1 电量测试方法 自腾讯移动互联网事业群(下文称“MIG”)开始着手手机ROM(tita)研发,为手机省电能做的也越来越多,例如控制 系统本身的功耗;限制三方应用不正当的操作;统一众多三方应用的后台动作等。而笔者作为测试人员,要关注的问题有:什么 样的操作是耗电的呢?参考标准是什么呢?怎样去量化呢?怎样衡量使用优化策略后的成效呢?这些问题都是需要解决的。其中 至关需要解决的是怎样去量化整机的耗电问题。 耗电给大家最直观的印象就是了解手机使用时的电流、电压、电量等数据,初中的物理课本就告诉我们: 电能W(焦耳J)=电功率P(瓦特W)×时间t(秒s) =电压U(福特V)×电量(库仑) 电功率P(瓦特W)=电压U(福特V)×电流I(安培A),表示电流做功快慢 电量Q(库仑C)=电流I(安培A)×时间t(秒s) 我们经常看到如图2-1所示的手机电池会标注3.7V 1730mAh(6.4Wh),其中mAh表示电量,Wh表示电能,手机的电池 可以解读为在提供稳定电压3.7V的情况下,可以提供稳定电流1730mA一个小时。如果我们在测试的过程中给手机提供恒定的电 压,那么只需要获取电流值就可以量化手机的功耗。 图2-1 手机电池信息 下面主要介绍如何来获取手机使用时候的电流值,分硬件、软件两个方面。 2.2 电量优化方法 以上从硬件和软件两种测试方法介绍了我们在功耗优化上做的工作,所谓条条道路通罗马,我们所做的只是冰山一角,相信 有其他更多更好用的测试方案。针对不同的测试对象,选取合适的测试方式及测试工具,才能够达到监控优化电量消耗的目的。 在这一章节,笔者根据多次在项目电量优化中的实际经验与电量统计的理论知识,提供几条优化方法,供大家参考,希望在 这些方面避免跳入耗电的大坑。 2.3 本章小结 本章从应用层面到系统层面,从硬件测试方法到软件测试方法,结合多个案例多方面介绍电量测试的切入点和测试方法以及 测试原理。 本章介绍的几个软件测试工具,GT、PowerStat以及BatteryHistorian都是基于Android系统本身就有的接口。可以看出基 本的测试思路都是项目遇到性能瓶颈时,首先从系统方面入手,是否有合适的监控手段,然后在根据官方的意见去优化,总结。 第3章 怎样才能如丝般顺滑——流畅度评测 对于任何产品来说,流畅度的重要性都不言而喻,它可以说是用户与产品交互的第一门面。流畅度的好坏,对一个产品的体 验和口碑有着极大的影响。众所周知,当年Android手机经常被人诟病的一点就是流畅度远远比不上iPhone,即使到了现在, 这个印象依然存在。为了提升流畅度,Google对Android系统进行了大量的优化,包括使用GPU进行硬件加速,引入VSync机 制,把Dalvik换成art等。本章就来说说我们测试优化自己产品流畅度的方法。首先会重点说到使用FPS测试流畅度的不足之处, 我们如何针对FPS的不足之处对测试流畅度的方法进行改进,让流畅度的测试结果更加准确。然后介绍如何定位产品流畅度的问 题。最后总结流畅度的优化方法以及如何在开发过程中规避流畅度降低的问题。 3.1 流畅度评测方法介绍 说到流畅度的评测,相信大部分人第一时间都会想到FPS。是的,当前业界衡量一个App是否流畅的主要指标就是FPS。但 是可能也有部分有经验的同学会发现用FPS测试App流畅度的时候,会存在测试数据和实际感官不一致的问题。比如有时候FPS 很低,但是App看起来确实很流畅,特别是用于浏览器、手机应用市场等工具类App测试的时候,经常会发现FPS和流畅度对不 上的问题。这个问题曾经在某段时间内也一直在困扰我们团队,导致我们的测试结果经常被挑战和质疑。所以我们一直想找到一 个比较好的和客观的方法来评测App的流畅度,通过研究Android的机制和源码,我们最终找到一种新的评测方法来替代FPS, 我们把这种新的方法命名为流畅度(Smoothness,SM)。 我们先简单说说FPS到SM的演变过程。 之前部门内的某个产品负责人找到我们,希望我们能测试他们产品的流畅度情况,于是我们立即提枪上马,用FPS去测试他 们产品的流畅度,测试数据出来之后,我们把数据整理成了折线图,如图3-1所示。 从图3-1中的测试结果来看,该产品的流畅度非常差,因为现在的App每秒中最多能绘制60帧,而图中有不少的FPS值都在 30帧以下,而且波动很大,说明经常出现卡顿的情况。 图3-1 某应用浏览页面时的FPS值 但是,在实际测试过程中,我们发现这个产品并没有这么卡,所以对于这个结果我们觉得非常迷惑。比如在15:15秒左右这 个时间,FPS只有18,而我们测试的时候并没有发生卡顿的情况,但是FPS值却非常低,这种情况让我们感到费解。还有一种情 况,当我们停止测试的时候,按道理来说,FPS值也应该停止不动,但是实际的情况并非如此,FPS还一直在波动,这也让我们 觉得很奇怪。 所以在用FPS测试App流畅度的过程中,我们碰到两个问题: 1)为什么有时候FPS很低,但是我们却不觉得App卡顿? 2)App停止操作之后,FPS还是一直 ℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡℡推荐序一 人:关系性存在 现代文化最显著的特征之一是把每个人都当作独立、自决的个体,“关系”因此成为由独立的个体单元衍生出来的二阶性的 东西,由此引发的社会心理问题不胜枚举。我们从小被教导和鼓励个人奋斗,在与同伴的竞争中获得成功,却从来没有一门功课 教我们如何建立和维护关系。 现在的学校教育过于侧重培养人的理性,轻视情感和爱的教育,导致人们普遍缺乏爱与被爱的能力,这不仅剥夺了人内心的 幸福感,也造成大量社会问题。 人之为人,一半是理性,一半是情感。现在有些年轻人动不动就跳楼、烧炭自杀,拿生命当儿戏。曾听到有学生说,生命是 我自己的,我要觉得活着没意思,就有权选择死,这跟别人没有关系。在这类言辞中,我们看不到他们对于父母的爱,对于家庭 的责任,更休提社会担当。这种不自爱的人,不会珍惜生命的人,何以爱别人。 面对一个不懂得爱的孩子,首先应该检讨的是父母。人在胚胎期的时候就开始通过母体与外界建立联系,从出生后乃至婴幼 儿期都是个体与外界建立亲密情感联结的关键期。幼小的生命何其脆弱,吃喝拉撒都需要照料,稚嫩的心灵需要抚育,如果这一 时期父母因为这样那样的原因放弃、忽视孩子或者不能很好地回应孩子的心理需要,孩子的内心就很难生出爱的情愫,并很可能 在日后丧失爱的能力,父母也同时失去了教育孩子的心理资本。 记得我们读中学的时候学过宋真宗赵恒的《励学篇》,其中有一句:“娶妻莫恨无良媒,书中自有颜如玉。”言下之意,只 要用心读书,一朝考取功名,便可黄金万两,如花美眷相随,从此人生美满。但是,放眼现在,人们的学历水平虽然一直在提 高,但与此同时,离婚率也在不断攀升,恐婚族、直男癌、大龄剩女、妈宝男等随处可见。事实表明,学校教育与婚姻幸福之间 没有太大关系。换句话说,现在的学校并没有发挥情感教育的功能。 在学校情感教育缺失的背后,是极端个人主义的文化。整个社会充斥着利己主义的价值观。一事当前,只替自己打算,缺乏 关系思维。《论语·述而》载:“子钓而不纲,弋不射宿。”说的是孔子钓鱼,只用挂一个鱼钩的钓竿,而不用纲(“纲”是指 将一根大绳子拉在河的两岸,绳子上挂着一整排的钩子);射鸟时,只射飞着的鸟而不射宿窝的鸟。这种关爱生命的大爱理念如 今却正在被遗忘。竭泽而渔成为常态,残害动物的事屡见不鲜。一个毫无恻隐之心、内心冷漠、缺乏温暖的人,掌握再多恋爱技 巧,恐怕婚姻也很难幸福。 爱与被爱的情感和能力并不是随着人的年龄增长而自然获得的东西。从婴幼儿时期的依恋、父母的婚姻模式、各种非理性信 念,到移情、沟通和化解冲突的能力,再到成年阶段的婚姻与亲密关系,有太多问题需要了解,太多知识需要学习。 爱和被爱是每个人需要终其一生才能完成的修行。这本在“婚前心理辅导”课程讲义基础上发展出来的著作,不仅教年轻人 如何爱和被爱,对于中年和老年人反思自己的情感生活、提升婚姻质量及自我成长也有很大帮助。 本书的作者白福宝是我指导的第一个博士。那时我刚刚担任博士生导师,没有太多经验,加上他在读期间我有一年的时间都 在美国访学,不在国内,虽然在线联系也不少,但我与他的沟通总不如后来他的师弟师妹那样多。所幸他的独立性和学习能力都 很强,现在看来,那一时期的他,在作为心理学研究者学术立场的确立和思维方式、研究方法的训练等方面都打下了坚实的基 础。再加上他本身一直关注并致力于心理学知识在现实生活中的应用,使得他敏感于社会实践对心理学专业的需求,将个人的职 业进阶与社会的需求结合起来,为自己找到了一个极好的立足点。 就心理学而言,对个体心理的研究多,对“关系”的研究还很肤浅。由婚恋关系到亲子关系,再到朋友、同事关系,从关系 的建立、维系到修复和疗愈,从关系的理念到关系的行动,在我看来,这是一条既非常现实又充满理想、既能做学术研究又可以 开展社会服务的职业生涯发展道路。 作为导师,我希望他能沿着这条路走下去,祝愿他一路坦途! 杨莉萍 南京师范大学心理学院教授、博士生导师 2018年2月 推荐序二 婚恋与幻想 “我当初怎么就看上了你?!” 这是很多经历了婚恋不幸的人在痛苦挣扎中反复追问对方或自己的话,这话的意思是我痛苦是因为找错了人,我们从一开始 就是个错误。反过来说,如果那个人是对的,这一切痛苦就都不会发生了。痛苦和不幸的原因是外在的。 只要遇到对的人,就能拥有美好的爱情。这是一种潜藏在很多人内心的婚恋幻想,而且往往很难被意识到,并因其隐秘而成 为一种推动个体进入婚恋关系却不自知的力量。有一种现象或许可以从一个角度证明其存在的普遍性。喜欢看热播都市言情剧的 人,多多少少会留意过弹幕[1],有些人对弹幕的兴趣更甚于剧情。弹幕有一个热词是“渣男”,其出现频率非常高,受关注度也 很高。以各种攻击性、污辱性的语言痛骂渣男是言情剧弹幕的一个重要内容,与此形成鲜明对照的是同情、怜悯受害女主的弹 幕。屏幕上正上演男人女人的悲欢离合,弹幕里同时在上演另一个剧情——一个坏蛋伤害了一个好人。 好人受伤的原因是外在的,因为那个坏蛋。发弹幕的人通过文字向外界传递着自己的一种重要情感体验:渣男可恶至极,女 主无辜可怜。一般情况下,发弹幕的大多是成年人,但这样的思维与表达却完全是儿童式的,成人世界里没有绝对的好人和坏 人,也没有无辜的女主,只有不了解自己也不了解对方的人。在弹幕里骂坏蛋很容易、很过瘾,但在现实生活中,遇到渣男而完 全不被吸引可能就没那么容易了,因为渣男似乎总是有着致命的吸引力。越是骂渣男的人也越容易碰到渣男,因为喜欢用骂人来 表达情绪、处理问题的人通常不大关注自己,特别是自己内心的情感需要。痛快是一时的,这种心理状态在当事人内心埋下定时 炸弹,那些从未被看到、被了解的,对亲密、对爱的隐秘幻想可能在未来某个猝不及防的时刻暴露出来——当某个人出现时。 恋爱中,没有所谓对的人,只有诱发、暴露我们内心隐秘欲望的人。也就是说,婚恋的痛苦与不幸的原因从来不是外在的, 而是在我们自己身上。 实际上,当爱恋的情感发生时,“我”遇上的那个“你”,是我们内心隐秘幻想的两个部分——一个是强烈渴望被满足的 需要,另一个是满足这些需要的他人,它们都是存在于我们内心深处的感觉,而不是眼前那个真实的人。 伤害我们的不是别人。真正带来伤害的不是渣男,不是那个让人恨得咬牙切齿的恋爱对象,而是“受害者”内心的幻想,来 自于童年。恋爱中我们碰到的第一个关系不是成年的我和你的关系,而是幼年的我和我父母的关系。 当我们还是一个婴儿的时候,每个人都十分脆弱、无助,内心充满各种恐惧。能够让这些痛苦折磨得到回应、抚慰的那个 人,就是我们人生第一个热恋对象,通常是妈妈。精神分析客体关系学派认为,我们都是被关系决定的,生命初期和妈妈的互动 关系决定了我们一生的爱与恨,是所有强烈情感的发源地。对于婴儿来说,这种互动的品质生死攸关,没有妈妈的回应,婴儿无 法独自存活,婴儿对妈妈回应的需要和对食物的需要一样强烈,甚至更强。妈妈积极、细腻、温柔的回应是我们人生爱的初体 验,如果这种爱的体验总是可以被满足的话,我们可能就永远不会感受到痛苦,那是不是就是我们幻想的天堂呢? 但在真实的世界里,这样的生存环境根本不存在。现实情况是
展开阅读全文
相关搜索
资源标签