天天看點

白盒測試 android 靜态代碼掃描

白盒測試 android 靜态代碼掃描

https://testerhome.com/topics/4653

https://testerhome.com/topics/4653

https://testerhome.com/topics/4653

開始做這樣一個東西是為了幫助開發減少代碼方面的問題,提高代碼品質,減小以後上線的風險。前面看了360的那個靜态代碼掃描感覺很強大,但目前沒這實力去做成這樣,希望早日開源,多多學習。是以就先用開源的也能解決下問題。

怎麼來的

開始做是想直接使用sonar自帶的android靜态代碼掃描,但後面發現不是很好用,而且sonar對于移動端的掃描能力好像也不是很強。

後面在逛github時發現一個項目,就是關于android的代碼掃描的,覺得思路不錯,而且擴充性也不錯,就參考了這個項目,傳送門

怎麼做的

我們項目是用gradle進行編譯,我用的方法比較low,每次jenkins拉下代碼後,直接用自己的gradle檔案替換項目的檔案,然後将配置檔案夾config直接拷進項目。

  1. 說下gradle檔案吧,主要是先引用config/quality.gradle這個gradle檔案,主要是添加

    apply from: '../config/quality.gradle'

    ,
  2. quality.gradle

    這個檔案定義了包括checkstyle,findbugs,pmd,lint這些掃描工具的任務,因為現在我們項目的android代碼沒有定義規範,是以checkstyle就沒用,檔案内容如下: ``` apply plugin: 'findbugs' apply plugin: 'pmd'

// Add checkstyle, findbugs, pmd and lint to the check task.

check.dependsOn 'findbugs', 'pmd', 'lint'

task findbugs(type: FindBugs, dependsOn: assembleDebug) {

ignoreFailures = true #注意這裡需要設定為true,否則有失敗就會停止,後面的任務就不會跑了

effort = "max"

reportLevel = "low"

excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")

classes = files("${project.rootDir}/app/build/intermediates/classes")

source 'src'

include '/*.java'

exclude '/gen/**'

reports {

xml.enabled = true #因為需要在jenkins中內建,是以需要開啟xml

html.enabled = false #而且xml和html隻能開啟一個,注意關掉html哦

xml {

destination "$project.buildDir/reports/findbugs/findbugs.xml"

}

html {

destination "$project.buildDir/reports/findbugs/findbugs.html"

}

}

classpath = files()

}

task pmd(type: Pmd) {

ignoreFailures = true #注意這裡需要設定為true,否則有失敗就會停止,後面的任務就不會跑了

ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")

ruleSets = []

source 'src'

include '/*.java'

exclude '/gen/**'

reports {

xml.enabled = false #同理

html.enabled = true

xml {

destination "$project.buildDir/reports/pmd/pmd.xml"

}

html {

destination "$project.buildDir/reports/pmd/pmd.html"

}

}

}

android {

lintOptions {

abortOnError true

xmlReport false

htmlReport true

lintConfig file("${project.rootDir}/config/quality/lint/lint.xml")

htmlOutput file("$project.buildDir/reports/lint/lint-result.html")

xmlOutput file("$project.buildDir/reports/lint/lint-result.xml")

}

}

### 怎麼內建的
1. 下載下傳`gradle`編譯的插件,并且在系統管理中配置gradle的路徑
2. 下載下傳`findbugs`,`pmd`以及`lint`相應的插件
3. 插件都弄完後,在jenkins中建立任務,指定拉去代碼倉庫,跑下shell腳本替換指定檔案,并且加入config目錄
4. 指定gradle的task`clean findbugs pmd lint`
5. 如有需要指定需要什麼什麼跑
6. 然後再配置各個插件收集結果的xml檔案,注意需要設定`Run always`,根據自己的需求進行配置
7. 設定郵件模版,将結果發給指定的開發基本就完成了
![](/photo/2016/ad1da298153d8d8d1a395a71a7d30b7d.png)

### 後續
目前還處在試驗階段,開發對這東西也還不怎麼習慣,畢竟以前有些人以前都不會怎麼關注代碼的一些品質問題,并且相關的問題資訊都是英文的...不過基本還是正向的,畢竟以後代碼品質優化這塊肯定要做的,而且确實代碼一些潛在問題可能現在看不出,但這都是隐患。另外有些規則确實也沒什麼卵用,是以現在需要開發在磨合過程中,逐漸完善掃描規則,讓掃描不是一個擺設。
                

繼續閱讀