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

前言

在團(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幢踏、findBugsPMD许师、 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è)置:

  1. 添加plugin apply plugin:'findbugs'
  2. 定義任務(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

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

參考文章

  1. How to improve quality and syntax of your Android code
  2. Improve Your Code with Lint
  3. Android 進(jìn)階之工具的使用 Findbugs
  4. Android靜態(tài)代碼檢測
  5. 使用 CheckStyle 檢查代碼
  6. 詳解CheckStyle的檢查規(guī)則(共138條規(guī)則)
  7. 用 PMD 鏟除 bug
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硫痰,一起剝皮案震驚了整個濱河市衩婚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌效斑,老刑警劉巖非春,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缓屠,居然都是意外死亡奇昙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門敌完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來储耐,“玉大人,你說我怎么就攤上這事滨溉∈蚕妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵晦攒,是天一觀的道長闽撤。 經(jīng)常有香客問我,道長脯颜,這世上最難降的妖魔是什么哟旗? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上闸餐,老公的妹妹穿的比我還像新娘饱亮。我一直安慰自己,他們只是感情好舍沙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布近尚。 她就那樣靜靜地躺著,像睡著了一般场勤。 火紅的嫁衣襯著肌膚如雪戈锻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天和媳,我揣著相機(jī)與錄音格遭,去河邊找鬼。 笑死留瞳,一個胖子當(dāng)著我的面吹牛拒迅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播她倘,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼璧微,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硬梁?” 一聲冷哼從身側(cè)響起前硫,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荧止,沒想到半個月后屹电,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跃巡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年危号,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片素邪。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡外莲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兔朦,到底是詐尸還是另有隱情偷线,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布烘绽,位于F島的核電站淋昭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏安接。R本人自食惡果不足惜翔忽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一英融、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歇式,春花似錦驶悟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龙巨,卻和暖如春笼呆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旨别。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工诗赌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秸弛。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓铭若,卻偏偏與公主長得像,于是被迫代替她去往敵國和親递览。 傳聞我的和親對象是個殘疾皇子叼屠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容