本發(fā)明屬于信息技術(shù)、計算機軟件技術(shù)領(lǐng)域,具體涉及一種基于安卓API使用規(guī)范的代碼質(zhì)量自動評估優(yōu)化方法。
背景技術(shù):
截止目前,由谷歌公司研發(fā)的安卓系統(tǒng)版本已從Android1.0發(fā)展到了Marshmallow6.0,共計發(fā)布了20余種不同的主要版本,而相應(yīng)的安卓應(yīng)用程序編程接口(Android Application Programming Interface,Android API)也從等級1升至等級23。安卓系統(tǒng)的每次版本升級都會依照系統(tǒng)的功能、性能、安全等方面的需求,相應(yīng)地新增、刪除和變更部分API,例如在等級21升級至等級22時,共新增843個、刪除29個、變更144個API方法。但由于安卓應(yīng)用開發(fā)人員的慣性思維,通常根據(jù)已有的經(jīng)驗編寫代碼,忽視或者不注意安卓官方網(wǎng)站聲明的API使用建議,致使一些早在低版本就已不推薦使用或者放棄使用的API仍被調(diào)用,這會導(dǎo)致編寫的應(yīng)用程序存在潛在的安全問題,更容易被惡意程序利用,例如通用漏洞披露Common Vulnerabilities And Exposures(CVE)中CVE-2015-3833即為getRecentTasks()方法導(dǎo)致的信息泄露漏洞,而該方法在API等級21中已被安卓官方網(wǎng)站聲明為不推薦使用。由此可見,API的不當使用嚴重威脅代碼質(zhì)量,進而造成移動智能終端用戶個人信息的泄露,甚至經(jīng)濟財產(chǎn)損失。
但到目前為止,還沒有基于安卓API使用規(guī)范對安卓應(yīng)用程序代碼質(zhì)量進行自動檢測的相關(guān)方法。因此本發(fā)明為了規(guī)范安卓API的使用,建立了完整的自動檢測評估體系,并提出了自動化的代碼質(zhì)量優(yōu)化策略供開發(fā)人員參考,以減少應(yīng)用程序開發(fā)過程中API使用不當?shù)那闆r,進而提升安卓應(yīng)用程序整體的代碼質(zhì)量。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于填補目前對安卓應(yīng)用程序API調(diào)用規(guī)范性檢測的空白,提出一種基于安卓API使用規(guī)范的代碼質(zhì)量自動評估優(yōu)化方法,該方法可有效幫助安卓應(yīng)用程序開發(fā)人員檢測并優(yōu)化API的使用,減少API的誤用,提升安卓應(yīng)用程序代碼質(zhì)量,進而提高安卓應(yīng)用程序的安全等級。
為實現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
一種基于安卓API使用規(guī)范的代碼質(zhì)量自動評估優(yōu)化方法,其步驟包括:
1)針對安卓源碼中的API概述文檔構(gòu)造特定的專用解析器,該解析器可完成所有API對應(yīng)包名、類名、方法名及參數(shù)信息的提取和關(guān)聯(lián);
2)基于安卓API使用規(guī)范將API分為移除API、不推薦API、隱藏API和正常API四類,并建立API特征庫;
3)建立自動掃描評估引擎,統(tǒng)計待測安卓應(yīng)用程序調(diào)用API的類型分布,定位移除API、不推薦API和隱藏API的調(diào)用位置,基于API使用規(guī)范情況和API使用安全性,提出代碼質(zhì)量評級方法,評估代碼質(zhì)量;
4)提供自動化的代碼質(zhì)量優(yōu)化策略,生成代碼質(zhì)量評估報告,供安卓應(yīng)用程序開發(fā)人員參考。
進一步地,步驟2)建立API特征庫時,對于移除API、不推薦API和隱藏API,需查找API注釋中是否存在如information leak(來源于美國國家漏洞數(shù)據(jù)庫)等可引發(fā)安全漏洞的關(guān)鍵字標識,若查找到則認為該API會影響代碼安全,在特征庫中為其添加安全影響標志,提示用戶特別關(guān)注。
進一步地,建立API特征庫時,對于移除API,需根據(jù)API概述文檔的版本判別其移除起始版本號。
進一步地,建立API特征庫時,對于不推薦API,需在源碼注釋中進一步提取不推薦起始版本號、不推薦原因和優(yōu)化建議。
進一步地,API特征庫中的每一條API記錄包括以下信息:包名、類名、方法名、參數(shù)信息、是否正常、是否移除、是否不推薦、是否隱藏、是否安全、移除起始版本號、不推薦起始版本號、不推薦原因和優(yōu)化建議。
進一步地,步驟3)使用靜態(tài)反匯編分析技術(shù)對待測安卓應(yīng)用程序進行反匯編,自動掃描得出其調(diào)用API的類型分布;步驟3)所述靜態(tài)反匯編分析技術(shù)使用以下工具中的一種或多種對安卓應(yīng)用程序進行反匯編:apktool、dex2jar、Android Multitool和QARK等。
進一步地,步驟3)所述代碼質(zhì)量評級方法,綜合考慮不正常API(移除API、不推薦API、隱藏API)所占比例及權(quán)重,計算得出代碼質(zhì)量得分,介于0.0-10.0之間,數(shù)值越大,說明代碼質(zhì)量越差,并將0.0-3.5設(shè)為低危級別,3.6-7.0設(shè)為中危級別,7.1-10.0設(shè)為高危級別。
進一步地,步驟4)所述代碼質(zhì)量評估報告的內(nèi)容包括:1)待測程序調(diào)用API的類型分布;2)待測安卓應(yīng)用程序代碼質(zhì)量評級結(jié)果;3)待測程序調(diào)用的屬于移除API的每條API的包名、類名、方法名、移除起始版本號和具體調(diào)用位置;4)待測程序調(diào)用的屬于不推薦API的每條API的包名、類名、方法名、不推薦起始版本號、優(yōu)化建議和具體調(diào)用位置;5)待測程序調(diào)用的屬于隱藏API的每條API的包名、類名、方法名和具體調(diào)用位置。
本發(fā)明提出一種基于安卓API使用規(guī)范的代碼質(zhì)量自動評估優(yōu)化方法。通過解析安卓官方網(wǎng)站API使用規(guī)范,對API進行分類,建立API特征庫;在此基礎(chǔ)上,掃描待測程序調(diào)用API的分布,評估應(yīng)用程序代碼質(zhì)量并提出優(yōu)化方案。本發(fā)明為考察安卓應(yīng)用程序調(diào)用API的規(guī)范程度建立了完整的自動化檢測評估體系,并提供自動化的代碼質(zhì)量優(yōu)化策略供安卓應(yīng)用程序開發(fā)人員參考,可有效減少API的使用不當及誤用,進而提升安卓應(yīng)用程序整體的代碼質(zhì)量。
附圖說明
圖1是實施例的基于安卓API使用規(guī)范的代碼質(zhì)量自動評估優(yōu)化方法的流程圖。
圖2是實施例的代碼質(zhì)量自動評估優(yōu)化方法的各個處理模塊示意圖。
圖3是實施例中建立API特征庫的流程圖。
圖4是實施例中自動掃描評估代碼質(zhì)量的流程圖。
圖5是實施例中API概述文檔解析器的語法分析樹示意圖。
具體實施方式
下面結(jié)合附圖,通過實施例對本發(fā)明作進一步的說明。
本實施例的基于安卓API使用規(guī)范的代碼質(zhì)量自動評估優(yōu)化方法,其總體流程如圖1所示,各個處理模塊如圖2所示,該方法主要包括以下步驟:
1)針對安卓源碼中的API概述文檔構(gòu)造特定的專用解析器,建立語法分析樹,通過包標識符、類標識符和方法標識符可以有效定位每個API的包名、類名和方法名,進而定位方法的參數(shù)個數(shù)及類型,完成所有API對應(yīng)包名、類名、方法名及參數(shù)信息的提取和關(guān)聯(lián)。
2)根據(jù)解析結(jié)果查找安卓源碼文件,定位每個API的實現(xiàn)位置,并對其注釋部分進行文本挖掘,提取涉及API使用規(guī)范的關(guān)鍵字。將API分為移除API、不推薦API、隱藏API和正常API四類,建立API特征庫。對于移除API、不推薦API和隱藏API,需進一步判斷源碼注釋中是否含有影響代碼安全性的關(guān)鍵字,若含有則在特征庫中為該API添加安全影響標志以提示用戶特別關(guān)注。
具體地,基于安卓API使用規(guī)范對API進行分類,建立API特征庫的步驟流程如圖3所示,具體說明如下:
2a)根據(jù)1)中的API概述文檔解析結(jié)果,在安卓源碼中定位API的具體實現(xiàn)位置,劃分其函數(shù)體實現(xiàn)與代碼注釋部分,轉(zhuǎn)到2b)。
2b)對注釋部分進行文本挖掘,提取與API使用規(guī)范相關(guān)的關(guān)鍵字,轉(zhuǎn)到2c)。
2c)根據(jù)關(guān)鍵字特征,將API分為移除API、不推薦API、隱藏API和正常API四類,轉(zhuǎn)到2d)
2d)判斷每一個API是否為正常API,若是,則轉(zhuǎn)到2j),直接在數(shù)據(jù)庫中為其創(chuàng)建條目;若不是,則轉(zhuǎn)到2e)。
2e)將非正常API進一步分類為移除API、不推薦API和隱藏API,并在數(shù)據(jù)庫中標識,轉(zhuǎn)到2f)。
2f)查找每一個移除API、不推薦API和隱藏API的源碼注釋中是否存在如information leak(來源于美國國家漏洞數(shù)據(jù)庫)等可引發(fā)安全漏洞的關(guān)鍵字標識,若存在則認為該API會導(dǎo)致應(yīng)用程序代碼存在潛在的安全問題,轉(zhuǎn)到2g);若無,則轉(zhuǎn)到2h)。
2g)為該API添加安全影響標志,提醒用戶多加關(guān)注,轉(zhuǎn)到2h)。
2h)判斷該API是否為不推薦API,若是,轉(zhuǎn)到2i),進一步提取相關(guān)信息;若不是,則轉(zhuǎn)到2j)。
2i)在API源碼注釋中提取不推薦API的不推薦起始版本號、不推薦原因和優(yōu)化建議等,轉(zhuǎn)到2j)。
2j)根據(jù)上述步驟整理出的信息,創(chuàng)建API特征庫。API特征庫中的每一條API記錄包括以下信息:包名、類名、方法名、參數(shù)信息、是否正常、是否移除、是否不推薦、是否隱藏、是否安全、移除起始版本號、不推薦起始版本號、不推薦原因和優(yōu)化建議。
3)建立自動掃描評估引擎,評估待測安卓應(yīng)用程序的代碼質(zhì)量。使用靜態(tài)分析技術(shù)對待測安卓應(yīng)用程序進行反匯編,自動掃描得出其調(diào)用API的類型分布,并定位其中移除API、不推薦API的具體調(diào)用位置,提出代碼質(zhì)量評級方法,評估代碼質(zhì)量;
具體地,自動掃描評估引擎,評估待測程序代碼質(zhì)量的步驟流程如圖4所示,具體說明如下:
3a)apktool、dex2jar、Android Multitool和QARK等工具對待測安卓應(yīng)用程序進行反匯編,得到.dex文件,轉(zhuǎn)到3b)。
3b)解析.dex文件,分析文件頭,得到各個類的偏移值,進而定位到類塊,分析每個類包含的各個方法及其調(diào)用位置和物理存儲地址,轉(zhuǎn)到3c)。
3c)分析待測安卓應(yīng)用程序中調(diào)用的所有API的類型,統(tǒng)計移除API、不推薦API、隱藏API和正常API所占百分比,轉(zhuǎn)到3d)。
3d)判斷待測安卓應(yīng)用程序調(diào)用的所有API中是否含有移除API、不推薦API和隱藏API,若有,則轉(zhuǎn)到3e);若無,則轉(zhuǎn)到3f)。
3e)掃描待測安卓應(yīng)用程序調(diào)用的移除API、不推薦API和隱藏API的具體調(diào)用位置,方便安卓應(yīng)用程序開發(fā)人員定位,轉(zhuǎn)到3f)。
3f)統(tǒng)計待測安卓應(yīng)用程序調(diào)用的API類型分布,檢查調(diào)用的移除API、不推薦API和隱藏API是否具有安全性問題,基于API使用規(guī)范情況和API使用安全性,提出代碼質(zhì)量評級方法,評估代碼質(zhì)量。
本發(fā)明提出的代碼質(zhì)量評級方法綜合考慮不正常API所占比例及權(quán)重,計算得出代碼質(zhì)量得分,介于0.0-10.0之間,數(shù)值越大,說明代碼質(zhì)量越差,并將0.0-3.5設(shè)為低危級別,3.6-7.0設(shè)為中危級別,7.1-10.0設(shè)為高危級別。具體計算方法如下:由待測安卓應(yīng)用程序調(diào)用的API類型分布,可知調(diào)用的正常API個數(shù)為L,移除API個數(shù)為M,不推薦API個數(shù)為N,隱藏API個數(shù)為O。根據(jù)不正常API對程序的危險性設(shè)定比例值,正常API:移除API:不推薦API:隱藏API=1:4:3:2。則代碼質(zhì)量Q的計算公式為:
其中,為了凸顯安全相關(guān)的不正常API所帶來的潛在安全危險,提升每一類不正常API中安全相關(guān)API的權(quán)值為2。假設(shè)移除API中與安全相關(guān)的有A個,與安全無關(guān)的有B個,則將上式中的M替換為同理,不推薦API和隱藏API也做類似替換。
4)從API特征庫中提取優(yōu)化建議,提供自動化的代碼質(zhì)量優(yōu)化策略并生成代碼質(zhì)量評估報告,供安卓應(yīng)用程序開發(fā)人員參考。代碼質(zhì)量評估報告內(nèi)容包括:
4a)待測安卓應(yīng)用程序調(diào)用API的類型分布。
4b)待測安卓應(yīng)用程序代碼質(zhì)量評級結(jié)果。
4c)待測安卓應(yīng)用程序調(diào)用的屬于移除API的每條API的包名、類名、方法名、移除起始版本號和具體調(diào)用位置。
4d)待測安卓應(yīng)用程序調(diào)用的屬于不推薦API的每條API的包名、類名、方法名、不推薦起始版本號、優(yōu)化建議和具體調(diào)用位置。
4e)待測安卓應(yīng)用程序調(diào)用的屬于隱藏API的每條API的包名、類名、方法名和具體調(diào)用位置。
下面提供一個具體應(yīng)用實例,其實施步驟包括:
1)構(gòu)造特定的專用解析器解析安卓源碼中的API概述文檔。針對android.app.Activity Manager.setWatchHeapLimit(long)方法,得到的語法分析樹如圖5所示。通過包標識符、類標識符和方法標識符可以有效定位每個API的包名、類名和方法名,進而定位方法的參數(shù)個數(shù)及類型,并將其關(guān)聯(lián)對應(yīng)。
2)建立API特征庫,基于安卓API使用規(guī)范對API進行分類。表1為android.app.Act ivityManager.getRunningTasks(int)方法和android.database.sqlite.SQLiteProgram.native_bind_long(int long)方法在API特征庫中的邏輯結(jié)構(gòu)設(shè)計?!笆欠裾!?、“是否移除”、“是否不推薦”和“是否隱藏”的標志位體現(xiàn)了API分類?!笆欠癜踩睒酥疚蝗魹?則表明該API可能會影響代碼安全性。
表1.API特征庫邏輯結(jié)構(gòu)設(shè)計
上表中的一段英文譯為中文是:自LOLLIPOP版本起,因該方法可能將個人信息泄露給調(diào)用方,第三方應(yīng)用不可使用該方法。為向后兼容,該方法返回調(diào)用方自身任務(wù)信息,和其他不敏感任務(wù)信息。
3)建立自動掃描評估引擎,評估待測程序的代碼質(zhì)量。假設(shè)待測安卓應(yīng)用程序中調(diào)用的各類型API如表2所示。表中數(shù)據(jù)僅作為舉例說明。
表2待測安卓應(yīng)用程序中調(diào)用的各類型API個數(shù)
按照本發(fā)明提出的代碼質(zhì)量評級方法,計算得到該待測安卓應(yīng)用程序的代碼質(zhì)量評級分數(shù)Q為:
屬于中危級別。
進一步定位移除API、不推薦API和隱藏API在應(yīng)用程序中的調(diào)用位置,如不推薦AP I:android.app.ActivityManager.getRunningTasks(int),具體調(diào)用位置如下:
Lcom/wbtech/ums/common/CommonUtil;->getPackageName(Landroid/content/Context;)Ljava/lang/String;
Lcom/fengjr/mobile/act/Base;->getActivityCountInTask()I
Lcom/fengjr/mobile/util/d;->e()Z
Lcom/wbtech/ums/common/CommonUtil;->getActivityName(Landroid/content/Context;)Ljava/lang/String;
Lcom/fengjr/mobile/receiver/MipushMessageReceiver;->isAppRunningForeground(Landroid/content/Context;)Z
Lcom/fengjr/mobile/receiver/JPushReceiver;->a(Landroid/content/Context;)Z
Lcom/fengjr/mobile/act/Base;->isAppRunningForeground(Landroid/content/Context;)Z
4)提供自動化的代碼質(zhì)量優(yōu)化策略。例如針對不推薦使用API:Landroid/net/Connecti vityManager;->getNetworkInfo(I),提供的優(yōu)化策略如下:
This method was deprecated in API level 23.This method does not support multiple connected networks of the same type.Use getAllNetworks()and getNetworkInfo(android.ne t.Network)instead.
上面一段英文所對應(yīng)的中文為:該方法在API等級23中歸為不推薦使用API。該方法不支持多個相同類型的網(wǎng)絡(luò)連接,請使用getAllNetworks()和getNetworkInfo(android.net.Net work)替代。
針對不推薦使用API:Landroid/speech/tts/TextToSpeech;->getFeatures(Ljava/util/Locale;),提供以下優(yōu)化建議:
This method was deprecated in API level 21.As of API level 21,please use voices.In order to query features of the voice,call getVoices()to retrieve the list of available vo ices and getFeatures()to retrieve the set of features.
上面一段英文所對應(yīng)的中文為:該方法在API等級21中被歸為不推薦使用API,請使用voices。欲查詢聲音特征,請調(diào)用getVoices()檢索可用聲音列表,并調(diào)用getFeatures()檢索聲音特征集合。
生成代碼質(zhì)量評估報告。內(nèi)容包括待測程序調(diào)用API的類型分布、移除API、不推薦A PI和隱藏API的相關(guān)信息、具體調(diào)用位置和優(yōu)化建議等,以供安卓應(yīng)用程序開發(fā)人員參考并進行后續(xù)決策處理。
以上實施例僅用于說明本發(fā)明的技術(shù)方案而非對其進行限制,本領(lǐng)域的普通技術(shù)人員可以對本發(fā)明的技術(shù)方案進行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護范圍應(yīng)以權(quán)利要求所述為準。