読者です 読者をやめる 読者になる 読者になる

静的解析ツールを導入しよう!!

Android

静的解析ツールを導入しよう!!

こんにちは。アスネット開発部の梶原です。今回は静的解析ツールの導入に関して紹介したいと思います。
チームでコードを書く場合にはコードに統一感があるほうが見やすく、 コードレビューの時も「スペースが一個あいてないよ」とか「変数名は小文字で…」とかは本来レビューで指摘するべき箇所からずれてしまい、こういった指摘はレビューする方もされる方もうんざりしてしまいますよね。 JavaではFindbugs, CheckStyle,PMD等のコードを解析するためのツールがそろっていますので、Androidの開発でもどんどん使っていきましょう。 という訳で、今回はその中でもFindbugs, CheckStyleの導入手順について書きたいと思います。

Findbugsの導入手順

  • 静的解析を行い、バグの可能性があるコードを指摘するプラグイン

コマンドライン上からfindbugsを実行する

下記の記述を適当な場所に追加、もしくは追記してください。 別ファイルとしてfindbugs_plugin.gradleにtaskとして記述することで、設定ファイルの再利用を簡単にしています。

app/build.gradle

apply from: "${project.rootDir}/gradle/findbugs_plugin.gradle"

gradle/findbugs_plugin.gradle

apply plugin: 'findbugs'

task findbugs(type: FindBugs) {
    ignoreFailures = true
    effort = "max"
    reportLevel = "low"
    // 必要であれば静的解析から除外するファイルを指定してください
    // excludeFilter = new File("${project.rootDir}/config/findbugs/findbugs_filter.xml")
    classes = files("build/intermediates/classes/")
    source 'src/main'
    include '**/*.java'
    reports {
        xml {
            destination "${project.projectDir}/build/reports/findbugs/findbugs_report.xml"
        }
    }
    classpath = files()
}
check.dependsOn 'findbugs'

config/findbugs/findbugs_filter.xml

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <Match>
        <Class name="~.*.R"/>
    </Match>
    <Match>
        <Class name="~.*.R\$.*"/>
    </Match>
</FindBugsFilter>

実行

$ ./gradlew check

Findbugs Plugin

コマンドライン上からの実行のみであれば下記のプラグインのインストールは必要ありませんが、 GUIから実行したい時には下記のプラグインを導入して実行してください。

プラグインの導入手順

  1. Preferences > Plugins で FindBugs-IDEA を検索し、インストール
  2. Preferences > FindBugs-IDEA
  3. Reporting > Minimum confidence to report を Low に設定
  4. Advanced にチェック
  5. Analysis effort を Maximal に設定

CheckStyleの導入手順

  • コーディング規約をチェックするための静的解析ツール

コマンドライン上からcheckstyleを実行

こちらも同様に、下記の記述を適当な場所に追加もしくは追記してください。

app/build.gradle

apply from: "${project.rootDir}/gradle/checkstyle_plugin.gradle"

gradle/checkstyle_plugin.gradle

apply plugin: 'checkstyle'

task checkstyle(type: Checkstyle) {
    configFile file("${project.rootDir}/config/checkstyle/checkstyle.xml")
    configProperties.checkstyleConfigDir = file("${project.rootDir}")
    source 'src/main'
    include '**/*.java'
    reports {
        xml {
            destination "${project.projectDir}/build/reports/checkstyle/checkstyle.xml"
        }
    }
    classpath = files()
}
check.dependsOn 'checkstyle'

config/checkstyle/checkstyle.xml

<module name="Checker">
  <property name="charset" value="UTF-8"/>
  ...
  <!-- 静的解析から除外するファイルがある場合に使用してください -->
  <module name="SuppressionFilter">
    <property name="file" value="${checkstyleConfigDir}/config/checkstyle/checkstyle_suppressions.xml"/>
  </module>
</module>

config/checkstyle/checkstyle_suppressions.xml

<suppressions>
    <suppress checks=".*" files="src/test/java/.*" />
</suppressions>

実行

$ ./gradlew check

コーディング規約に関しては会社、チームによって差があるかともいますが新しく作成する場合にはGoogleが出しているGoogle Java StyleもしくはCode Style for Contributorsあたりが参考になるかと思います。

参考

上記の内容を反映したテンプレートとなるプロジェクトは下記に置いてあります。ご参考にしてください。
https://github.com/dkajiwara/AndroidTemplate

Google Java Style
http://google.github.io/styleguide/javaguide.html
Code Style for Contributors
http://source.android.com/source/code-style.html