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