安卓code smell的分析与检测方法研究_第1页
安卓code smell的分析与检测方法研究_第2页
安卓code smell的分析与检测方法研究_第3页
安卓code smell的分析与检测方法研究_第4页
安卓code smell的分析与检测方法研究_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、苏州大学本科生毕业设计(论文)目 录 TOC o 1-3 h z u HYPERLINK l _Toc514418693 摘 要 PAGEREF _Toc514418693 h 1 HYPERLINK l _Toc514418694 Abstract PAGEREF _Toc514418694 h 2 HYPERLINK l _Toc514418695 前 言 PAGEREF _Toc514418695 h 3 HYPERLINK l _Toc514418696 第一章 绪 论 PAGEREF _Toc514418696 h 4 HYPERLINK l _Toc514418697 1.1 研究

2、背景及意义 PAGEREF _Toc514418697 h 4 HYPERLINK l _Toc514418698 1.2 Android Code Smell概述 PAGEREF _Toc514418698 h 5 HYPERLINK l _Toc514418699 1.3 本文的主要工作及创新点 PAGEREF _Toc514418699 h 7 HYPERLINK l _Toc514418700 1.4本文的组织结构 PAGEREF _Toc514418700 h 8 HYPERLINK l _Toc514418701 第二章 Androd Code Smell及相关研究 PAGEREF

3、 _Toc514418701 h 9 HYPERLINK l _Toc514418702 2.1 Android Code Smell介绍 PAGEREF _Toc514418702 h 9 HYPERLINK l _Toc514418703 2.2 Code Smell检测的难点 PAGEREF _Toc514418703 h 14 HYPERLINK l _Toc514418704 2.3 研究现状分析 PAGEREF _Toc514418704 h 14 HYPERLINK l _Toc514418705 2.3.1 基于抽象语法树的检测技术 PAGEREF _Toc514418705

4、h 14 HYPERLINK l _Toc514418706 2.3.2 基于文本分析的检测技术 PAGEREF _Toc514418706 h 15 HYPERLINK l _Toc514418707 2.3.3 基于多目标遗传算法的检测技术 PAGEREF _Toc514418707 h 16 HYPERLINK l _Toc514418708 2.4 本章小结 PAGEREF _Toc514418708 h 17 HYPERLINK l _Toc514418709 第三章 Android Code Smell检测规则分析 PAGEREF _Toc514418709 h 18 HYPERL

5、INK l _Toc514418710 3.1 Android Code Smell特征分析 PAGEREF _Toc514418710 h 18 HYPERLINK l _Toc514418711 3.1.1 Android项目结构介绍 PAGEREF _Toc514418711 h 18 HYPERLINK l _Toc514418712 3.1.2实验数据获取 PAGEREF _Toc514418712 h 19 HYPERLINK l _Toc514418713 3.1.3 检测规则制定 PAGEREF _Toc514418713 h 22 HYPERLINK l _Toc514418

6、714 3.2 检测工具的实现 PAGEREF _Toc514418714 h 23 HYPERLINK l _Toc514418715 3.2.1 检测工具的需求分析 PAGEREF _Toc514418715 h 23 HYPERLINK l _Toc514418716 3.2.2 工具的设计原则 PAGEREF _Toc514418716 h 24 HYPERLINK l _Toc514418717 3.2.3 工具构成和模块功能简析 PAGEREF _Toc514418717 h 25 HYPERLINK l _Toc514418718 3.2.4 Smell检测及相关功能实现 PAG

7、EREF _Toc514418718 h 26 HYPERLINK l _Toc514418719 3.2.5 工具测试 PAGEREF _Toc514418719 h 28 HYPERLINK l _Toc514418720 3.4 本章小结 PAGEREF _Toc514418720 h 30 HYPERLINK l _Toc514418721 第四章 Android Code Smell对应用性能影响研究 PAGEREF _Toc514418721 h 31 HYPERLINK l _Toc514418722 4.1 实验设计 PAGEREF _Toc514418722 h 31 HYP

8、ERLINK l _Toc514418723 4.1.1 目标Android Code Smell PAGEREF _Toc514418723 h 31 HYPERLINK l _Toc514418724 4.1.2 性能度量指标 PAGEREF _Toc514418724 h 32 HYPERLINK l _Toc514418725 4.1.3 数据集获取 PAGEREF _Toc514418725 h 32 HYPERLINK l _Toc514418726 4.1.4 度量值收集 PAGEREF _Toc514418726 h 33 HYPERLINK l _Toc514418727 4

9、.2 实验结果分析 PAGEREF _Toc514418727 h 33 HYPERLINK l _Toc514418728 4.3 本章小结 PAGEREF _Toc514418728 h 34 HYPERLINK l _Toc514418729 第五章 总结与展望 PAGEREF _Toc514418729 h 35 HYPERLINK l _Toc514418730 5.1 本文总结 PAGEREF _Toc514418730 h 35 HYPERLINK l _Toc514418731 5.2 后续工作展望 PAGEREF _Toc514418731 h 35 HYPERLINK l

10、_Toc514418732 参考文献 PAGEREF _Toc514418732 h 37 HYPERLINK l _Toc514418733 致 谢 PAGEREF _Toc514418733 h 40苏州大学本科生毕业设计(论文) PAGE 41摘 要Android Code Smell是Android应用程序中导致软件质量下降的糟糕代码实现。伴随着移动设备的大量普及,越来越多的研究者们将目光聚焦到Android Code Smell的研究上来。面对不断增长的用户需求和移动应用的普及,移动开发者们在压力下快速地实现、维护和发展应用,因此,越来越多的Android Code Smell出现在

11、移动应用当中,降低着应用的性能,损耗设备的寿命,影响用户的正常使用体验。本文主要以Android Code Smell为研究对象,根据从Github上获取的20个开源应用源码,以J.Reimann对Smell的定义为基础,制定检测规则,并通过Java的GUI框架,将其封装成桌面应用程序。这个工具在进行Smell检测的过程中,有着不错的准确性,进一步对Smell于应用性能的影响展开研究,针对四个不同的性能度量参数,对修正Smell后的应用性能进行分析,发现相比最初的应用版本,修正后的应用性能都有明显的改善。关键词:Android Code Smell;抽象语法树;性能分析;检测工具Abstrac

12、tAndroid Code Smell is a bad Code implementation for software quality degradation in Android applications.With the proliferation of mobile devices, more and more researchers are focusing on the research of Android Code Smell.Faced with growing demand of users and the popularity of mobile application

13、s, mobile developers quickly under pressure to achieve, maintain, and develop applications, as a result, more and more Android Code Smell appeared in mobile applications, reduce the application performance, loss of life of the equipment, affect the normal use of the user experience.This article main

14、ly to the Android Code Smell as the research object, according to the obtained out at 20 open-source application source Code, to J.R eimann the basis of the definition of a Smell, make detection rules, and through the Java GUI framework, to encapsulate it into desktop applications.This tool in the p

15、rocess of test the Smell, has a good accuracy, and further affect the performance of Smell in the application study, aiming at four different performance measurement parameters, the application of modified after Smell performance is analyzed, found that compared to the original version of applicatio

16、n of the revised application performance have been improved obviously.Keywords:Android Code Smell;Abstract Syntax Tree;Performance Analysis;Detector前 言在软件的开发维护过程中,一个软件系统必将经历几次更新修改,以适应新的需求环境,或者说是修复突然出现的bug REF _Ref508745417 r h * MERGEFORMAT 1。在这样的开发情景下,开发者需要在尽可能快的在产品有限的开发周期中,管理各种复杂的软件开发问题,这样就会导致选用的设

17、计模式,或者编码方式,并不是最优的,这就是所谓的技术债务 REF _Ref508745843 r h * MERGEFORMAT 2。然而,造成技术债务的一个显著因素就是Code Smell。这个概念最早由M. Fowler 提出,被作为开发者在软件系统开发过程中,选用糟糕的设计模式或代码实践的症结 REF _Ref514099682 r h 3。经过广泛的研究,越来越多的研究者和开发人员意识到,Code Smell就是事倍功半,反复维护的症结所在 REF _Ref514099758 r h 4 REF _Ref508747375 r h 5 REF _Ref508747377 r h 6 R

18、EF _Ref508747382 r h 7。近些年来,智能手机大量普及,其中,截至2017年一季度,根据市场数据调研公司Kantar Worldpanel ComTech公布的一项数据显示,在中国、美国、英国、法国、德国等国家,Android设备在所有智能手机中的占比已达到七成左右。Google Play中收纳的Android应用数,截至2017年3月,已经超过270万。为此,研究者们将目光专向了Android应用开发领域。2014年,J.Reimann REF OLE_LINK7 r h * MERGEFORMAT 8等人,针对Android应用的特点,以W. H. Brown、M. Fo

19、wler等人之前提出的Code Smell类目为基础,将Android中存在的Code Smell进行了新的划分指定,形成了包括30种Code Smell在内的新的类目。根据Geoffrey Hecht REF _Ref513746756 r h * MERGEFORMAT 9的相关研究,这些Code Smell对于应用最显著的影响,在于性能方面。由于移动设备硬件体积的限制,其应用的性能优化,相比桌面应用显得更为重要。本文对Code Smell的研究现状进行了分析,并进一步深入到对Android Code Smell的分析研究,制定一系列的检测规则,并将其封装成桌面应用程序。通过实验对工具的性

20、能进行测试,并通过该工具,根据几个Android应用度量参数,对Smell修正前后应用的性能进行进一步的研究,发现修正这些Smell,对应用性能的改善有积极的促进作用。 第一章 绪 论本章首先对Code Smell的相关研究背景及意义进行介绍,其次,针对新提出的Android Code Smell的基本情况进行概述,并简述本次实验所做出的主要工作,及其对相关研究的贡献和创新点,最后,在本章的末尾,简单介绍本文的组织结构。1.1 研究背景及意义Code Smell(Software Smell,Bad Smell,代码异味)是当前软件测试研究领域的热门问题。该术语自1999年被Folwer RE

21、F _Ref513710320 r h * MERGEFORMAT 1等人在文章中提出后,在软件测试领域的使用率就大大提高,并成为敏捷开发者常用的术语之一。Code Smell指代对程序理解以及软件维护有消极影响的反模式设计 REF _Ref513723470 r h 10。在程序开发过程中,程序中任何可能会导致深层次问题的症状代码,都可以被称为Code Smell REF _Ref513746756 r h 9。一般,Code Smell不是bug,它们既不是技术实现上的错误,也不会在当前状态下,对程序的功能实现有抑制作用,但是,它们暗示着程序中存在着降低开发效率,增加bug风险的软件开发漏

22、洞。Code Smell是导致技术负债的潜在因素之一 REF _Ref513746756 r h 9。通常情况下,在对代码做简短的反馈迭代时,Code Smell暗含的一些深层次问题就会被揭示出来,这里的反馈迭代,指代小范围内可控方式下的代码重构。基于这些暴露的问题,开发者们可以进一步检查设计以及代码中是否还存在其他Code Smell,然后再决定是否有进行进一步或者更多重构的需要。从负责重构的开发者的角度来看,Code Smell可以启发何时重构,如何重构。因此,可以说Code Smell推动着重构工作的进行。在过去的几十年中,软件工程领域的研究者们,针对Code Smell对开发者的影响

23、REF _Ref513722713 r h * MERGEFORMAT 11,Code Smell的演变,以及Code Smell对程序理解和软件维护所产生的影响进行了大量的研究。伴随着Code Smell的发展变化,愈来愈多的关注被投放到这个领域。一些针对软件开发周期中,Code Smell的发展状况展开的研究,统计出了Code Smell的一些基础趋势,关于Code Smell与重构导向或错误倾向方面,Li et al.和Hall et al.等人则投入了更多的研究 REF _Ref513723470 r h * MERGEFORMAT 10 REF _Ref513723471 r h *

24、 MERGEFORMAT 12。由于Code Smell的定义是一个比较主观的判断,针对不同的语言、开发者、开发方法,所定义出的Code Smell也各有不同。传统的Code Smell,可以抽象概括为以下5种类型 REF _Ref514100957 r h 13:Bloaters:Bloaters指代已经增加到难以处理的庞大比例的代码、方法和类。通常,这些Code Smell不会立刻出现,而是随着程序开发的不断深入发展,随着时间推移而积累(特别是在无人意识到努力消除它们的时候);Object-Orientation Abusers:这些Code Smell源于对面向对象编程原理 REF _R

25、ef513724124 r h 14的不正确或不完全理解所导致的不合理应用;Change Preventers:这些Code Smell意味着,如果需要在代码中的某个地方更改某些内容,那么还必须在其他地方进行更多相关的修改,结果导致程序开发变得更加复杂和昂贵,这种问题多由程序耦合性过高导致;Dispensables:可有可无的片段是没必要,没有意义的,它的缺失可以使得代码更加简洁高效,易于理解;Couplers:这个类别中的所有Code Smell都是由于类之间的过度耦合,或者显示了如果耦合被过度的委托所取代,会发生什么。综上,为了进一步帮助开发者从纷繁复杂的程序源码中定义Code Smell

26、,研究者们根据不同的分析技术和标准,针对不同的编程语言,设计并实现了许多自动化工具辅助进行Code Smell的检测工作 REF _Ref513724124 r h 14- REF _Ref513724129 r h 18。然而,这些工具提供的关于Code Smell的检测结果都只是相对准确,大多数研究都受制于研究对象的选取,在实际应用中有很大的局限性。所以,Code Smell的研究依然被作为热点问题进行着研究,并向相关应用的方面逐步深入。1.2 Android Code Smell概述与传统的Code Smell类似,Android Code Smell也是导致代码理解或应用维护的一类反模

27、式。不同的是,Fowler提出的Code Smell更具普适性,更倾向维护以及理解,而Android Code Smell则更注重质量指标,重在应用的性能,针对性更强。质量异味是模型中的确定结构,暗示会对那些只能被特定的模型重构的质量需求产生消极影响。J.Reimann根据质量异味的特性,为了解决由于Andorid应用在网络中分布分散,相关资源难以收集分析的问题,针对性的对其中存在的Code Smell进行了详细的定义,为开发者的开发测试维护工作提供了便利。J.Reimann针对Android应用中存在的各项性能和用户体验指标,基于Eclipse建模框架(EMF),通过通用模型重构框架 REF

28、 _Ref513729284 r h * MERGEFORMAT 19,归纳出包括30种Android Code Smell在内的新类目 REF _Ref513729302 r h * MERGEFORMAT 20。如表1.1所示:表1.1 Android Code Smell类型Android Code Smell缩写全称Android Code Smell缩写全称未经压缩的数据传递DTWCData Transmission Without Compression未关闭Closeable对象UCUnclosed Closeable调试版本发布DRDebuggable Release低质量网络

29、下进行的批量数据传输BDTOSNBulk Data Transfer On Slow Network持续唤醒DWDable WakeLock丢失数据DDDropped Data低效的数据格式化和分析IDFAPInefficient Data Format And Parser过早的资源绑定ERBEarly Resource Binding低效的数据结构IDSInefficient Data Structure被后台程序中断IFBInterrupting From Background低效的SQL语句ISQLInefficient SQL Query嵌套布局NLNested Layout内部设置

30、器和获取器IGSInternal Getter Setter在主线程中进行网络和IO操作NIOIMTNetwork & IO Operations In Main Thread内部类泄漏LICLeaking Inner Class缺少UI描述NDUNot Descriptive UI线程泄漏LTLeaking Thread过度渲染的像素OPOverdrawn Pixel忽视成员变量的方法MIMMember-Ignoring Method禁止数据传输PDTProhibited Data Transfer禁止低内存清理NLMRNo Low Memory Resolver跟踪硬件IDTHITrack

31、ing Hardware Id公共数据PDPublic Data未缓存视图UVUncached Views严格的警报管理RAMRigid Alarm Manager焦点顺序不可控UFOUncontrolled Focus Order设置配置改变SCCSet Config Changes不必要的权限UPUnnecessary Permission慢循环SLSlow Loop不可触摸UTUntouchable这30种Android Code Smell包括了开发Android应用过程中的多种常见问题,分别对可达性、内存、稳定性等多个质量指标进行针对性分析,通过对这些Smell进行重构,可以有效提升

32、Android应用的性能,推动移动应用开发的发展。1.3 本文的主要工作及创新点本文以最新提出的Android Code Smell作为研究对象,分析提取规则,具现为检测工具,并将其应用到重构工作中,比较修正前后软件性能的变化情况,进行统计分析。在深入研究Android应用源码的基础上,分析提取检测规则,结合对传统Code Smell检测工具检测技术的研究,选用适当的方式将提取的规则具现,并通过实验进行验证。本次实验的主要工作以及创新点如下:对Android源码进行研究通过Github开源项目平台,搜集了20个Android开源应用的源码,这些应用涉及音乐播放器、游戏、新闻客户端、文件管理器、

33、便签等多个应用领域,由简至繁,项目大小参差。通过手工对源码中的Smell进行标记,组成庞大有效的数据集,为规则提取提供了坚实的数据基础,便于更加全面的分析统计Smell的特征,提高检测规则的准确性。完善并改进Smell检测规则这是本次实验的主要工作之一。本次实验通过对标记出的Smell代码样本,进行统计分析,结合相应Smell在应用中出现的场景,提取出15种检测规则。这些检测规则与Smell分别对应,通过这些检测规则,可以提供对这些Smell的有效检测,并且检测的平均准确性可以达到80%以上,为测试以及开发人员提供有力的参考,进行修正,避免Smell对应用质量以及用户体验带来的消极影响。将提取

34、出的规则封装成工具应用Java的GUI技术,提供友好的操作界面,将提取出的规则进行封装,方便开发者使用。应用界面简洁,二次开发难度低,方便进一步功能扩展后界面的调整。离线桌面应用,不仅可以避免源码上传带宽对工具检测效率的损耗,更可以从根本上保护应用源码,防止源码泄漏对使用者造成的利益损失。修正Android Code Smell,进行性能比较对修正Smell前后的Android应用的相关性能指标进行比较,分析Android Code Smell对性能的影响。这是本次研究的补充部分,为今后的性能分析奠定基础,开辟道路。为了方便监测应用对应用性能的影响,未使用Google虚拟机作为实验测试设备,以

35、安装了MIUI 9的MI NOTE LTE作为测试机型,这个设备拥有高通骁龙801四核2.5GHz处理器,3GB内存,以及一块5.9英寸1920*1080像素的显示屏,这样的机型在2018年属于大众机型,对于Smell对应用性能影响的研究,有具有代表性的参考作用。1.4本文的组织结构本文共分为五个部分,分别与章节对应,各章节的主要内容安排如下所示:第一章:绪论。本章首先对课题的研究背景及意义进行简单介绍,说明Code Smell研究对软件测试及维护工作的深远意义,进一步细数针对性更强的Android Code Smell,对总共30个Smell进行概述,描述其常现的场景,以及常用的重构手法,然

36、后介绍本文的主要工作和创新点,最后给出文章的组织结构。第二章:Code Smell检测技术概述。由于Android Code Smell是新兴的课题,更多参考研究传统Code Smell的检测技术,有助于对Android Code Smell的分析和检测。本章深入分析Code Smell的检测难点,结合对基于抽象语法数、文本分析,以及多目标遗传算法的Code Smell检测技术的研究,对比Android Code Smell,有助于检测规则的研究。第三章:主要介绍对Android Code Smell检测规则的分析,包括检测工具的设计实现,这是本次文章的中心内容。结合J.Reimann对30种

37、Android Smell的描述,在样本源码中进行标记,经过分类统计,最终分析提取出Smell的Code特征,最终封装成检测规则。为了方便规则在实际开发中的应用,为开发者提供实在的便利,将规则Code化,具化为检测工具。第四章:本章介绍了Smell修正后,Android应用的改善情况。根据以上分析提取的检测规则封装成的工具,检测实验样本中的Smell,并根据J.Reimann提供的建议进行重构,通过自动化脚本测试应用性能的改善情况,并进行统计分析。第五章:总结全文,简述未来工作的计划和展望。第二章 Androd Code Smell及相关研究本章首先对Android Code Smell进行介

38、绍,接着对相关的Code Smell检测技术进行分析研究,详述它们的实现原理,分析传统Code Smell的检测难点,结合Android Code Smell的特性,论述其对本次实验研究的参考价值。2.1 Android Code Smell介绍Android Code Smell是Android多种Context下糟糕的代码实现的总结和归纳,本节则对这些Smell进行详细的介绍。未经压缩的数据传递(DTWC,Data Transmission Without Compression) REF OLE_LINK7 r h * MERGEFORMAT 8,由于移动设备在网络传输上的局限性,以及对

39、资源的合理有效利用的需求,在网络传输事务中,相关文件应该经过压缩后再进行传输。根据Hpfner和Bunse的研究结果 REF _Ref513747798 r h 20,在网络基础设施上进行未压缩数据的传输,将会产生更多的资源消耗,而经过压缩之后,这个资源消耗至少可以被降低10%,可以有效提升资源的利用率。调试版本发布(DR,Debuggable Release) REF OLE_LINK7 r h * MERGEFORMAT 8,或者可以称之为白盒版本发布,Android应用在开发的过程中,通过注册脚本AndroidManifest.xml中的属性参数android:debuggable进行应

40、用开发权限的设置。在应用开发阶段将其值设置为True,可以有效帮助应用开发人员在开发过程中,监测应用的编译运行情况,定位bug或者其他应用深层的问题。但是,当应用开发完毕,最后编译决定发布时,依然保持开发调试的状态,将会将这一敏感的权限,或者称之为后门漏洞的bug,暴露在用户面前,对用户的隐私,以及开发团队的利益,埋下被非法利用的隐患。持续唤醒(DW,Dable WakeLock) REF OLE_LINK7 r h * MERGEFORMAT 8,在某些功能的运行过程中,比如GPS、Network等,有时候需要这些功能的持续运转,唤醒锁定,就是告知系统,在这个期间保持设备在开启状态,不将其作

41、为后台冗余程序移除。一般这项功能在设定的时候,会直接或间接的设置执行时间,功能执行完毕,唤醒锁定即被释放,避免不必要的能量消耗。唤醒锁定的长时间持续运行会增加电池的压力,降低移动设备硬件的使用寿命。低效的数据格式化和分析(IDFAP,Inefficient Data Format And Parser) REF OLE_LINK7 r h * MERGEFORMAT 8,在进行数据通信的同时,应当尽可能减少冗余数据,提升通信数据的质量。在IO和网络数据传输的背景下,低效的数据格式或降低应用的通信质量,为此,json得到了愈加广泛的应用,而传统的xml,则成为低效数据传输的代名词。低效的数据结构

42、(IDS,Inefficient Data Structure) REF OLE_LINK7 r h * MERGEFORMAT 8,类HashMap这样的数据结构,仅在进行轻量级数据操作时,具有一定的优势。在当前的应用背景下,数据结构愈加复杂,数据量也愈加庞大,数据传输频率也愈加高。这样数据结构已经不能满足性能优化的需要,所以在进行应用开发的时候,建议对传统的HashMap进行改进,或是使用其他,比如SparseArray,性能更好的数据结构进行替换,以满足日渐变化的应用功能开发需求。低效的SQL语句(ISQ,Inefficient SQL Query) REF OLE_LINK7 r h

43、* MERGEFORMAT 8,作为客户端产品,在Android应用中,是不建议直接在应用中进行数据查询等数据库相关操作的。这样的操作,不仅会对带宽、CPU、电池能源等造成较大的负担,还会暗藏安全问题,存在引发黑客攻击,泄漏服务器数据库数据的风险。因此,将相关的操作放置在服务器端,仅通过客户端与服务器之间的数据请求,将直连数据库的操作分离出来,保障数据安全的同时,降低数据传输的消耗。内部设置器和获取器(IGS,Internal Getter Setter) REF OLE_LINK7 r h * MERGEFORMAT 8,虽然其由于程序的健壮性,遵循了“统一访问原则”,对于属性赋值的合法判断

44、等等方面,Setter和Getter都有很大的意义。但是,作为Android应用,这种二次开发可能性很小,除非出现明显漏洞的情况下,应用的性能优化才是首选。根据调查结果显示,在不使用JIT(即时编译器,Just-In-Time Compiler)的环境下,直接访问成员变量,相比使用Getter,效率要高达3倍;在使用JIT的情况下,直接访问成员属性的速度几乎与访问本地变量一般,速度比起使用Getter要快到7倍以上。所以,除非一些公共的API,考虑到开发者二次开发,提高库鲁棒性之外,不建议使用Getter和Setter。内部类泄漏(LIC,Leaking Inner Class) REF OL

45、E_LINK7 r h * MERGEFORMAT 8,在内部类中包含对外部类的引用,会存在内存泄漏的风险,所以推荐的方法是,使用静态内部类,或者弱引用的方式进行替代。因为Java特殊的机制,其一,静态内部类中,是不允许直接引用外部类的非静态对象的,其二,被弱引用的对象实例,一旦失去与实例对象之间的联系,就会被作为垃圾回收。线程泄漏(LT,Leaking Thread) REF OLE_LINK7 r h * MERGEFORMAT 8,线程是Java中垃圾回收机制的基础,所以不会被GC回收,如果不显性的停止线程,则会一直运行在内存中,占用内存资源,甚至造成内存泄漏。忽视成员变量的方法(MIM

46、,Member-Ignoring Method) REF OLE_LINK7 r h * MERGEFORMAT 8,如果类中的成员方法,没有涉及任何类成员变量的操作,那么应该将其设置为静态方法,因为相较成员函数,静态方法在程序编译执行的时候,具有更高的效率。禁止低内存清理(NLMR,No Low Memory Resolver) REF OLE_LINK7 r h * MERGEFORMAT 8,由于较小的RAM,以及SWAP空间的缺失,移动设备对于内存的处理标准一直比较严苛,所以,在很多涉及到内存使用的Android类中,都设置有“onLowMemory()”方法,对内存进行监测,方便所有

47、后台进程都被kill时进行内存清理操作。如果,拥有这个方法或者继承该方法的类,未重写该方法,对内存的合理使用进行适当规范,则认定其可能影响应用性能。公共数据(PD,Public Data) REF OLE_LINK7 r h * MERGEFORMAT 8,Android应用数据的存储位置相对一般情况没有特别的加密保护,只是通过访问权限参数进行管控,对于相关参数的错误设置,将会暴露敏感的私有数据,造成安全问题。参数值有四个待选项,其中,只有Context.MODE_PRIVATE是确实私有的,其下,如Context.MODE_WORLD_READAB LE和Context.MODE_WORLD

48、_ WRITEABLE只是对公共的读写权限进行限制,属于伪私有,在出现相关属性时,应当向开发者提供提醒,确定其是否明确。严格的警报管理(RAM,Rigid Alarm Manager) REF OLE_LINK7 r h * MERGEFORMAT 8,AlarmManager类在Android中负责设备的定时以及唤醒等功能,如果频繁的唤醒,或者持续唤醒,对于手机的电量使用,或者CPU等,都将是不友好的,所以,推荐使用模糊警报或是非唤醒,来避免以上的问题。设置配置改变(SCC,Set Config Changes) REF OLE_LINK7 r h * MERGEFORMAT 8,这个也是限

49、定与注册脚本AndroidManifest.xml配置文件中出现的问题。通过属性android:configChanges,设置需要手动设置的属性,当然,这些设置提供了默认值,但是,既然将这个权限提供给用户,由于用户对于相关权限背景不熟悉,那么就存在着内存泄漏等隐患。慢循环(SL,Slow Loop) REF OLE_LINK7 r h * MERGEFORMAT 8,相比传统的for三段循环结构,应用迭代器的新式循环体被推荐使用,新的版本可以有效提升循环体运行时的效率,当然,这种循环体也不是万用的,针对需求知道类似指定值下标这样的操作,依然需要使用传统的循环结构。未关闭Closeable对象

50、(UC,Unclosed Closeable) REF OLE_LINK7 r h * MERGEFORMAT 8,未关闭实现closeable接口的对象。类似文件,数据库,网络连接等,这些接口打开后,就会一直保持占用状态,所以都实现了closeable接口,方便在功能使用完毕后,及时关闭接口,释放资源,不然会出现内存泄漏等问题。低质量网络下进行的批量数据传输(BDTOSN,Bulk Data Transfer On Slow Network) REF OLE_LINK7 r h * MERGEFORMAT 8。在低质量的网络(EDGE、2G、3G)下批量传输数据,相比好的网络环境,速度更慢,

51、并且会消耗更多的资源。所以,需要在传输数据的时候,将NetWork设置到4G、WIFI等优质的网络环境下,或者为用户提供Preference决定网络使用的优先级。丢失数据(DD,Dropped Data) REF OLE_LINK7 r h * MERGEFORMAT 8,这是在Android开发中常见的问题,屏幕方向的变化、Activity的切换等,在当前Activity下输入的数据可能就丢失了,这样的情况对于用户体验很不好,所以在存在需要用户输入内容的时候,需要重写Activity下的onSaveInstanceState(Bundle outState),在其中加入保存输入的文字的内容。

52、过早的资源绑定(ERB,Early Resource Binding) REF OLE_LINK7 r h * MERGEFORMAT 8。根据研究数据显示,对于消耗能量的物理资源,如果绑定的太早,更多的资源将被消耗。有些时候,这些资源是在其绑定对象已经可见的时才进行绑定,比如说,GPS多和Map进行绑定的,所以,当地图画面加载完毕之后,再将GPS服务启动并绑定。针对这些问题,一般的处理方法是,在Activity的onCreate中进行绑定操作,移动到onResume中。被后台程序中断(IFB,Interrupting From Background) REF OLE_LINK7 r h *

53、MERGEFORMAT 8。在广播接收BroadcastReceivers,或者服务Services,这些后台运行的功能模块startActivity的时候,可能会打断当前用户进行的操作,使得用户的数据丢失,影响用户使用体验。所以,应该拒绝在这些功能模块中调用startActivity启动新的Activity。如果有必要,给出Notifications向用户进行提醒就好了。嵌套布局(NL,Nested Layout) REF OLE_LINK7 r h * MERGEFORMAT 8, 在Android界面布局文件中,使用LinearLayout进行布局虽然方便,却更僵硬,会造成深度嵌套,几何

54、级的增加计算时间。为此,推荐使用RelativeLayout或者标签,更加灵活的进行页面布局,降低冗余计算消耗。在主线程中进行网络和IO操作(NIOIMT,Network & IO Operations In Main Thread) REF OLE_LINK7 r h * MERGEFORMAT 8,在Android应用Activity的主线程中,进行网络或IO操作存在着性能隐患。在Android中,主线程中只能执行UI和一般逻辑相关的操作,涉及重量级的,比如数据传输、IO、SQL等,这些可能耗费较多资源与计算时间的操作,会严重占用主线程的计算资源,最优的方式是新建线程,通过合理的线程调度,

55、合理的分配资源的使用,避免在主线程中进行。缺少UI描述(NDU,Not Descriptive UI) REF OLE_LINK7 r h * MERGEFORMAT 8,android:contentDescription未被设置属性值,这个smell相较其他而言,被修正的优先级较低。为了方便有视觉障碍,或者其他有特殊需要用户的使用需求,Android中为元素设置了android:contentDescription提供辅助的控件描述,提供给TalkBack方便用户更好的使用Android应用。所以,推荐显性的设置android:contentDescription或者在代码中使用eleme

56、nt.setContentDescription()动态设置元素的描述。过度渲染的像素(OP,Overdrawn Pixel) REF OLE_LINK7 r h * MERGEFORMAT 8,由于颜色透明度的不恰当使用,造成叠加后的糟糕UI体验,这是进行Smell检测最为困难的一个。为了丰富UI界面,水晶效果越来越多的应用到界面设计中,颜色透明度的合理搭配就是其中的重点。但是,如若不恰当进行透明度或者颜色的搭配,多层透明的颜色叠加,最后的整体效果可能就会与理想的差距很多,造成很糟糕的用户体验。禁止数据传输(PDT,Prohibited Data Transfer) REF OLE_LINK

57、7 r h * MERGEFORMAT 8,在进行数据传输之前,应当检查用户是否已经禁止后台传输。为了降低网络资源的消耗,用户通常会在闲置时关闭数据连接。考虑到提升用户体验,在进行数据通信或是网络传输等相关操作的时,应首先检查数据网络的连通性,如若需要,提供可视的问询对话框,提示用户开启数据连接。跟踪硬件ID(THI,Tracking Hardware Id) REF OLE_LINK7 r h * MERGEFORMAT 8,为了满足某些特定的需求,可能需要生成唯一可靠稳定的辨识符ID,但是根据硬件设备生成这个ID,存在被推算出来利用的安全隐患。通过IMEI、MEID、ESN,可以获得唯一的

58、硬件ID,但是这需要开启READ_PHONE_STATE这一敏感权限,存在被追踪泄漏用户隐私的隐患,这就不可靠稳定了。为此,推荐使用类似UUID这样的方式,复杂的ID生成方式,可以有效生成可靠稳定唯一的辨识ID。未缓存视图(UV,Uncached Views) REF OLE_LINK7 r h * MERGEFORMAT 8,在使用ListView等视图组件时,如果不提前缓存好将渲染的数据页面,滑动加载数据时,会存在加载延迟,对用户体验大打折扣。为此,可以通过Holder缓存已经渲染过的数据,除非新载入,否则直接读取之前缓存的数据渲染至视图。焦点顺序不可控(UFO,Uncontrolled

59、Focus Order) REF OLE_LINK7 r h * MERGEFORMAT 8,在某些涉及焦点移动的界面,控件的顺序将是焦点移动的根据,不恰当的设置可能会导致糟糕的用户体验。虽然,开发者下意识的控件顺序布置,以及焦点移动的就近原则,在很多情况下可以满足焦点移动的需要,但是,在某些情况下,这可能不是所期望的效果。为此,推荐指定对控件的物理顺序进行设置,保障用户体验。不必要的权限(UP,Unnecessary Permission) REF OLE_LINK7 r h * MERGEFORMAT 8,在Android 4.0之后,权限的控制变得愈加严苛,不必要的权限申请,将会为影响用

60、户体验,甚至存在安全隐患。所以,在Android中,应该尽可能少的申请权限,或者申请敏感级别更低的权限,但是在实际操作中,很难对此进行界定。不可触摸(UT,Untouchable) REF OLE_LINK7 r h * MERGEFORMAT 8,控件尺寸的不恰当设置,将会让用户的触控产生苦恼。因此,在设置需要与用户进行互动的控件尺寸时,其大小至少大于48dp(9mm左右),当然,这样的尺寸只是极端情况,实际设置时,应该自适,确保用户可以方便地对目标组件进行。2.2 Code Smell检测的难点Code Smell是一种程序中存在问题的“暗示”,并非一定会导致程序的异常状况,这些“暗示”有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论