黃 濤
(武漢城市職業(yè)學(xué)院 計(jì)算機(jī)與電子信息工程學(xué)院 湖北 武漢:430064)
移動(dòng)應(yīng)用代碼的作用就是在運(yùn)行某個(gè)移動(dòng)操作系統(tǒng)的移動(dòng)設(shè)備上實(shí)現(xiàn)移動(dòng)應(yīng)用的功能,目前主流的移動(dòng)操作系統(tǒng)主要是Android和IOS兩大陣營。當(dāng)前移動(dòng)應(yīng)用開發(fā)技術(shù)百花齊放,既有傳統(tǒng)的原生開發(fā)技術(shù),也有基于Web前端技術(shù)的混合開發(fā)和跨平臺(tái)開發(fā),這些都直接導(dǎo)致了移動(dòng)應(yīng)用代碼較其他類型應(yīng)用代碼更加復(fù)雜。比如同一個(gè)移動(dòng)應(yīng)用項(xiàng)目所用代碼語言可以多選一,且多種代碼語言也可以存在同一個(gè)項(xiàng)目中混合使用,各自負(fù)責(zé)自己的功能模塊。移動(dòng)應(yīng)用開發(fā)過程中代碼還會(huì)經(jīng)常調(diào)用各種第三方庫來輔助功能實(shí)現(xiàn)。因此移動(dòng)應(yīng)用代碼特點(diǎn)總結(jié)起來就是代碼語言多樣化、代碼結(jié)構(gòu)復(fù)雜化、代碼功能模塊化。
1.2.1 代碼缺陷
軟件開發(fā)是一項(xiàng)人為參與的智力活動(dòng),勢(shì)必引入缺陷[1]。軟件缺陷(fault),又稱為錯(cuò)誤(error)、故障(defect)、失效(failure)、bug、問題(problem)等,是軟件如影隨形的特有成分。雖然無法完全杜絕缺陷,但可以對(duì)其進(jìn)行分析與監(jiān)測,以盡量減少缺陷[2]。代碼缺陷特指軟件缺陷中與代碼相關(guān)的問題,主要集中在代碼的語法、結(jié)構(gòu)、流程、效率、安全性等方面。代碼缺陷是軟件缺陷中的重要組成部分,直接決定了軟件質(zhì)量。
1.2.2 代碼缺陷常用檢測方法
在軟件開發(fā)過程中,軟件開發(fā)人員常常要花大量時(shí)間進(jìn)行代碼缺陷檢測,盡量做到將絕大多數(shù)代碼問題解決在軟件開發(fā)過程中,以保證所發(fā)布軟件的質(zhì)量。代碼缺陷檢測技術(shù)可以分為靜態(tài)、動(dòng)態(tài)和混合分析方法[3]。靜態(tài)檢測方法是指在應(yīng)用程序不運(yùn)行的情況下,基于應(yīng)用程序特征進(jìn)行系統(tǒng)檢測分析[4]。靜態(tài)檢測會(huì)通過詞法分析、語法分析、控制流、數(shù)據(jù)流分析等技術(shù)對(duì)程序代碼進(jìn)行掃描和分析,來尋找代碼中潛在的問題。動(dòng)態(tài)檢測方法是指在程序運(yùn)行時(shí),通過提取運(yùn)行過程中產(chǎn)生的各種信息并加以分析,來完成代碼檢測的分析方式?;旌蠙z測方法顧名思義,就是融合了靜態(tài)檢測和動(dòng)態(tài)檢測的方法。代碼缺陷檢測可以以純?nèi)斯さ姆绞竭M(jìn)行,也可以使用檢測工具輔助進(jìn)行,本文主要研究基于工具的靜態(tài)檢測方案。
原生開發(fā)模式是一種傳統(tǒng)的官方的開發(fā)模式,其與移動(dòng)操作系統(tǒng)相關(guān),有專門的編程語言與集成開發(fā)環(huán)境用于移動(dòng)應(yīng)用開發(fā)。比如Android App的原生開發(fā)可以使用Java或Kotlin語言,配合官方的Android Studio集成開發(fā)環(huán)境;IOS App的原生開發(fā)可以使用Object-C或Swift語言,配合官方的XCode集成開發(fā)環(huán)境。原生開發(fā)模式架構(gòu)圖如圖1所示。
圖1 原生開發(fā)模式架構(gòu)圖
圖1中,使用原生開發(fā)模式產(chǎn)生的App可以直接調(diào)用對(duì)應(yīng)移動(dòng)操作系統(tǒng)提供的本地資源用于功能實(shí)現(xiàn)。左邊的Android系統(tǒng)架構(gòu)由四部分組成,從下到上依次是Linux內(nèi)核、Android運(yùn)行環(huán)境和本地庫、應(yīng)用程序框架;右邊的IOS系統(tǒng)架構(gòu)也由四部分組成,從下到上依次是核心操作系統(tǒng)、核心服務(wù)、媒體和觸摸。它們的共同點(diǎn)都是使用類似計(jì)算機(jī)網(wǎng)絡(luò)模型分層的方式進(jìn)行組織,分層的好處就是使用下層提供的服務(wù)而為上層提供統(tǒng)一的服務(wù),屏蔽本層及以下層的差異,當(dāng)本層及以下層發(fā)生了變化不會(huì)影響到上層。各層各司其職,提供固定的服務(wù)接入點(diǎn),實(shí)現(xiàn)高內(nèi)聚、低耦合。
原生開發(fā)模式的特點(diǎn)是App通過移動(dòng)操作系統(tǒng)可以直接操作移動(dòng)設(shè)備資源,如攝像頭、短信、電話本、本地?cái)?shù)據(jù)庫等。在應(yīng)用性能上和交互體驗(yàn)上是最好的,但可移植性差,需要為不同移動(dòng)操作系統(tǒng)單獨(dú)開發(fā)獨(dú)立版本,開發(fā)成本高。
基于Web開發(fā)模式是指基于Web的系統(tǒng)和應(yīng)用,一切資源從服務(wù)器加載。本質(zhì)上就是在App中通過嵌入瀏覽器組件來訪問Web服務(wù)器上的資源,原理與直接使用移動(dòng)操作系統(tǒng)中的瀏覽器訪問網(wǎng)址一樣?;赪eb開發(fā)模式架構(gòu)圖如圖2所示。
圖2 基于Web開發(fā)模式架構(gòu)圖
圖2中,基于Web開發(fā)模式主要是使用原生開發(fā)語言在App中調(diào)用WebView組件進(jìn)行Web服務(wù)器上的前端頁面瀏覽,因此這種開發(fā)模式的主要工作量在Web前端開發(fā)人員,它需要開發(fā)人員能夠進(jìn)行移動(dòng)Web開發(fā)。
基于Web開發(fā)模式的特點(diǎn)是App開發(fā)速度快、更新方便、開發(fā)成本低,即只需開發(fā)出一套代碼,適配于各大主流瀏覽器即可,但頁面加載慢、響應(yīng)速度慢、功能受限。
以原生技術(shù)為主的混合開發(fā)模式就是靜態(tài)資源(HTML、JavaScript、CSS)本地加載,動(dòng)態(tài)資源(數(shù)據(jù))從服務(wù)器加載,綜合運(yùn)用原生開發(fā)語言與Web前端開發(fā)語言,因此該模式需要開發(fā)人員同時(shí)具有App原生開發(fā)和Web前端開發(fā)技能。在App的運(yùn)行過程中,原生界面與Web界面獨(dú)立展示,交替出現(xiàn),原生界面和Web界面的關(guān)系是覆蓋或者層疊。這種移動(dòng)應(yīng)用主體通常是原生開發(fā),Web前端技術(shù)只是起到補(bǔ)充作用。以原生技術(shù)為主的混合開發(fā)模式架構(gòu)圖如圖3所示。
圖3 以原生技術(shù)為主的混合開發(fā)模式架構(gòu)圖
圖3中,以原生技術(shù)為主的混合開發(fā)模式中的Web前端代碼主要基于移動(dòng)操作系統(tǒng)的WebView組件進(jìn)行頁面展示,App中的原生代碼與Web前端代碼可以相互調(diào)用。
以原生技術(shù)為主的混合開發(fā)模式的特點(diǎn)是綜合了原生開發(fā)和Web前端開發(fā)兩種技術(shù),同時(shí)具有原生開發(fā)用戶體驗(yàn)好、功能強(qiáng)和Web前端開發(fā)快速方便的優(yōu)點(diǎn),App體驗(yàn)感介于原生開發(fā)模式和基于Web開發(fā)模式之間。
以Web前端技術(shù)為主的跨平臺(tái)開發(fā)模式是基于第三方的跨平臺(tái)開發(fā)框架,使用Web前端開發(fā)技術(shù)實(shí)現(xiàn)移動(dòng)應(yīng)用的跨平臺(tái)開發(fā)。通過移動(dòng)操作系統(tǒng)調(diào)用本地資源的工作交由框架完成,開發(fā)者只需要關(guān)注界面及功能實(shí)現(xiàn),做到一套代碼可以發(fā)布到不同的移動(dòng)平臺(tái)。以Web前端技術(shù)為主的跨平臺(tái)開發(fā)模式架構(gòu)圖如圖4所示。
圖4 以Web前端技術(shù)為主的跨平臺(tái)開發(fā)模式架構(gòu)圖
圖4中,跨平臺(tái)開發(fā)框架是此模式的核心,目前常用的跨平臺(tái)開發(fā)框架如表1所示,每個(gè)框架的詳細(xì)介紹可以查閱表中的“參考網(wǎng)址”。
表1 常用跨平臺(tái)開發(fā)框架匯總表
以Web前端技術(shù)為主的跨平臺(tái)開發(fā)模式的特點(diǎn)是能夠使用Web前端開發(fā)技術(shù)實(shí)現(xiàn)App的跨平臺(tái)開發(fā),對(duì)只會(huì)Web前端技術(shù)而又想進(jìn)行App開發(fā)的Web前端開發(fā)人員較友好,開發(fā)和維護(hù)成本低,App體驗(yàn)感與以原生技術(shù)為主的混合開發(fā)模式類似。
Flutter跨平臺(tái)開發(fā)模式基于Dart語言,由Google的工程師團(tuán)隊(duì)打造,用于創(chuàng)建高性能、跨平臺(tái)的移動(dòng)應(yīng)用。Flutter針對(duì)當(dāng)下以及未來的移動(dòng)設(shè)備進(jìn)行優(yōu)化,專注于Android和IOS低延遲的輸入和高幀率。Flutter可以給開發(fā)者提供簡單、高效的方式來構(gòu)建和部署跨平臺(tái)、高性能移動(dòng)應(yīng)用,給用戶提供漂亮、快速、接近原生的App體驗(yàn)。
本方案需要首先在原生開發(fā)模式代碼中區(qū)分是Android還是IOS應(yīng)用,然后根據(jù)各自原生開發(fā)所使用的語言進(jìn)行代碼缺陷靜態(tài)檢測工具的選擇。由于Android和IOS的原生開發(fā)應(yīng)用還可以分別使用NDK和Object-C++技術(shù)調(diào)用C/C++代碼,因此這部分也需單獨(dú)處理。具體方案流程圖如圖5所示。圖5中所列可用的主流代碼缺陷檢測工具如表2所示。
圖5 原生開發(fā)模式代碼缺陷檢測方案流程圖
基于Web開發(fā)模式主要依靠App中使用原生代碼調(diào)用WebView組件進(jìn)行Web服務(wù)端的頁面加載顯示,即內(nèi)容及功能部分都集中在服務(wù)端,因此App的原生代碼功能較簡單,代碼缺陷檢測方案相當(dāng)于簡化版的原生開發(fā)模式代碼缺陷檢測方案,即只需檢測原生代碼即可。具體方案流程圖如圖6所示。圖6中所列可用的主流代碼缺陷檢測工具如表2所示。
圖6 基于Web開發(fā)模式代碼缺陷檢測方案流程圖
表2 原生開發(fā)模式可用代碼缺陷檢測工具匯總表
以原生技術(shù)為主的混合開發(fā)模式融合了原生代碼和Web前端代碼,所以對(duì)應(yīng)的代碼缺陷檢測方案中需要同時(shí)涉及到原生代碼的檢測和Web前端代碼的檢測。具體方案流程圖如圖7所示。
圖7中,首先根據(jù)以原生技術(shù)為主的混合開發(fā)模式中的代碼類型進(jìn)行工具選擇,其中原生代碼部分的可用工具可以直接參考原生開發(fā)模式;Web前端代碼部分可用工具主要列出了三個(gè),分別對(duì)應(yīng)HTML、CSS和JavaScript及其框架的檢測,具體介紹如表3所示。
圖7 以原生技術(shù)為主的混合開發(fā)模式代碼缺陷檢測方案流程圖
表3 以原生技術(shù)為主的混合開發(fā)模式可用代碼缺陷檢測工具匯總表
以Web前端技術(shù)為主的跨平臺(tái)開發(fā)模式主要依賴各類跨平臺(tái)開發(fā)框架這個(gè)中間層,可以讓程序員只需關(guān)注Web前端代碼的編寫,調(diào)用底層系統(tǒng)資源的工作交由框架完成。因此代碼缺陷檢測方案中只需進(jìn)行Web前端代碼的檢測。結(jié)合前面表1中所列常用跨平臺(tái)開發(fā)框架使用的語言及框架,具體方案流程圖如圖8所示,圖中所列可用工具參見表3。
圖8 以Web前端技術(shù)為主的跨平臺(tái)開發(fā)模式代碼缺陷檢測方案流程圖
Flutter跨平臺(tái)開發(fā)模式的代碼語言主要為Dart,因此代碼缺陷檢測方案中只需檢測Dart語言。針對(duì)Dart語言可以使用flutter analyze命令檢查或者使用Android Studio自帶的檢查工具檢查。這兩種方式默認(rèn)使用的是Dart的靜態(tài)代碼檢查器dartanalyzer,并使用內(nèi)置在Flutter Tools內(nèi)的終端工具進(jìn)行代碼掃描和分析。
隨著移動(dòng)應(yīng)用開發(fā)技術(shù)的迅猛發(fā)展,移動(dòng)應(yīng)用開發(fā)可選擇的開發(fā)模式較多,不同開發(fā)模式之間的技術(shù)差異性較大,因此目前沒有一款專用工具能夠全部覆蓋各類移動(dòng)應(yīng)用代碼缺陷的靜態(tài)檢測需求,本文只是針對(duì)移動(dòng)應(yīng)用開發(fā)常用開發(fā)模式列出了可用的主流檢測工具。這些工具可以根據(jù)移動(dòng)應(yīng)用開發(fā)時(shí)的具體需要選擇一個(gè)或者多個(gè)來使用,工具的使用方法可自行查閱該工具的使用說明。在實(shí)際使用時(shí)也可以根據(jù)所選集成開發(fā)環(huán)境查找所用工具的插件版,方便使用。