前言
在團(tuán)隊(duì)Android項(xiàng)目開發(fā)過程中,難免會出現(xiàn)一些比較不容易發(fā)現(xiàn)搓谆,但是又比較低級的bug薯嗤。而且因?yàn)槊總€開發(fā)人員的編碼習(xí)慣不同嘹害,寫出的代碼也會有差異撮竿。為了保證團(tuán)隊(duì)開發(fā)中代碼的規(guī)范以及盡量避免低級bug,我們往往需要一些工具來進(jìn)行嚴(yán)格的檢查笔呀。下面將介紹在項(xiàng)目中用到的四種插件 lint幢踏、findBugs、PMD许师、 CheckStyles 的功能和使用方式房蝉,以及如何將多個插件整合在一起,在方便使用的同時盡量做到與項(xiàng)目工程解耦微渠。
一搭幻、lint
Lint是Android Studio提供的一個代碼檢測工具,通過它開發(fā)者不用運(yùn)行或者寫測試代碼逞盆,就可以發(fā)現(xiàn)和糾正問題檀蹋,優(yōu)化代碼結(jié)構(gòu)。每個被檢測到的問題云芦,都會生成一條描述信息并指明相應(yīng)的嚴(yán)重性級別俯逾,當(dāng)然這個嚴(yán)重性級別我們也可以自己設(shè)置的贸桶。
檢測范圍
- 潛在的bug
- 可優(yōu)化的代碼
- 安全性
- 性能
- 可用性
- 可訪問性
- 國際化
插件安裝
Android Studio自帶,無需安裝桌肴。
插件使用
通過Gradle運(yùn)行l(wèi)int
在工程的根目錄下運(yùn)行相應(yīng)的gradle task皇筛。
- Windows
gradle lint
- Linux 或者 MAC
./gradlew lint
當(dāng)運(yùn)行上面的命令執(zhí)行完后,就會在項(xiàng)目目錄/app/build/outputs/lint-results-debug.html生成相應(yīng)的文件坠七,可用瀏覽器打開查看水醋。
手動運(yùn)行l(wèi)int
有時我們可能只針對某個文件或者某個目錄進(jìn)行檢測,這時使用gradle的方式就比較麻煩了灼捂,所以Android Studio提供給我們手動運(yùn)行l(wèi)int的方式离例。
在AS的工程下選擇module换团、目錄或者文件
右鍵選擇Analyze > Inspect Code.
-
此時會出現(xiàn)一個選擇“指定檢測范圍”的dialog
-
配置完成后,點(diǎn)擊OK按鈕,進(jìn)行檢測全谤。檢測結(jié)果如下圖所示寨典,左邊是檢測類型的樹形結(jié)構(gòu),右邊則展示詳細(xì)的信息想虎。
注:詳細(xì)的使用卦尊,請看官網(wǎng)文檔 Improve Your Code with Lint
二、findBugs
FindBugs是一個Java靜態(tài)分析工具舌厨,用來檢查類或者jar文件岂却,用來發(fā)現(xiàn)可能的問題。檢測完成之后會生成一份詳細(xì)的報告裙椭,借助這份報告可以找到潛在的bug躏哩,比如NullPointException,特定的資源沒有關(guān)閉揉燃,查詢數(shù)據(jù)庫沒有調(diào)用Cursor.close()等
檢測范圍
- 常見代碼錯誤扫尺,序列化錯誤
- 可能導(dǎo)致錯誤的代碼,如空指針引用
- 國際化相關(guān)問題:如錯誤的字符串轉(zhuǎn)換
- 可能受到的惡意攻擊炊汤,如訪問權(quán)限修飾符的定義等
- 多線程的正確性:如多線程編程時常見的同步正驻,線程調(diào)度問題。
- 運(yùn)行時性能問題:如由變量定義抢腐,方法調(diào)用導(dǎo)致的代碼低效問題
插件安裝
在Android Studio中選擇Preferences -> Plugins姑曙,輸入查找findBugs進(jìn)行插件安裝。
插件使用
在build.gradle文件中迈倍,按照下面步驟進(jìn)行設(shè)置:
- 添加plugin
apply plugin:'findbugs'
- 定義任務(wù)伤靠,指定輸出格式
task findbugs(type: FindBugs, dependsOn: "assembleDebug") {
ignoreFailures = true
effort = "max"
reportLevel = "high"
excludeFilter = new File("$configDir/findbugs/findbugs-filter.xml")
classes = files("${project.rootDir}/app/build/intermediates/classes")
source 'src'
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = false
html.enabled = true
xml {
destination "$reportsDir/findbugs/findbugs.xml"
}
html {
destination "$reportsDir/findbugs/findbugs.html"
}
}
classpath = files()
}
這里要注意因?yàn)閒indBugs是檢查class文件,所以在定義task的時候授瘦,我們是dependsOn: "assembleDebug"醋界,確保運(yùn)行findbugs的task能夠成功檢測竟宋。
通過gradle findbugs方式,在工程目錄下運(yùn)行命令形纺,檢測完成后丘侠,會在制定的目錄下生成報告文檔。文檔支持xml和html兩種格式逐样,本文設(shè)置的是html格式蜗字,可以直接用瀏覽器打開。
當(dāng)然脂新,和lint一樣挪捕,findBugs也支持手動檢測的方式。在工程里争便,右鍵 FindBugs -> (選擇檢測的范圍)级零。檢測完之后,底部工具欄會跳到FindBugs-IEDA下滞乙,如圖所示奏纪。
三、PMD
PMD是一個很有用的工具斩启,它跟Findbugs類似序调,但是它不是檢測字節(jié)碼,它是直接檢測源代碼兔簇。它使用靜態(tài)分析來發(fā)現(xiàn)錯誤发绢。為什么要將它們同時使用呢?因?yàn)樗鼈兊臋z測方法不同垄琐,可以取到互補(bǔ)的作用边酒。
檢測范圍
- 可能的bug——空的try/catch/finally/switch塊。
- 無用代碼(Dead code):無用的本地變量此虑,方法參數(shù)和私有方法甚纲。
- 空的if/while語句。
- 過度復(fù)雜的表達(dá)式——不必要的if語句朦前,本來可以用while循環(huán)但是卻用了for循環(huán)介杆。
- 可優(yōu)化的代碼:浪費(fèi)性能的String/StringBuffer的使用。
插件安裝
同樣可以通過AS的plugin進(jìn)行安裝韭寸,推薦安裝QAPlug-PMD春哨。
插件使用
在build.gradle文件中進(jìn)行如下配置
- 導(dǎo)入Plugin:
apply plugin: 'pmd'
- Task配置
task pmd(type: Pmd) {
ignoreFailures = false
ruleSetFiles = files("$configDir/pmd/pmd-ruleset.xml")
ruleSets = []
source 'src'
include '**/*.java'
exclude '**/gen/**'
exclude 'androidTest/**'
exclude 'test/**'
reports {
xml.enabled = false
html.enabled = true
xml {
destination "$reportsDir/pmd/pmd.xml"
}
html {
destination "$reportsDir/pmd/pmd.html"
}
}
}
四、CheckStyles
這個工具用來自動檢測java源碼恩伺。啟動之后赴背,可以按照制定的規(guī)則對java源碼進(jìn)行檢查,被將所有的不符合規(guī)范的地方生成報告通知給你。
檢測范圍
- 注解
- javadoc注釋
- 命名規(guī)范
- 文件頭
- 導(dǎo)入包規(guī)范
- 尺寸設(shè)置
- 空格
- 正則表達(dá)式
- 修飾符
- 代碼塊
- 編碼問題
- 類設(shè)計(jì)問題
- 重復(fù)凰荚、度量以及一些雜項(xiàng)
總而言之燃观,是一些代碼規(guī)范問題!!
插件安裝
通過AS的Plugin進(jìn)行安裝
插件使用
- 導(dǎo)入Plugin
apply plugin: 'checkstyle'
- 設(shè)置CheckStyle的版本
checkstyle {
toolVersion '6.1.1'
showViolations true
}
- 配置任務(wù)
task checkstyle(type: Checkstyle) {
configFile file("$configDir/checkstyle/k12_checkstyle.xml")
configProperties.checkstyleSuppressionsPath = file("$configDir/checkstyle/suppressions.xml").absolutePath
source 'src'
include '**/*.java'
exclude '**/gen/**'
exclude 'androidTest/**'
exclude 'test/**'
ignoreFailures true
classpath = files()
}
五、插件的接入與使用
檢測范圍
lint便瑟、PMD缆毁、findBugs和CheckStyle檢測范圍之和。
插件安裝
- 下載整合插件的文件包到涂,和app工程目錄同級放置脊框。
- 在app的build.gradle文件導(dǎo)入整合插件腳本
apply from: '../config/quality.gradle'
插件使用
- 修改quality.gradle 的appDir字段,設(shè)置檢測的工程目錄
// 應(yīng)用目錄名稱
def appDir = "app-k12"
- 進(jìn)入工程根目錄践啄,運(yùn)行gradle check浇雹,檢測完成后,會在build/reports下生成相應(yīng)的檢測報告文件屿讽。當(dāng)然也可以按照每個插件的使用方式單獨(dú)使用昭灵。
總結(jié)
最后,隨文附上插件的git地址聂儒,歡迎fork和star虎锚。
config
再推薦之前封裝的兩個好用的組件: