讓你的項目更優(yōu)雅

前言

在團隊Android項目開發(fā)過程中,難免會出現(xiàn)一些比較不容易發(fā)現(xiàn),但是又比較低級的bug。而且因為每個開發(fā)人員的編碼習慣不同,寫出的代碼也會有差異。為了保證團隊開發(fā)中代碼的規(guī)范以及盡量避免低級bug,我們往往需要一些工具來進行嚴格的檢查。下面將介紹在項目中用到的四種插件 lintfindBugsPMDCheckStyles 的功能和使用方式,以及如何將多個插件整合在一起,在方便使用的同時盡量做到與項目工程解耦。

一、lint

Lint是Android Studio提供的一個代碼檢測工具,通過它開發(fā)者不用運行或者寫測試代碼,就可以發(fā)現(xiàn)和糾正問題,優(yōu)化代碼結構。每個被檢測到的問題,都會生成一條描述信息并指明相應的嚴重性級別,當然這個嚴重性級別我們也可以自己設置的。

檢測范圍

  • 潛在的bug
  • 可優(yōu)化的代碼
  • 安全性
  • 性能
  • 可用性
  • 可訪問性
  • 國際化

插件安裝

Android Studio自帶,無需安裝。

插件使用

通過Gradle運行l(wèi)int

在工程的根目錄下運行相應的gradle task。

  • Windows
gradle lint
  • Linux 或者 MAC
./gradlew lint

當運行上面的命令執(zhí)行完后,就會在項目目錄/app/build/outputs/lint-results-debug.html生成相應的文件,可用瀏覽器打開查看。

手動運行l(wèi)int

有時我們可能只針對某個文件或者某個目錄進行檢測,這時使用gradle的方式就比較麻煩了,所以Android Studio提供給我們手動運行l(wèi)int的方式。

  • 在AS的工程下選擇module、目錄或者文件

  • 右鍵選擇Analyze > Inspect Code.

  • 此時會出現(xiàn)一個選擇“指定檢測范圍”的dialog

  • 配置完成后,點擊OK按鈕,進行檢測。檢測結果如下圖所示,左邊是檢測類型的樹形結構,右邊則展示詳細的信息。

注:詳細的使用,請看官網文檔 Improve Your Code with Lint

二、findBugs

FindBugs是一個Java靜態(tài)分析工具,用來檢查類或者jar文件,用來發(fā)現(xiàn)可能的問題。檢測完成之后會生成一份詳細的報告,借助這份報告可以找到潛在的bug,比如NullPointException,特定的資源沒有關閉,查詢數(shù)據(jù)庫沒有調用Cursor.close()等

檢測范圍

  • 常見代碼錯誤,序列化錯誤
  • 可能導致錯誤的代碼,如空指針引用
  • 國際化相關問題:如錯誤的字符串轉換
  • 可能受到的惡意攻擊,如訪問權限修飾符的定義等
  • 多線程的正確性:如多線程編程時常見的同步,線程調度問題。
  • 運行時性能問題:如由變量定義,方法調用導致的代碼低效問題

插件安裝

在Android Studio中選擇Preferences -> Plugins,輸入查找findBugs進行插件安裝。

插件使用

在build.gradle文件中,按照下面步驟進行設置:

  1. 添加plugin apply plugin:'findbugs'
  2. 定義任務,指定輸出格式
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()
}

這里要注意因為findBugs是檢查class文件,所以在定義task的時候,我們是dependsOn: "assembleDebug",確保運行findbugs的task能夠成功檢測。

通過gradle findbugs方式,在工程目錄下運行命令,檢測完成后,會在制定的目錄下生成報告文檔。文檔支持xml和html兩種格式,本文設置的是html格式,可以直接用瀏覽器打開。
當然,和lint一樣,findBugs也支持手動檢測的方式。在工程里,右鍵 FindBugs -> (選擇檢測的范圍)。檢測完之后,底部工具欄會跳到FindBugs-IEDA下,如圖所示。

三、PMD

PMD是一個很有用的工具,它跟Findbugs類似,但是它不是檢測字節(jié)碼,它是直接檢測源代碼。它使用靜態(tài)分析來發(fā)現(xiàn)錯誤。為什么要將它們同時使用呢?因為它們的檢測方法不同,可以取到互補的作用。

檢測范圍

  • 可能的bug——空的try/catch/finally/switch塊。
  • 無用代碼(Dead code):無用的本地變量,方法參數(shù)和私有方法。
  • 空的if/while語句。
  • 過度復雜的表達式——不必要的if語句,本來可以用while循環(huán)但是卻用了for循環(huán)。
  • 可優(yōu)化的代碼:浪費性能的String/StringBuffer的使用。

插件安裝

同樣可以通過AS的plugin進行安裝,推薦安裝QAPlug-PMD。


插件使用

在build.gradle文件中進行如下配置

  • 導入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源碼進行檢查,被將所有的不符合規(guī)范的地方生成報告通知給你。

檢測范圍

  • 注解
  • javadoc注釋
  • 命名規(guī)范
  • 文件頭
  • 導入包規(guī)范
  • 尺寸設置
  • 空格
  • 正則表達式
  • 修飾符
  • 代碼塊
  • 編碼問題
  • 類設計問題
  • 重復、度量以及一些雜項

總而言之,是一些代碼規(guī)范問題!!

插件安裝

通過AS的Plugin進行安裝


插件使用

  • 導入Plugin
apply plugin: 'checkstyle'
  • 設置CheckStyle的版本
checkstyle {
    toolVersion '6.1.1'
    showViolations true
}
  • 配置任務
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文件導入整合插件腳本
apply from: '../config/quality.gradle'

插件使用

  • 修改quality.gradle 的appDir字段,設置檢測的工程目錄
// 應用目錄名稱
def appDir = "app-k12"
  • 進入工程根目錄,運行gradle check,檢測完成后,會在build/reports下生成相應的檢測報告文件。當然也可以按照每個插件的使用方式單獨使用。

總結

最后,隨文附上插件的git地址,歡迎fork和star。
config

再推薦之前封裝的兩個好用的組件:

參考文章

  1. How to improve quality and syntax of your Android code
  2. Improve Your Code with Lint
  3. Android 進階之工具的使用 Findbugs
  4. Android靜態(tài)代碼檢測
  5. 使用 CheckStyle 檢查代碼
  6. 詳解CheckStyle的檢查規(guī)則(共138條規(guī)則)
  7. 用 PMD 鏟除 bug
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容