安卓code smell的分析與檢測方法研究_第1頁
安卓code smell的分析與檢測方法研究_第2頁
安卓code smell的分析與檢測方法研究_第3頁
安卓code smell的分析與檢測方法研究_第4頁
安卓code smell的分析與檢測方法研究_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、蘇州大學(xué)本科生畢業(yè)設(shè)計(論文)目 錄 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 本文的主要工作及創(chuàng)新點 PAGEREF _Toc514418699 h 7 HYPERLINK l _Toc514418700 1.4本文的組織結(jié)構(gòu) PAGEREF _Toc514418700 h 8 HYPERLINK l _Toc514418701 第二章 Androd Code Smell及相關(guān)研究 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 研究現(xiàn)狀分析 PAGEREF _Toc514418704 h 14 HYPERLINK l _Toc514418705 2.3.1 基于抽象語法樹的檢測技術(shù) PAGEREF _Toc514418705

4、h 14 HYPERLINK l _Toc514418706 2.3.2 基于文本分析的檢測技術(shù) PAGEREF _Toc514418706 h 15 HYPERLINK l _Toc514418707 2.3.3 基于多目標(biāo)遺傳算法的檢測技術(shù) PAGEREF _Toc514418707 h 16 HYPERLINK l _Toc514418708 2.4 本章小結(jié) PAGEREF _Toc514418708 h 17 HYPERLINK l _Toc514418709 第三章 Android Code Smell檢測規(guī)則分析 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項目結(jié)構(gòu)介紹 PAGEREF _Toc514418711 h 18 HYPERLINK l _Toc514418712 3.1.2實驗數(shù)據(jù)獲取 PAGEREF _Toc514418712 h 19 HYPERLINK l _Toc514418713 3.1.3 檢測規(guī)則制定 PAGEREF _Toc514418713 h 22 HYPERLINK l _Toc514418

6、714 3.2 檢測工具的實現(xiàn) PAGEREF _Toc514418714 h 23 HYPERLINK l _Toc514418715 3.2.1 檢測工具的需求分析 PAGEREF _Toc514418715 h 23 HYPERLINK l _Toc514418716 3.2.2 工具的設(shè)計原則 PAGEREF _Toc514418716 h 24 HYPERLINK l _Toc514418717 3.2.3 工具構(gòu)成和模塊功能簡析 PAGEREF _Toc514418717 h 25 HYPERLINK l _Toc514418718 3.2.4 Smell檢測及相關(guān)功能實現(xiàn) PAG

7、EREF _Toc514418718 h 26 HYPERLINK l _Toc514418719 3.2.5 工具測試 PAGEREF _Toc514418719 h 28 HYPERLINK l _Toc514418720 3.4 本章小結(jié) PAGEREF _Toc514418720 h 30 HYPERLINK l _Toc514418721 第四章 Android Code Smell對應(yīng)用性能影響研究 PAGEREF _Toc514418721 h 31 HYPERLINK l _Toc514418722 4.1 實驗設(shè)計 PAGEREF _Toc514418722 h 31 HYP

8、ERLINK l _Toc514418723 4.1.1 目標(biāo)Android Code Smell PAGEREF _Toc514418723 h 31 HYPERLINK l _Toc514418724 4.1.2 性能度量指標(biāo) PAGEREF _Toc514418724 h 32 HYPERLINK l _Toc514418725 4.1.3 數(shù)據(jù)集獲取 PAGEREF _Toc514418725 h 32 HYPERLINK l _Toc514418726 4.1.4 度量值收集 PAGEREF _Toc514418726 h 33 HYPERLINK l _Toc514418727 4

9、.2 實驗結(jié)果分析 PAGEREF _Toc514418727 h 33 HYPERLINK l _Toc514418728 4.3 本章小結(jié) PAGEREF _Toc514418728 h 34 HYPERLINK l _Toc514418729 第五章 總結(jié)與展望 PAGEREF _Toc514418729 h 35 HYPERLINK l _Toc514418730 5.1 本文總結(jié) PAGEREF _Toc514418730 h 35 HYPERLINK l _Toc514418731 5.2 后續(xù)工作展望 PAGEREF _Toc514418731 h 35 HYPERLINK l

10、_Toc514418732 參考文獻(xiàn) PAGEREF _Toc514418732 h 37 HYPERLINK l _Toc514418733 致 謝 PAGEREF _Toc514418733 h 40蘇州大學(xué)本科生畢業(yè)設(shè)計(論文) PAGE 41摘 要Android Code Smell是Android應(yīng)用程序中導(dǎo)致軟件質(zhì)量下降的糟糕代碼實現(xiàn)。伴隨著移動設(shè)備的大量普及,越來越多的研究者們將目光聚焦到Android Code Smell的研究上來。面對不斷增長的用戶需求和移動應(yīng)用的普及,移動開發(fā)者們在壓力下快速地實現(xiàn)、維護(hù)和發(fā)展應(yīng)用,因此,越來越多的Android Code Smell出現(xiàn)在

11、移動應(yīng)用當(dāng)中,降低著應(yīng)用的性能,損耗設(shè)備的壽命,影響用戶的正常使用體驗。本文主要以Android Code Smell為研究對象,根據(jù)從Github上獲取的20個開源應(yīng)用源碼,以J.Reimann對Smell的定義為基礎(chǔ),制定檢測規(guī)則,并通過Java的GUI框架,將其封裝成桌面應(yīng)用程序。這個工具在進(jìn)行Smell檢測的過程中,有著不錯的準(zhǔn)確性,進(jìn)一步對Smell于應(yīng)用性能的影響展開研究,針對四個不同的性能度量參數(shù),對修正Smell后的應(yīng)用性能進(jìn)行分析,發(fā)現(xiàn)相比最初的應(yīng)用版本,修正后的應(yīng)用性能都有明顯的改善。關(guān)鍵詞: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前 言在軟件的開發(fā)維護(hù)過程中,一個軟件系統(tǒng)必將經(jīng)歷幾次更新修改,以適應(yīng)新的需求環(huán)境,或者說是修復(fù)突然出現(xiàn)的bug REF _Ref508745417 r h * MERGEFORMAT 1。在這樣的開發(fā)情景下,開發(fā)者需要在盡可能快的在產(chǎn)品有限的開發(fā)周期中,管理各種復(fù)雜的軟件開發(fā)問題,這樣就會導(dǎo)致選用的設(shè)

17、計模式,或者編碼方式,并不是最優(yōu)的,這就是所謂的技術(shù)債務(wù) REF _Ref508745843 r h * MERGEFORMAT 2。然而,造成技術(shù)債務(wù)的一個顯著因素就是Code Smell。這個概念最早由M. Fowler 提出,被作為開發(fā)者在軟件系統(tǒng)開發(fā)過程中,選用糟糕的設(shè)計模式或代碼實踐的癥結(jié) REF _Ref514099682 r h 3。經(jīng)過廣泛的研究,越來越多的研究者和開發(fā)人員意識到,Code Smell就是事倍功半,反復(fù)維護(hù)的癥結(jié)所在 REF _Ref514099758 r h 4 REF _Ref508747375 r h 5 REF _Ref508747377 r h 6 R

18、EF _Ref508747382 r h 7。近些年來,智能手機(jī)大量普及,其中,截至2017年一季度,根據(jù)市場數(shù)據(jù)調(diào)研公司Kantar Worldpanel ComTech公布的一項數(shù)據(jù)顯示,在中國、美國、英國、法國、德國等國家,Android設(shè)備在所有智能手機(jī)中的占比已達(dá)到七成左右。Google Play中收納的Android應(yīng)用數(shù),截至2017年3月,已經(jīng)超過270萬。為此,研究者們將目光專向了Android應(yīng)用開發(fā)領(lǐng)域。2014年,J.Reimann REF OLE_LINK7 r h * MERGEFORMAT 8等人,針對Android應(yīng)用的特點,以W. H. Brown、M. Fo

19、wler等人之前提出的Code Smell類目為基礎(chǔ),將Android中存在的Code Smell進(jìn)行了新的劃分指定,形成了包括30種Code Smell在內(nèi)的新的類目。根據(jù)Geoffrey Hecht REF _Ref513746756 r h * MERGEFORMAT 9的相關(guān)研究,這些Code Smell對于應(yīng)用最顯著的影響,在于性能方面。由于移動設(shè)備硬件體積的限制,其應(yīng)用的性能優(yōu)化,相比桌面應(yīng)用顯得更為重要。本文對Code Smell的研究現(xiàn)狀進(jìn)行了分析,并進(jìn)一步深入到對Android Code Smell的分析研究,制定一系列的檢測規(guī)則,并將其封裝成桌面應(yīng)用程序。通過實驗對工具的性

20、能進(jìn)行測試,并通過該工具,根據(jù)幾個Android應(yīng)用度量參數(shù),對Smell修正前后應(yīng)用的性能進(jìn)行進(jìn)一步的研究,發(fā)現(xiàn)修正這些Smell,對應(yīng)用性能的改善有積極的促進(jìn)作用。 第一章 緒 論本章首先對Code Smell的相關(guān)研究背景及意義進(jìn)行介紹,其次,針對新提出的Android Code Smell的基本情況進(jìn)行概述,并簡述本次實驗所做出的主要工作,及其對相關(guān)研究的貢獻(xiàn)和創(chuàng)新點,最后,在本章的末尾,簡單介紹本文的組織結(jié)構(gòu)。1.1 研究背景及意義Code Smell(Software Smell,Bad Smell,代碼異味)是當(dāng)前軟件測試研究領(lǐng)域的熱門問題。該術(shù)語自1999年被Folwer RE

21、F _Ref513710320 r h * MERGEFORMAT 1等人在文章中提出后,在軟件測試領(lǐng)域的使用率就大大提高,并成為敏捷開發(fā)者常用的術(shù)語之一。Code Smell指代對程序理解以及軟件維護(hù)有消極影響的反模式設(shè)計 REF _Ref513723470 r h 10。在程序開發(fā)過程中,程序中任何可能會導(dǎo)致深層次問題的癥狀代碼,都可以被稱為Code Smell REF _Ref513746756 r h 9。一般,Code Smell不是bug,它們既不是技術(shù)實現(xiàn)上的錯誤,也不會在當(dāng)前狀態(tài)下,對程序的功能實現(xiàn)有抑制作用,但是,它們暗示著程序中存在著降低開發(fā)效率,增加bug風(fēng)險的軟件開發(fā)漏

22、洞。Code Smell是導(dǎo)致技術(shù)負(fù)債的潛在因素之一 REF _Ref513746756 r h 9。通常情況下,在對代碼做簡短的反饋迭代時,Code Smell暗含的一些深層次問題就會被揭示出來,這里的反饋迭代,指代小范圍內(nèi)可控方式下的代碼重構(gòu)。基于這些暴露的問題,開發(fā)者們可以進(jìn)一步檢查設(shè)計以及代碼中是否還存在其他Code Smell,然后再決定是否有進(jìn)行進(jìn)一步或者更多重構(gòu)的需要。從負(fù)責(zé)重構(gòu)的開發(fā)者的角度來看,Code Smell可以啟發(fā)何時重構(gòu),如何重構(gòu)。因此,可以說Code Smell推動著重構(gòu)工作的進(jìn)行。在過去的幾十年中,軟件工程領(lǐng)域的研究者們,針對Code Smell對開發(fā)者的影響

23、REF _Ref513722713 r h * MERGEFORMAT 11,Code Smell的演變,以及Code Smell對程序理解和軟件維護(hù)所產(chǎn)生的影響進(jìn)行了大量的研究。伴隨著Code Smell的發(fā)展變化,愈來愈多的關(guān)注被投放到這個領(lǐng)域。一些針對軟件開發(fā)周期中,Code Smell的發(fā)展?fàn)顩r展開的研究,統(tǒng)計出了Code Smell的一些基礎(chǔ)趨勢,關(guān)于Code Smell與重構(gòu)導(dǎo)向或錯誤傾向方面,Li et al.和Hall et al.等人則投入了更多的研究 REF _Ref513723470 r h * MERGEFORMAT 10 REF _Ref513723471 r h *

24、 MERGEFORMAT 12。由于Code Smell的定義是一個比較主觀的判斷,針對不同的語言、開發(fā)者、開發(fā)方法,所定義出的Code Smell也各有不同。傳統(tǒng)的Code Smell,可以抽象概括為以下5種類型 REF _Ref514100957 r h 13:Bloaters:Bloaters指代已經(jīng)增加到難以處理的龐大比例的代碼、方法和類。通常,這些Code Smell不會立刻出現(xiàn),而是隨著程序開發(fā)的不斷深入發(fā)展,隨著時間推移而積累(特別是在無人意識到努力消除它們的時候);Object-Orientation Abusers:這些Code Smell源于對面向?qū)ο缶幊淘?REF _R

25、ef513724124 r h 14的不正確或不完全理解所導(dǎo)致的不合理應(yīng)用;Change Preventers:這些Code Smell意味著,如果需要在代碼中的某個地方更改某些內(nèi)容,那么還必須在其他地方進(jìn)行更多相關(guān)的修改,結(jié)果導(dǎo)致程序開發(fā)變得更加復(fù)雜和昂貴,這種問題多由程序耦合性過高導(dǎo)致;Dispensables:可有可無的片段是沒必要,沒有意義的,它的缺失可以使得代碼更加簡潔高效,易于理解;Couplers:這個類別中的所有Code Smell都是由于類之間的過度耦合,或者顯示了如果耦合被過度的委托所取代,會發(fā)生什么。綜上,為了進(jìn)一步幫助開發(fā)者從紛繁復(fù)雜的程序源碼中定義Code Smell

26、,研究者們根據(jù)不同的分析技術(shù)和標(biāo)準(zhǔn),針對不同的編程語言,設(shè)計并實現(xiàn)了許多自動化工具輔助進(jìn)行Code Smell的檢測工作 REF _Ref513724124 r h 14- REF _Ref513724129 r h 18。然而,這些工具提供的關(guān)于Code Smell的檢測結(jié)果都只是相對準(zhǔn)確,大多數(shù)研究都受制于研究對象的選取,在實際應(yīng)用中有很大的局限性。所以,Code Smell的研究依然被作為熱點問題進(jìn)行著研究,并向相關(guān)應(yīng)用的方面逐步深入。1.2 Android Code Smell概述與傳統(tǒng)的Code Smell類似,Android Code Smell也是導(dǎo)致代碼理解或應(yīng)用維護(hù)的一類反模

27、式。不同的是,F(xiàn)owler提出的Code Smell更具普適性,更傾向維護(hù)以及理解,而Android Code Smell則更注重質(zhì)量指標(biāo),重在應(yīng)用的性能,針對性更強(qiáng)。質(zhì)量異味是模型中的確定結(jié)構(gòu),暗示會對那些只能被特定的模型重構(gòu)的質(zhì)量需求產(chǎn)生消極影響。J.Reimann根據(jù)質(zhì)量異味的特性,為了解決由于Andorid應(yīng)用在網(wǎng)絡(luò)中分布分散,相關(guān)資源難以收集分析的問題,針對性的對其中存在的Code Smell進(jìn)行了詳細(xì)的定義,為開發(fā)者的開發(fā)測試維護(hù)工作提供了便利。J.Reimann針對Android應(yīng)用中存在的各項性能和用戶體驗指標(biāo),基于Eclipse建??蚣?EMF),通過通用模型重構(gòu)框架 REF

28、 _Ref513729284 r h * MERGEFORMAT 19,歸納出包括30種Android Code Smell在內(nèi)的新類目 REF _Ref513729302 r h * MERGEFORMAT 20。如表1.1所示:表1.1 Android Code Smell類型Android Code Smell縮寫全稱Android Code Smell縮寫全稱未經(jīng)壓縮的數(shù)據(jù)傳遞DTWCData Transmission Without Compression未關(guān)閉Closeable對象UCUnclosed Closeable調(diào)試版本發(fā)布DRDebuggable Release低質(zhì)量網(wǎng)絡(luò)

29、下進(jìn)行的批量數(shù)據(jù)傳輸BDTOSNBulk Data Transfer On Slow Network持續(xù)喚醒DWDable WakeLock丟失數(shù)據(jù)DDDropped Data低效的數(shù)據(jù)格式化和分析IDFAPInefficient Data Format And Parser過早的資源綁定ERBEarly Resource Binding低效的數(shù)據(jù)結(jié)構(gòu)IDSInefficient Data Structure被后臺程序中斷IFBInterrupting From Background低效的SQL語句ISQLInefficient SQL Query嵌套布局NLNested Layout內(nèi)部設(shè)置

30、器和獲取器IGSInternal Getter Setter在主線程中進(jìn)行網(wǎng)絡(luò)和IO操作NIOIMTNetwork & IO Operations In Main Thread內(nèi)部類泄漏LICLeaking Inner Class缺少UI描述NDUNot Descriptive UI線程泄漏LTLeaking Thread過度渲染的像素OPOverdrawn Pixel忽視成員變量的方法MIMMember-Ignoring Method禁止數(shù)據(jù)傳輸PDTProhibited Data Transfer禁止低內(nèi)存清理NLMRNo Low Memory Resolver跟蹤硬件IDTHITrack

31、ing Hardware Id公共數(shù)據(jù)PDPublic Data未緩存視圖UVUncached Views嚴(yán)格的警報管理RAMRigid Alarm Manager焦點順序不可控UFOUncontrolled Focus Order設(shè)置配置改變SCCSet Config Changes不必要的權(quán)限UPUnnecessary Permission慢循環(huán)SLSlow Loop不可觸摸UTUntouchable這30種Android Code Smell包括了開發(fā)Android應(yīng)用過程中的多種常見問題,分別對可達(dá)性、內(nèi)存、穩(wěn)定性等多個質(zhì)量指標(biāo)進(jìn)行針對性分析,通過對這些Smell進(jìn)行重構(gòu),可以有效提升

32、Android應(yīng)用的性能,推動移動應(yīng)用開發(fā)的發(fā)展。1.3 本文的主要工作及創(chuàng)新點本文以最新提出的Android Code Smell作為研究對象,分析提取規(guī)則,具現(xiàn)為檢測工具,并將其應(yīng)用到重構(gòu)工作中,比較修正前后軟件性能的變化情況,進(jìn)行統(tǒng)計分析。在深入研究Android應(yīng)用源碼的基礎(chǔ)上,分析提取檢測規(guī)則,結(jié)合對傳統(tǒng)Code Smell檢測工具檢測技術(shù)的研究,選用適當(dāng)?shù)姆绞綄⑻崛〉囊?guī)則具現(xiàn),并通過實驗進(jìn)行驗證。本次實驗的主要工作以及創(chuàng)新點如下:對Android源碼進(jìn)行研究通過Github開源項目平臺,搜集了20個Android開源應(yīng)用的源碼,這些應(yīng)用涉及音樂播放器、游戲、新聞客戶端、文件管理器、

33、便簽等多個應(yīng)用領(lǐng)域,由簡至繁,項目大小參差。通過手工對源碼中的Smell進(jìn)行標(biāo)記,組成龐大有效的數(shù)據(jù)集,為規(guī)則提取提供了堅實的數(shù)據(jù)基礎(chǔ),便于更加全面的分析統(tǒng)計Smell的特征,提高檢測規(guī)則的準(zhǔn)確性。完善并改進(jìn)Smell檢測規(guī)則這是本次實驗的主要工作之一。本次實驗通過對標(biāo)記出的Smell代碼樣本,進(jìn)行統(tǒng)計分析,結(jié)合相應(yīng)Smell在應(yīng)用中出現(xiàn)的場景,提取出15種檢測規(guī)則。這些檢測規(guī)則與Smell分別對應(yīng),通過這些檢測規(guī)則,可以提供對這些Smell的有效檢測,并且檢測的平均準(zhǔn)確性可以達(dá)到80%以上,為測試以及開發(fā)人員提供有力的參考,進(jìn)行修正,避免Smell對應(yīng)用質(zhì)量以及用戶體驗帶來的消極影響。將提取

34、出的規(guī)則封裝成工具應(yīng)用Java的GUI技術(shù),提供友好的操作界面,將提取出的規(guī)則進(jìn)行封裝,方便開發(fā)者使用。應(yīng)用界面簡潔,二次開發(fā)難度低,方便進(jìn)一步功能擴(kuò)展后界面的調(diào)整。離線桌面應(yīng)用,不僅可以避免源碼上傳帶寬對工具檢測效率的損耗,更可以從根本上保護(hù)應(yīng)用源碼,防止源碼泄漏對使用者造成的利益損失。修正Android Code Smell,進(jìn)行性能比較對修正Smell前后的Android應(yīng)用的相關(guān)性能指標(biāo)進(jìn)行比較,分析Android Code Smell對性能的影響。這是本次研究的補(bǔ)充部分,為今后的性能分析奠定基礎(chǔ),開辟道路。為了方便監(jiān)測應(yīng)用對應(yīng)用性能的影響,未使用Google虛擬機(jī)作為實驗測試設(shè)備,以

35、安裝了MIUI 9的MI NOTE LTE作為測試機(jī)型,這個設(shè)備擁有高通驍龍801四核2.5GHz處理器,3GB內(nèi)存,以及一塊5.9英寸1920*1080像素的顯示屏,這樣的機(jī)型在2018年屬于大眾機(jī)型,對于Smell對應(yīng)用性能影響的研究,有具有代表性的參考作用。1.4本文的組織結(jié)構(gòu)本文共分為五個部分,分別與章節(jié)對應(yīng),各章節(jié)的主要內(nèi)容安排如下所示:第一章:緒論。本章首先對課題的研究背景及意義進(jìn)行簡單介紹,說明Code Smell研究對軟件測試及維護(hù)工作的深遠(yuǎn)意義,進(jìn)一步細(xì)數(shù)針對性更強(qiáng)的Android Code Smell,對總共30個Smell進(jìn)行概述,描述其?,F(xiàn)的場景,以及常用的重構(gòu)手法,然

36、后介紹本文的主要工作和創(chuàng)新點,最后給出文章的組織結(jié)構(gòu)。第二章:Code Smell檢測技術(shù)概述。由于Android Code Smell是新興的課題,更多參考研究傳統(tǒng)Code Smell的檢測技術(shù),有助于對Android Code Smell的分析和檢測。本章深入分析Code Smell的檢測難點,結(jié)合對基于抽象語法數(shù)、文本分析,以及多目標(biāo)遺傳算法的Code Smell檢測技術(shù)的研究,對比Android Code Smell,有助于檢測規(guī)則的研究。第三章:主要介紹對Android Code Smell檢測規(guī)則的分析,包括檢測工具的設(shè)計實現(xiàn),這是本次文章的中心內(nèi)容。結(jié)合J.Reimann對30種

37、Android Smell的描述,在樣本源碼中進(jìn)行標(biāo)記,經(jīng)過分類統(tǒng)計,最終分析提取出Smell的Code特征,最終封裝成檢測規(guī)則。為了方便規(guī)則在實際開發(fā)中的應(yīng)用,為開發(fā)者提供實在的便利,將規(guī)則Code化,具化為檢測工具。第四章:本章介紹了Smell修正后,Android應(yīng)用的改善情況。根據(jù)以上分析提取的檢測規(guī)則封裝成的工具,檢測實驗樣本中的Smell,并根據(jù)J.Reimann提供的建議進(jìn)行重構(gòu),通過自動化腳本測試應(yīng)用性能的改善情況,并進(jìn)行統(tǒng)計分析。第五章:總結(jié)全文,簡述未來工作的計劃和展望。第二章 Androd Code Smell及相關(guān)研究本章首先對Android Code Smell進(jìn)行介

38、紹,接著對相關(guān)的Code Smell檢測技術(shù)進(jìn)行分析研究,詳述它們的實現(xiàn)原理,分析傳統(tǒng)Code Smell的檢測難點,結(jié)合Android Code Smell的特性,論述其對本次實驗研究的參考價值。2.1 Android Code Smell介紹Android Code Smell是Android多種Context下糟糕的代碼實現(xiàn)的總結(jié)和歸納,本節(jié)則對這些Smell進(jìn)行詳細(xì)的介紹。未經(jīng)壓縮的數(shù)據(jù)傳遞(DTWC,Data Transmission Without Compression) REF OLE_LINK7 r h * MERGEFORMAT 8,由于移動設(shè)備在網(wǎng)絡(luò)傳輸上的局限性,以及對

39、資源的合理有效利用的需求,在網(wǎng)絡(luò)傳輸事務(wù)中,相關(guān)文件應(yīng)該經(jīng)過壓縮后再進(jìn)行傳輸。根據(jù)Hpfner和Bunse的研究結(jié)果 REF _Ref513747798 r h 20,在網(wǎng)絡(luò)基礎(chǔ)設(shè)施上進(jìn)行未壓縮數(shù)據(jù)的傳輸,將會產(chǎn)生更多的資源消耗,而經(jīng)過壓縮之后,這個資源消耗至少可以被降低10%,可以有效提升資源的利用率。調(diào)試版本發(fā)布(DR,Debuggable Release) REF OLE_LINK7 r h * MERGEFORMAT 8,或者可以稱之為白盒版本發(fā)布,Android應(yīng)用在開發(fā)的過程中,通過注冊腳本AndroidManifest.xml中的屬性參數(shù)android:debuggable進(jìn)行應(yīng)

40、用開發(fā)權(quán)限的設(shè)置。在應(yīng)用開發(fā)階段將其值設(shè)置為True,可以有效幫助應(yīng)用開發(fā)人員在開發(fā)過程中,監(jiān)測應(yīng)用的編譯運行情況,定位bug或者其他應(yīng)用深層的問題。但是,當(dāng)應(yīng)用開發(fā)完畢,最后編譯決定發(fā)布時,依然保持開發(fā)調(diào)試的狀態(tài),將會將這一敏感的權(quán)限,或者稱之為后門漏洞的bug,暴露在用戶面前,對用戶的隱私,以及開發(fā)團(tuán)隊的利益,埋下被非法利用的隱患。持續(xù)喚醒(DW,Dable WakeLock) REF OLE_LINK7 r h * MERGEFORMAT 8,在某些功能的運行過程中,比如GPS、Network等,有時候需要這些功能的持續(xù)運轉(zhuǎn),喚醒鎖定,就是告知系統(tǒng),在這個期間保持設(shè)備在開啟狀態(tài),不將其作

41、為后臺冗余程序移除。一般這項功能在設(shè)定的時候,會直接或間接的設(shè)置執(zhí)行時間,功能執(zhí)行完畢,喚醒鎖定即被釋放,避免不必要的能量消耗。喚醒鎖定的長時間持續(xù)運行會增加電池的壓力,降低移動設(shè)備硬件的使用壽命。低效的數(shù)據(jù)格式化和分析(IDFAP,Inefficient Data Format And Parser) REF OLE_LINK7 r h * MERGEFORMAT 8,在進(jìn)行數(shù)據(jù)通信的同時,應(yīng)當(dāng)盡可能減少冗余數(shù)據(jù),提升通信數(shù)據(jù)的質(zhì)量。在IO和網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)谋尘跋?,低效的?shù)據(jù)格式或降低應(yīng)用的通信質(zhì)量,為此,json得到了愈加廣泛的應(yīng)用,而傳統(tǒng)的xml,則成為低效數(shù)據(jù)傳輸?shù)拇~。低效的數(shù)據(jù)結(jié)構(gòu)

42、(IDS,Inefficient Data Structure) REF OLE_LINK7 r h * MERGEFORMAT 8,類HashMap這樣的數(shù)據(jù)結(jié)構(gòu),僅在進(jìn)行輕量級數(shù)據(jù)操作時,具有一定的優(yōu)勢。在當(dāng)前的應(yīng)用背景下,數(shù)據(jù)結(jié)構(gòu)愈加復(fù)雜,數(shù)據(jù)量也愈加龐大,數(shù)據(jù)傳輸頻率也愈加高。這樣數(shù)據(jù)結(jié)構(gòu)已經(jīng)不能滿足性能優(yōu)化的需要,所以在進(jìn)行應(yīng)用開發(fā)的時候,建議對傳統(tǒng)的HashMap進(jìn)行改進(jìn),或是使用其他,比如SparseArray,性能更好的數(shù)據(jù)結(jié)構(gòu)進(jìn)行替換,以滿足日漸變化的應(yīng)用功能開發(fā)需求。低效的SQL語句(ISQ,Inefficient SQL Query) REF OLE_LINK7 r h

43、* MERGEFORMAT 8,作為客戶端產(chǎn)品,在Android應(yīng)用中,是不建議直接在應(yīng)用中進(jìn)行數(shù)據(jù)查詢等數(shù)據(jù)庫相關(guān)操作的。這樣的操作,不僅會對帶寬、CPU、電池能源等造成較大的負(fù)擔(dān),還會暗藏安全問題,存在引發(fā)黑客攻擊,泄漏服務(wù)器數(shù)據(jù)庫數(shù)據(jù)的風(fēng)險。因此,將相關(guān)的操作放置在服務(wù)器端,僅通過客戶端與服務(wù)器之間的數(shù)據(jù)請求,將直連數(shù)據(jù)庫的操作分離出來,保障數(shù)據(jù)安全的同時,降低數(shù)據(jù)傳輸?shù)南?。?nèi)部設(shè)置器和獲取器(IGS,Internal Getter Setter) REF OLE_LINK7 r h * MERGEFORMAT 8,雖然其由于程序的健壯性,遵循了“統(tǒng)一訪問原則”,對于屬性賦值的合法判斷

44、等等方面,Setter和Getter都有很大的意義。但是,作為Android應(yīng)用,這種二次開發(fā)可能性很小,除非出現(xiàn)明顯漏洞的情況下,應(yīng)用的性能優(yōu)化才是首選。根據(jù)調(diào)查結(jié)果顯示,在不使用JIT(即時編譯器,Just-In-Time Compiler)的環(huán)境下,直接訪問成員變量,相比使用Getter,效率要高達(dá)3倍;在使用JIT的情況下,直接訪問成員屬性的速度幾乎與訪問本地變量一般,速度比起使用Getter要快到7倍以上。所以,除非一些公共的API,考慮到開發(fā)者二次開發(fā),提高庫魯棒性之外,不建議使用Getter和Setter。內(nèi)部類泄漏(LIC,Leaking Inner Class) REF OL

45、E_LINK7 r h * MERGEFORMAT 8,在內(nèi)部類中包含對外部類的引用,會存在內(nèi)存泄漏的風(fēng)險,所以推薦的方法是,使用靜態(tài)內(nèi)部類,或者弱引用的方式進(jìn)行替代。因為Java特殊的機(jī)制,其一,靜態(tài)內(nèi)部類中,是不允許直接引用外部類的非靜態(tài)對象的,其二,被弱引用的對象實例,一旦失去與實例對象之間的聯(lián)系,就會被作為垃圾回收。線程泄漏(LT,Leaking Thread) REF OLE_LINK7 r h * MERGEFORMAT 8,線程是Java中垃圾回收機(jī)制的基礎(chǔ),所以不會被GC回收,如果不顯性的停止線程,則會一直運行在內(nèi)存中,占用內(nèi)存資源,甚至造成內(nèi)存泄漏。忽視成員變量的方法(MIM

46、,Member-Ignoring Method) REF OLE_LINK7 r h * MERGEFORMAT 8,如果類中的成員方法,沒有涉及任何類成員變量的操作,那么應(yīng)該將其設(shè)置為靜態(tài)方法,因為相較成員函數(shù),靜態(tài)方法在程序編譯執(zhí)行的時候,具有更高的效率。禁止低內(nèi)存清理(NLMR,No Low Memory Resolver) REF OLE_LINK7 r h * MERGEFORMAT 8,由于較小的RAM,以及SWAP空間的缺失,移動設(shè)備對于內(nèi)存的處理標(biāo)準(zhǔn)一直比較嚴(yán)苛,所以,在很多涉及到內(nèi)存使用的Android類中,都設(shè)置有“onLowMemory()”方法,對內(nèi)存進(jìn)行監(jiān)測,方便所有

47、后臺進(jìn)程都被kill時進(jìn)行內(nèi)存清理操作。如果,擁有這個方法或者繼承該方法的類,未重寫該方法,對內(nèi)存的合理使用進(jìn)行適當(dāng)規(guī)范,則認(rèn)定其可能影響應(yīng)用性能。公共數(shù)據(jù)(PD,Public Data) REF OLE_LINK7 r h * MERGEFORMAT 8,Android應(yīng)用數(shù)據(jù)的存儲位置相對一般情況沒有特別的加密保護(hù),只是通過訪問權(quán)限參數(shù)進(jìn)行管控,對于相關(guān)參數(shù)的錯誤設(shè)置,將會暴露敏感的私有數(shù)據(jù),造成安全問題。參數(shù)值有四個待選項,其中,只有Context.MODE_PRIVATE是確實私有的,其下,如Context.MODE_WORLD_READAB LE和Context.MODE_WORLD

48、_ WRITEABLE只是對公共的讀寫權(quán)限進(jìn)行限制,屬于偽私有,在出現(xiàn)相關(guān)屬性時,應(yīng)當(dāng)向開發(fā)者提供提醒,確定其是否明確。嚴(yán)格的警報管理(RAM,Rigid Alarm Manager) REF OLE_LINK7 r h * MERGEFORMAT 8,AlarmManager類在Android中負(fù)責(zé)設(shè)備的定時以及喚醒等功能,如果頻繁的喚醒,或者持續(xù)喚醒,對于手機(jī)的電量使用,或者CPU等,都將是不友好的,所以,推薦使用模糊警報或是非喚醒,來避免以上的問題。設(shè)置配置改變(SCC,Set Config Changes) REF OLE_LINK7 r h * MERGEFORMAT 8,這個也是限

49、定與注冊腳本AndroidManifest.xml配置文件中出現(xiàn)的問題。通過屬性android:configChanges,設(shè)置需要手動設(shè)置的屬性,當(dāng)然,這些設(shè)置提供了默認(rèn)值,但是,既然將這個權(quán)限提供給用戶,由于用戶對于相關(guān)權(quán)限背景不熟悉,那么就存在著內(nèi)存泄漏等隱患。慢循環(huán)(SL,Slow Loop) REF OLE_LINK7 r h * MERGEFORMAT 8,相比傳統(tǒng)的for三段循環(huán)結(jié)構(gòu),應(yīng)用迭代器的新式循環(huán)體被推薦使用,新的版本可以有效提升循環(huán)體運行時的效率,當(dāng)然,這種循環(huán)體也不是萬用的,針對需求知道類似指定值下標(biāo)這樣的操作,依然需要使用傳統(tǒng)的循環(huán)結(jié)構(gòu)。未關(guān)閉Closeable對象

50、(UC,Unclosed Closeable) REF OLE_LINK7 r h * MERGEFORMAT 8,未關(guān)閉實現(xiàn)closeable接口的對象。類似文件,數(shù)據(jù)庫,網(wǎng)絡(luò)連接等,這些接口打開后,就會一直保持占用狀態(tài),所以都實現(xiàn)了closeable接口,方便在功能使用完畢后,及時關(guān)閉接口,釋放資源,不然會出現(xiàn)內(nèi)存泄漏等問題。低質(zhì)量網(wǎng)絡(luò)下進(jìn)行的批量數(shù)據(jù)傳輸(BDTOSN,Bulk Data Transfer On Slow Network) REF OLE_LINK7 r h * MERGEFORMAT 8。在低質(zhì)量的網(wǎng)絡(luò)(EDGE、2G、3G)下批量傳輸數(shù)據(jù),相比好的網(wǎng)絡(luò)環(huán)境,速度更慢,

51、并且會消耗更多的資源。所以,需要在傳輸數(shù)據(jù)的時候,將NetWork設(shè)置到4G、WIFI等優(yōu)質(zhì)的網(wǎng)絡(luò)環(huán)境下,或者為用戶提供Preference決定網(wǎng)絡(luò)使用的優(yōu)先級。丟失數(shù)據(jù)(DD,Dropped Data) REF OLE_LINK7 r h * MERGEFORMAT 8,這是在Android開發(fā)中常見的問題,屏幕方向的變化、Activity的切換等,在當(dāng)前Activity下輸入的數(shù)據(jù)可能就丟失了,這樣的情況對于用戶體驗很不好,所以在存在需要用戶輸入內(nèi)容的時候,需要重寫Activity下的onSaveInstanceState(Bundle outState),在其中加入保存輸入的文字的內(nèi)容。

52、過早的資源綁定(ERB,Early Resource Binding) REF OLE_LINK7 r h * MERGEFORMAT 8。根據(jù)研究數(shù)據(jù)顯示,對于消耗能量的物理資源,如果綁定的太早,更多的資源將被消耗。有些時候,這些資源是在其綁定對象已經(jīng)可見的時才進(jìn)行綁定,比如說,GPS多和Map進(jìn)行綁定的,所以,當(dāng)?shù)貓D畫面加載完畢之后,再將GPS服務(wù)啟動并綁定。針對這些問題,一般的處理方法是,在Activity的onCreate中進(jìn)行綁定操作,移動到onResume中。被后臺程序中斷(IFB,Interrupting From Background) REF OLE_LINK7 r h *

53、MERGEFORMAT 8。在廣播接收BroadcastReceivers,或者服務(wù)Services,這些后臺運行的功能模塊startActivity的時候,可能會打斷當(dāng)前用戶進(jìn)行的操作,使得用戶的數(shù)據(jù)丟失,影響用戶使用體驗。所以,應(yīng)該拒絕在這些功能模塊中調(diào)用startActivity啟動新的Activity。如果有必要,給出Notifications向用戶進(jìn)行提醒就好了。嵌套布局(NL,Nested Layout) REF OLE_LINK7 r h * MERGEFORMAT 8, 在Android界面布局文件中,使用LinearLayout進(jìn)行布局雖然方便,卻更僵硬,會造成深度嵌套,幾何

54、級的增加計算時間。為此,推薦使用RelativeLayout或者標(biāo)簽,更加靈活的進(jìn)行頁面布局,降低冗余計算消耗。在主線程中進(jìn)行網(wǎng)絡(luò)和IO操作(NIOIMT,Network & IO Operations In Main Thread) REF OLE_LINK7 r h * MERGEFORMAT 8,在Android應(yīng)用Activity的主線程中,進(jìn)行網(wǎng)絡(luò)或IO操作存在著性能隱患。在Android中,主線程中只能執(zhí)行UI和一般邏輯相關(guān)的操作,涉及重量級的,比如數(shù)據(jù)傳輸、IO、SQL等,這些可能耗費較多資源與計算時間的操作,會嚴(yán)重占用主線程的計算資源,最優(yōu)的方式是新建線程,通過合理的線程調(diào)度,

55、合理的分配資源的使用,避免在主線程中進(jìn)行。缺少UI描述(NDU,Not Descriptive UI) REF OLE_LINK7 r h * MERGEFORMAT 8,android:contentDescription未被設(shè)置屬性值,這個smell相較其他而言,被修正的優(yōu)先級較低。為了方便有視覺障礙,或者其他有特殊需要用戶的使用需求,Android中為元素設(shè)置了android:contentDescription提供輔助的控件描述,提供給TalkBack方便用戶更好的使用Android應(yīng)用。所以,推薦顯性的設(shè)置android:contentDescription或者在代碼中使用eleme

56、nt.setContentDescription()動態(tài)設(shè)置元素的描述。過度渲染的像素(OP,Overdrawn Pixel) REF OLE_LINK7 r h * MERGEFORMAT 8,由于顏色透明度的不恰當(dāng)使用,造成疊加后的糟糕UI體驗,這是進(jìn)行Smell檢測最為困難的一個。為了豐富UI界面,水晶效果越來越多的應(yīng)用到界面設(shè)計中,顏色透明度的合理搭配就是其中的重點。但是,如若不恰當(dāng)進(jìn)行透明度或者顏色的搭配,多層透明的顏色疊加,最后的整體效果可能就會與理想的差距很多,造成很糟糕的用戶體驗。禁止數(shù)據(jù)傳輸(PDT,Prohibited Data Transfer) REF OLE_LINK

57、7 r h * MERGEFORMAT 8,在進(jìn)行數(shù)據(jù)傳輸之前,應(yīng)當(dāng)檢查用戶是否已經(jīng)禁止后臺傳輸。為了降低網(wǎng)絡(luò)資源的消耗,用戶通常會在閑置時關(guān)閉數(shù)據(jù)連接??紤]到提升用戶體驗,在進(jìn)行數(shù)據(jù)通信或是網(wǎng)絡(luò)傳輸?shù)认嚓P(guān)操作的時,應(yīng)首先檢查數(shù)據(jù)網(wǎng)絡(luò)的連通性,如若需要,提供可視的問詢對話框,提示用戶開啟數(shù)據(jù)連接。跟蹤硬件ID(THI,Tracking Hardware Id) REF OLE_LINK7 r h * MERGEFORMAT 8,為了滿足某些特定的需求,可能需要生成唯一可靠穩(wěn)定的辨識符ID,但是根據(jù)硬件設(shè)備生成這個ID,存在被推算出來利用的安全隱患。通過IMEI、MEID、ESN,可以獲得唯一的

58、硬件ID,但是這需要開啟READ_PHONE_STATE這一敏感權(quán)限,存在被追蹤泄漏用戶隱私的隱患,這就不可靠穩(wěn)定了。為此,推薦使用類似UUID這樣的方式,復(fù)雜的ID生成方式,可以有效生成可靠穩(wěn)定唯一的辨識ID。未緩存視圖(UV,Uncached Views) REF OLE_LINK7 r h * MERGEFORMAT 8,在使用ListView等視圖組件時,如果不提前緩存好將渲染的數(shù)據(jù)頁面,滑動加載數(shù)據(jù)時,會存在加載延遲,對用戶體驗大打折扣。為此,可以通過Holder緩存已經(jīng)渲染過的數(shù)據(jù),除非新載入,否則直接讀取之前緩存的數(shù)據(jù)渲染至視圖。焦點順序不可控(UFO,Uncontrolled

59、Focus Order) REF OLE_LINK7 r h * MERGEFORMAT 8,在某些涉及焦點移動的界面,控件的順序?qū)⑹墙裹c移動的根據(jù),不恰當(dāng)?shù)脑O(shè)置可能會導(dǎo)致糟糕的用戶體驗。雖然,開發(fā)者下意識的控件順序布置,以及焦點移動的就近原則,在很多情況下可以滿足焦點移動的需要,但是,在某些情況下,這可能不是所期望的效果。為此,推薦指定對控件的物理順序進(jìn)行設(shè)置,保障用戶體驗。不必要的權(quán)限(UP,Unnecessary Permission) REF OLE_LINK7 r h * MERGEFORMAT 8,在Android 4.0之后,權(quán)限的控制變得愈加嚴(yán)苛,不必要的權(quán)限申請,將會為影響用

60、戶體驗,甚至存在安全隱患。所以,在Android中,應(yīng)該盡可能少的申請權(quán)限,或者申請敏感級別更低的權(quán)限,但是在實際操作中,很難對此進(jìn)行界定。不可觸摸(UT,Untouchable) REF OLE_LINK7 r h * MERGEFORMAT 8,控件尺寸的不恰當(dāng)設(shè)置,將會讓用戶的觸控產(chǎn)生苦惱。因此,在設(shè)置需要與用戶進(jìn)行互動的控件尺寸時,其大小至少大于48dp(9mm左右),當(dāng)然,這樣的尺寸只是極端情況,實際設(shè)置時,應(yīng)該自適,確保用戶可以方便地對目標(biāo)組件進(jìn)行。2.2 Code Smell檢測的難點Code Smell是一種程序中存在問題的“暗示”,并非一定會導(dǎo)致程序的異常狀況,這些“暗示”有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論