Android 靜態代碼分析工具
簡評:作者在文中提到的三個靜態代碼分析工具不是互相替代的關係,各有各的側重點,如果有需要完全可以同時使用。
靜態代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結構、過程、介面等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現的空指針引用等等。
對於 Android 來說用得最多的三個靜態代碼分析工具當屬:
- Lint
- PMD
- Findbugs
Lint
Lint 是 Google 提供給 Android 開發者的靜態代碼分析工具,能幫助開發者優化代碼和找到潛在的 bug。
配置:
在項目中創建 script-lint.gradle 文件:
android {n lintOptions {n lintConfig file("$project.rootDir/tools/rules-lint.xml")n htmlOutput file("$project.buildDir/outputs/lint/lint.html")n warningsAsErrors truen xmlReport falsen }n}n
其中兩個重要的屬性:
- lintConfig : lint 規則文件的路徑。
- htmlOutput : html 報告生成的路徑。
之後在 build.gradle 文件中引用:
apply plugin: com.android.applicationnapply from: "$project.rootDir/tools/script-lint.gradle"nn...n
測試:
運行 ./gradlew lint 命令,就可以在上面設置的 htmlOutput 路徑下找到 lint.html 文件,打開後就會看到類似下面的提示:
Findbugs
Findbugs 分析的是 Java 位元組碼,能識別出上百種的潛在錯誤。
配置:
創建 script-findbugs.gradle文件:
apply plugin: findbugsnntask findbugs(type: FindBugs) {n excludeFilter = file("$project.rootDir/tools/rules-findbugs.xml")n classes = fileTree("$project.buildDir/intermediates/classes/dev/debug/com/dd")n source = fileTree("$project.rootDir/src/main/java/com/dd/")n classpath = files()nn reports {n xml.enabled = falsen html.enabled = truen html.destination = "$project.buildDir/outputs/findbugs/findbugs.html"n }n}n
屬性:
- excludeFilter:Findbugs 規則文件的路徑。
- classes:classes 文件的路徑。
- source:源碼的路徑。
- html.destination:html 報告的生成地址。
同樣需要在 build.gradle 中進行引用:
apply plugin: com.android.applicationnapply from: "$project.rootDir/tools/script-findbugs.gradle"nn...n
測試:
下面的這段代碼:
// MainActivity.javann...nnprivate void someMethod(int variable) {n switch (variable) {n case 1:n System.out.println("1");n case 2:n System.out.println("2");n }n}nn...n
運行 ./gradlew findbugs 命令,findbugs.html 中就會生成檢測結果,類似於下面這樣:
PMD
PMD 能發現常見的編程缺陷,比如未使用的變數、空的 catch 塊、不必要的對象等等。
配置:
創建 script-pmd.gradle文件:
apply plugin: pmdnntask pmd(type: Pmd) {n ruleSetFiles = files("$project.rootDir/tools/rules-pmd.xml")n source = fileTree(src/main/java/)nn reports {n xml.enabled = falsen html.enabled = truen html.destination = "$project.buildDir/outputs/pmd/pmd.html"n }n}n
屬性:
- ruleSetFiles:規則文件路徑。
- source:源碼路徑。
- html.destination:檢測結果的 html 文件所在路徑。
同樣,再在 build.gradle 文件中引用:
apply plugin: com.android.applicationnapply from: "$project.rootDir/tools/script-pmd.gradle"nn...n
測試:
// MainActivity.javann...nnprivate void someMethod(int a, int b, int c, int d) {n if (a > b) {n if (b > c) {n if (c > d) {n if (d > a) {n // some logicn }n }n }n }n}nn...n
執行 ./gradlew pmd 命令,在 html.destination 設置的路徑下找到 pmd.html,就能夠看到如下的檢測結果:
上面提到的所有文件,和配置項都可以在作者的這個項目中找到:dmytrodanylyk/template
原文:Configuring Android Project?—?Static Code Analysis Tools
相關閱讀:
- 聊聊 Android StateListAnimator
歡迎關註:知乎專欄「極光日報」,每天為 Makers 導讀三篇優質英文文章。
推薦閱讀:
※間諜軟體Skygofree潛伏4年,你的秘密還在嗎?
※Google ARCore 突破次元壁
※如何評價 Lumia 830 被刷上 Android?
※如何理解Context?