白盒測試 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直接拷進項目。
- 說下gradle檔案吧,主要是先引用config/quality.gradle這個gradle檔案,主要是添加
,apply from: '../config/quality.gradle'
-
這個檔案定義了包括checkstyle,findbugs,pmd,lint這些掃描工具的任務,因為現在我們項目的android代碼沒有定義規範,是以checkstyle就沒用,檔案内容如下: ``` apply plugin: 'findbugs' apply plugin: 'pmd'quality.gradle
// 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)
### 後續
目前還處在試驗階段,開發對這東西也還不怎麼習慣,畢竟以前有些人以前都不會怎麼關注代碼的一些品質問題,并且相關的問題資訊都是英文的...不過基本還是正向的,畢竟以後代碼品質優化這塊肯定要做的,而且确實代碼一些潛在問題可能現在看不出,但這都是隐患。另外有些規則确實也沒什麼卵用,是以現在需要開發在磨合過程中,逐漸完善掃描規則,讓掃描不是一個擺設。