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?

TAG:Android | Android开发 |