?

Android 應用程序的代碼異味檢測工具與方法綜述

2022-07-29 06:54王露穎邊奕心
智能計算機與應用 2022年8期
關鍵詞:面向對象異味代碼

王露穎,邊奕心,趙 松,朱 曉,涂 杰

(哈爾濱師范大學 計算機科學與信息工程學院,哈爾濱 150025)

0 引言

代碼異味又被稱為代碼壞味道,最初是由Fowler提出的。代碼異味的存在增加了程序的維護成本,降低了代碼質量。近年來,隨著移動通信技術的迅猛發展,移動應用程序已經成為軟件行業的發展主體。因此,許多學者從不同的角度對Android應用程序中的代碼異味進行了廣泛和深入的研究,開發了許多Android 應用程序中代碼異味自動檢測工具。研究發現,用于檢測傳統桌面應用程序代碼異味的檢測工具也可檢測Android 應用程序中的代碼異味。但是,這些傳統的工具只能檢測Android應用程序中面向對象的代碼異味。

不同于傳統的桌面應用程序,Android 應用程序中除了存在面向對象的代碼異味,還存在Android特有的代碼異味。隨著研究的不斷深入,研究者不斷提出針對Android 應用程序中Android 特有代碼異味的檢測方法和工具,以便于日后對Android 應用程序中特有的代碼異味展開進一步的研究。

目前,針對Android 應用程序中的代碼異味自動檢測工具種類繁多,功能和適用環境各不相同。本文對比分析了目前具有代表性的Android 應用程序中的代碼異味檢測工具和方法,以便Android 應用程序的研究人員在面對實際代碼異味時,能夠選擇合適的檢測工具。

1 相關研究工作綜述

本文重點關注Android 應用程序的代碼異味檢測工具。為了調查檢測工具的應用情況,通過以下3 個步驟對文獻進行檢索:

(1)定義搜索字符串。本文定義了3 組搜索字符串用于文獻搜索,見表1。主要在IEEE Xplore、ACM、Springer 和Google scholar 使用搜索字符串對文獻進行了調查。

表1 用于文獻調查的3 組搜索字符串Tab.1 Three sets of search strings for literatures survey

(2)選擇主要研究對象。本文主要選取與Android 應用程序中代碼異味研究相關的文獻。

(3)篩選目前開源可獲取的自動檢測工具。在這一步中,過濾掉已經不可獲取、無法用于今后研究的Android 應用程序代碼異味自動檢測工具。

本文最終選取了14 篇文獻,見表2??梢园l現,針對Android 應用程序中代碼異味研究的論文,大多數都是在2015~2020 年發表的,并且在僅研究Android 應用程序中面向對象的代碼異味時,研究人員大多仍使用傳統的檢測工具。

表2 Android 應用程序中代碼異味的相關文獻Tab.2 Literatures on code smells in Android applications

2 代碼異味檢測方法

2.1 代碼異味檢測流程

目前,代碼異味檢測方法的基本流程是相似的,如圖1 所示。

圖1 代碼異味檢測流程Fig.1 Code smells detection process

首先,對輸入的項目源代碼進行預處理,提取出待測文件(如.java、.c 文件等);其次,根據不同的檢測方法,將處理好的代碼傳換成中間形式,如抽象語法樹列等結構;最后,使用不同的檢測方法對其中的代碼異味進行檢測,輸出檢測結果。

2.2 代碼異味檢測方法分類

由于代碼異味的存在增加了系統維護的難度,給軟件系統帶來了長期隱患。因此,對軟件系統中異味進行檢測是很有必要的?,F有的代碼異味檢測工具所使用的檢測方法主要可以分為5 類。對此可給出研究分述如下。

(1)基于癥狀的檢測方法?;诎Y狀的異味檢測方法是利用不同的癥狀和概念來描述代碼異味,將異味的“癥狀”描述成中間形式后,轉化為檢測算法對其進行檢測。

(2)基于度量的檢測方法?;诙攘康臋z測方法是最常用的代碼異味探測方法。這種檢測方法以邏輯表達式或條件表達式的形式,將一組度量和不同的閾值組合成一個檢測規則,以檢測代碼中的不同異味。

(3)基于搜索的檢測方法?;谒阉鞯臋z測方法源于基于搜索的軟件工程(SBSE)相關研究。SBSE 使用基于搜索的方法來解決軟件工程中的優化問題,其中絕大多數的技術都應用了機器學習算法?;谒阉鞯漠愇稒z測方法的提出,一定程度上彌補了之前的檢測方法在精確度上的不足。

(4)基于概率的檢測方法?;诟怕实臋z測方法通過確定一個類中存在異味的概率,來識別代碼中的異味類型。一些基于概率的檢測方法,還應用了模糊邏輯規則和頻繁模式樹,對代碼異味進行探測。

(5)基于可視化的檢測方法?;诳梢暬臋z測方法可以通過半自動化的過程來識別代碼中的異味類型。該方法使用如面向可視化的策略和可視化設計缺陷檢測策略等技術,將人類的專業知識與自動化的檢測過程相結合。

現有的檢測工具大多都是基于這些方法所提出的,本文對上述5 類檢測方法的優缺點做了比較,見表3。

表3 不同代碼異味檢測方法比較Tab.3 Comparison of different code smells detection methods

3 Android 應用程序的代碼異味檢測工具

從對Android 應用程序中不同種代碼異味檢測的角度,可將現有Android 應用程序中代碼異味檢測工具分為3 類:一類是僅支持Android 應用程序中面型對象的代碼異味檢測的工具,另一類是僅支持Android 特有代碼異味檢測的工具,第三類是既支持面向對象、又支持Android 特有的代碼異味檢測的工具。目前,可用于Android 應用程序中代碼異味檢測的工具見表4。

3.1 僅支持面向對象代碼異味檢測的工具

已有研究表明,傳統的代碼異味檢測工具可以用來檢測Android 應用程序中面向對象的代碼異味。表4中加粗的JSpIRIT、DECOR、TACO、JDeodorant 和organic 表示已經用于Android 應用程序中的代碼異味檢測研究。

表4 Android 應用程序中代碼異味的檢測工具Tab.4 Tools for detecting code smells in Android applications

同樣用于Android 應用程序中面向對象的代碼異味檢測的工具還有inFusion。Mannan 等人使用inFusion 代碼異味檢測工具針對20 種面向對象的代碼異味,分析了其在Android 應用程序和桌面應用程序中的分布差異。但Rahkema 等人研究面向對象代碼異味在Android 和IOS 應用程序中的分布時,發現inFusion 代碼異味檢測工具目前已經無法獲取。經過調查,當下作為商業軟件的inFusion 確實已無法通過官方渠道免費獲取。因此,后續無法使用inFusion 對Android 應用程序中面向對象的代碼異味進行研究,但iPlasma 可以替代inFusion 對部分面向對象的代碼異味進行檢測。iPlasma 是一個面向對象軟件系統質量評估的集成環境,相當于inFusion 的免費版。iPlasma 使用基于度量的方法對代碼異味進行檢測,但是iPlasma 的功能遠沒有inFusion 強大,也只能夠檢測到11 種代碼異味,而inFusion 則可以檢測到22 種代碼異味。

綜上所述,研究者在研究桌面應用程序中面向對象的代碼異味時,開發的檢測工具可以用于檢測Android 應用程序中面向對象的代碼異味。但是由于這些檢測工具大多以插件的形式存在,所以在檢測Andriod 應用程序中面向對象的代碼異味時,存在局限性。目前,Androd 應用程序大多是在Android Studio 環境下開發的。而在此之前,Androd應用程序都是在Eclipse IDE 和ADT 環境下開發的。在2015 年6 月ADT 不再提供更新支持后,開發者逐漸使用Android Studio 開發Android 應用程序。因此,目前開源的Androd 項目存儲庫中混合了有Android Studio 和舊的Eclipse 開發的Android 項目。顯然,在Android Studio 中運行JDeodorant、TACO、JSpIRIT 等來檢測代碼異味是不可能的,這就導致在運行以Eclipse 插件的形式存在的工具、對Android 應用程序中的代碼異味進行檢測時,會存在一些麻煩。雖然Google 公司為Eclipse 開發的Android 項目提供了自動遷移工具,使其可以由Android Studio 繼續開發,但并不支持反向遷移的情況,這就意味著研究者要是想用JDeodorant、TACO、JSpIRIT 等檢測由Andriod Studio 開發的Andriod 項目時,需要將Andriod Studio 項目文件夾修改為Eclipse 的正確結構,手動完成反向遷移,不利于大規模實驗研究。

3.2 僅支持Android 特有代碼異味檢測的工具

目前,在對Android 特有代碼異味的研究中,使用的開源可獲取的自動檢測工具主要有2 個:aDoctor 和DAAP。2 個檢測工具的對比具體如下:

(1)2 個檢測工具在設計時,參考的都是Reimann 等人提出的異味目錄。

(2)2 個檢測工具都利用抽象語法樹當作中間形式來解析Java 程序。不同的是,DAAP 針對存在于XML 程序中的代碼異味,使用文檔對象模型(Document Object Model)來解析XML 程序。

(3)aDoctor 可以對其中5 種與能耗相關的代碼異味進行重構,而DAAP 不能進行重構操作。

綜合前述分析可知,目前針對Android 特有代碼異味檢測的開源工具還很少,且檢測方法單一。

3.3 既支持面向對象又支持Android 特有代碼異味檢測的工具

Android 應用程序中不僅存在傳統面向對象的代碼異味,還存在Android 特有的代碼異味。目前,2 類代碼異味都可以檢測的開源工具只有PAPRIKA。PAPRIKA 采用基于度量的檢測方法,對Android 應用程序中的代碼異味進行探測。PAPRIKA 通過以下步驟對Android 應用程序中的代碼異味進行探測:

(1)解析Android 應用程序中的APK 文件,構建PAPRIKA 模型。首先,使用Soot 框架及其Dexpler 模塊來分析APK 文件,從中提取度量信息,進而構造PAPRIKA 模型。

(2)將構建好的PAPRIKA 模型存儲到一個圖形數據庫中。為了提供一種可擴展的方法來分析整個Android 應用程序,PAPRIKA 采用的是Neo4j 圖形數據庫來存儲和查詢構建好的PAPRIKA 模型,提取出度量信息。

(3)查詢圖,以檢測Android 應用程序中的代碼異味。當構建好的PAPRIKA 模型被圖形數據庫加載和索引時,就可以使用數據庫查詢語言來探測代碼異味。

在此基礎上分析可知,作為唯一一個既可以檢測Android 應用程序中面向對象的代碼異味和特有代碼異味的工具,研究人員對PAPRIKA 檢測的異味種類不斷進行擴展。其中,Habchi 等人在研究Android 和IOS 應用程序中的代碼異味時,對PAPRIKA 的功能進行了擴展,使其可以檢測由C 和Swift 語言開發的IOS 應用程序中的代碼異味。研究結果表明,Android 應用程序比IOS 應用程序中存在的異味數量更多。Carette 等人在分析Android特有代碼氣味對應用程序性能的影響時,對PAPRIKA 進行擴展使其可以檢測和重構3 種Android 特有的代碼異味。去除代碼異味后,可以提高Android 應用程序的性能。Mateus 等人在研究由Kotlin 語言開發Android 應用程序是否可以提高軟件質量時,改進PAPRIKA 使其可以檢測由Kotlin語言開發的應用程序中的代碼異味。最新研究指出,在由Kotlin 語言開發的Android 應用程序中,面向對象的代碼異味更為常見。目前,PAPRIKA 最多可以檢測4 種面向對象的代碼異味、13 種Android特有的代碼異味。

4 異味檢測工具的評價

不同的檢測工具對于不同規模、開發語言的項目具有不同的檢測效果。目前,常用于評估檢測工具性能的指標主要有 3 個,分別是查準率()、查全率()和值(),各指標數學定義分別如下:

其中,(True Positive)為被檢測為正的正樣本數;(False Positive)為被檢測為正的負樣本數;(False Negative)為被檢測為負的正樣本數。

在檢測Android 應用程序中面向對象的代碼異味時,研究人員常使用傳統檢測桌面應用程序中代碼異味的工具。對于此類檢測工具的檢測精度評價已有大量研究進行了總結。其中,Lim重點評價了JSpIRIT、JDeodorant、DECOR 和TACO 四個傳統的檢測工具對Android 應用程序中代碼異味的檢測效果。結果表明,在對Andriod 應用程序中的代碼異味進行檢測時,4 個檢測工具的漏檢率極高。針對Andriod 應用程序中的異味Large Class,DECOR作為其中檢測效果最好的工具,結果中的值僅為36%,而JDeodoran 則無法檢測出該異味。

目前,缺少對Android 特有代碼異味檢測工具的系統評價。因此,本文首先使用DAAP、aDoctor和PAPRIKA 分別對異味忽略成員的方法(Member Ignoring Method,MIM)進行檢測,然后利用查準率、查全率和值對3 個檢測工具的檢測效果進行評價,從而探討3 個工具的檢測精確度。MIM 是指某個類中的方法,該方法既是非靜態方法,也是非空方法,但該方法沒有訪問所在類的任何屬性。本文選取了6 個開源Android 應用程序作為待測試程序,詳細描述見表5。

表5 6 個Android 應用程序及相關信息Tab.5 Six Android applications and related information

3 個檢測工具對6 個Android 應用程序中異味MIM 的平均檢測結果見表6,具體檢測結果如圖2所示。從表6 和圖2 中可以看出,3 個工具對MIM的檢測性能綜合排名為:aDoctor>PAPRIKA>DAAP。由此可知,aDoctor 的檢測效果最好,其值較DAAP 平均提高16.18%、較PAPRIKA 平均提高5.11%。

圖2 不同工具在6 個Android 應用程序上的檢測結果Fig.2 Detection results of different tools on 6 Android applications

表6 3 個檢測工具對MIM 的平均檢測結果Tab.6 Average detection results for MIM by 3 detection tools %

綜上所述,3 個工具對MIM 的檢測性能綜合排名為:aDoctor>PAPRIKA>DAAP。aDoctor 作為檢測效果最好的工具,值較DAAP 平均提高16.18%、較PAPRIKA 平均提高5.11%。

5 結束語

本文對近幾年用于Android 應用程序中代碼異味檢測的工具和方法做了全面歸納與總結,并對Android 特有代碼異味檢測工具的性能進行了簡單的評估。綜合目前的實際需求,Android 應用程序中代碼異味的檢測工具和方法的未來研究方向包括:

(1)由于Android 應用程序與傳統桌面應用程序在程序結構、API 調用、內存、CPU、網絡、電池等方面的諸多差異,Android 應用程序中代碼異味的種類及分布比傳統桌面應用程序中的更復雜。因此,將傳統的檢測工具直接應用在Android 應用程序中的代碼異味檢測上,其檢測效果差且存在局限性。目前,針對Android 應用程序中面向對象代碼異味檢測的工具僅有PAPRIKA 一個,且最多只能檢測其中的4 種代碼異味。為深入研究Android 應用程序中的代碼異味,未來可以針對Android 應用程序的架構,提出適合且檢測效果較好的代碼異味檢測工具。

(2)目前,針對Android 特有代碼異味檢測的具有代表性的工具只有DAAP、aDoctor 和PAPRIKA,且這3 個檢測工具都是基于度量的檢測方法所設計的。因此,在檢測的過程中會受到閾值局限,出現漏檢的情況,其檢測結果也并不理想。因此,未來可以參考面向對象代碼異味檢測方法,基于其他檢測方法研發出檢測效果更好的檢測工具。

(3)許多研究者在研究傳統面向對象的代碼異味時,針對多種異味之間的聯系、如共存進行深入研究。而Android 應用程序中不僅存在面向對象的代碼異味,還存在其特有的代碼異味。因此,針對2 類異味之間存在的聯系同樣也亟待繼續加大研發力度。目前,可同時檢測2 類代碼異味的工具有PAPRIKA,且其可檢測的異味種類有限。因此,為了方便探索Android 應用程序中2 類代碼異味之間的聯系、進行大規模實驗,未來可以繼續對PAPRIKA 進行擴展,使其可以檢測更多種類的代碼異味,還可以繼續探索其他檢測方法來檢測2 類代碼異味,提出更高效、便捷的檢測工具。

最后,本文研究可以給Android 應用程序中的代碼異味的研究者提供一些參考,選擇合適的檢測和重構工具,有助于后續對Android 應用程序中的代碼異味進行深入研究。

猜你喜歡
面向對象異味代碼
GEE平臺下利用物候特征進行面向對象的水稻種植分布提取
基于深度學習與融合地形特征的黃土陷穴面向對象提取方法
用這些告別異味吧!夏天就要清清爽爽過!
神秘的代碼
基于Web的科研項目管理系統的設計與實現
一周機構凈增(減)倉股前20名
重要股東二級市場增、減持明細
生活小竅門2則
近期連續上漲7天以上的股
怎樣解決臥床老人身上的異味
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合