1. 程式人生 > >Jenkins+Gradle+pmd對Android工程原始碼進行靜態程式碼分析

Jenkins+Gradle+pmd對Android工程原始碼進行靜態程式碼分析

轉載請注意出處:http://blog.csdn.net/hwhua1986/article/details/49278941

環境說明

Gradle 2.6.

OS:windows server 2008

Jenkins 1.620

pmd 5.4.0

前提:

Jenkins需要提前安裝好PMD Plug-in外掛


一、Jenkins配置如下:

1、  新建job

2、  配置svn

3、  配置構建操作

備註:

Tasks指的是build.gradle裡面的task名稱

配置info引數是用來看除錯日誌,也可以配置debug級別。主要用來檢視構建失敗的原因。

4、  配置分析報告

二、            gradle.build的配置如下

1、新增checkstyle的依賴

buildscript {

   repositories {

               mavenCentral()

    }

   dependencies {

       classpath 'com.android.tools.build:gradle:1.0.0+'

              //classpath  'io.fabric.tools:gradle:1.+'

              //classpath  'com.google.code.findbugs:findbugs:3.0.1'

              //classpath  'com.puppycrawl.tools:checkstyle:6.11.2'

              //classpath  'net.sourceforge.pmd:pmd:5.4.0'

    }

}

備註:版本包可以通過中央倉庫(http://mvnrepository.com/artifact/)檢視,如圖

 

版本列表:

 

2、增加checkstyle的task

applyplugin: "pmd"

repositories{

  mavenCentral()

}

taskpmd(type: Pmd) {

    ignoreFailures = true

     source = fileTree('src/com/sn/')

       //ruleSetConfig =resources.file("${project.rootDir}/config/pmd/PmdRuleSets.xml")

       //ruleSetFiles =files("config/pmd/PmdRuleSets.xml")

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

       ruleSets = ["java-android"]

       reports {

    xml {

      destination "build/pmd.xml"

    }

  }

}

備註:其中檢查規則檔案PmdRuleSets.xml需要建立,步驟如下


Xml內容程式碼(可以參考官網配置):

PMD’官網地址:http://pmd.sourceforge.net/pmd-5.1.1/howtomakearuleset.html

<?xml version="1.0"?>
<ruleset name="Custom ruleset"
   xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
 
 <description>
 This ruleset checks my code for bad stuff
 </description>
 
 <!-- We'll use the entire 'strings' ruleset -->
 <rule ref="rulesets/java/strings.xml"/>
 <rule ref="rulesets/java/android.xml"/>
 <!-- Here's some rules we'll specify one at a time -->
 <ruleref="rulesets/java/unusedcode.xml/UnusedLocalVariable"/>
 <ruleref="rulesets/java/unusedcode.xml/UnusedPrivateField"/>
 <rule ref="rulesets/java/imports.xml/DuplicateImports"/>
 <rule ref="rulesets/java/basic.xml/UnnecessaryConversionTemporary"/>
 
 <!-- We want to customize this rule a bit, change the message andraise the priority  -->
 <rule
  ref="rulesets/java/basic.xml/EmptyCatchBlock"
  message="Must handle exceptions">
   <priority>2</priority>
 </rule>
 
 <!-- Now we'll customize a rule's property value -->
 <ruleref="rulesets/java/codesize.xml/CyclomaticComplexity">
   <properties>
       <property name="reportLevel" value="5"/>
   </properties>
 </rule>
 
 <!-- We want everything from braces.xml exceptWhileLoopsMustUseBraces -->
 <rule ref="rulesets/java/braces.xml">
   <exclude name="WhileLoopsMustUseBraces"/>
 </rule>
</ruleset>


三、            構建結果檢視



四、build.gradle的所有程式碼如下

buildscript {
    repositories {
		 mavenCentral()
    }
    dependencies {
        classpath  'com.android.tools.build:gradle:1.0.0+'
		//classpath  'io.fabric.tools:gradle:1.+'
		//classpath  'com.google.code.findbugs:findbugs:3.0.1'
		//classpath  'com.puppycrawl.tools:checkstyle:6.11.2'
		//classpath  'net.sourceforge.pmd:pmd:5.4.0'
    }
}
apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

	//忽略編碼錯誤
	lintOptions {  
	     abortOnError false  
	}  

	//設定版本號
	defaultConfig {
        versionCode 1
        versionName "1.0"
        minSdkVersion 8
        targetSdkVersion 18
    }
    
    //引用so包
	sourceSets{
        main{
            jniLibs.srcDir(['libs'])
            jniLibs.srcDir(['obj'])
        }
    }

	//設定編譯編碼
	tasks.withType(JavaCompile) { 
		options.encoding = 'UTF-8' 
	}
	
	//autograph
    signingConfigs{
        //keystore info
        myConfig {
            storeFile file("bgkey")
            storePassword "xxxxxx"
            keyAlias "com.sn.xxxx"
            keyPassword "xxxxxx"
        }
    }

  //混淆
    buildTypes{  
        release{  
            signingConfig signingConfigs.myConfig  
            minifyEnabled false  
        }  
    }  

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

apply plugin: "findbugs"

repositories {
  mavenCentral()
}

task findbugs(type: FindBugs) {
   //toolVersion = "2.0.1"
	ignoreFailures = true
	effort = "max"
	reportLevel = "low"
    classes = files("$project.buildDir/intermediates/classes")
	source = fileTree('build/intermediates/classes/debug/com/sn/')
	classpath = files()
	reports {
    xml {
      destination "build/findbugs.xml"
    }
  }
}


apply plugin: "checkstyle"

repositories {
  mavenCentral()
}
task checkstyle(type: Checkstyle) {
   ignoreFailures = true
	//config = files("build/config/checkstyle/checkstyle.xml")
	source = fileTree('build/intermediates/classes/debug/com/sn/')
	classpath = files()
	reports {
    xml {
      destination "build/checkstyle-result.xml"
    }
  }
}


apply plugin: "pmd"

repositories {
  mavenCentral()
}
task pmd(type: Pmd) {
    ignoreFailures = true
   	source = fileTree('src/com/sn/')
	//ruleSetConfig = resources.file("${project.rootDir}/config/pmd/PmdRuleSets.xml")
	//ruleSetFiles = files("config/pmd/PmdRuleSets.xml")
	ruleSetFiles = files("${project.rootDir}/config/pmd/PmdRuleSets.xml")
	ruleSets = ["java-android"]
	reports {
    xml {
      destination "build/pmd.xml"
    }
  }
}


問題列表:

1、

1、Can't find resource 'null' for rule 'android

解決:

The reason is simple. In case of Gradle 2.0you must add language prefix before name of rule. You must use java-stringsinstead of plain strings.