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