asnetjp / sandbox

情報発信部ようのリポジトリ
0 stars 0 forks source link

12月分のブログ #4

Open dkajiwara-asnet opened 8 years ago

dkajiwara-asnet commented 8 years ago

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

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

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
    1. Reporting > Minimum confidence to report を Low に設定
    2. Advanced にチェック
    3. 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

dkajiwara-asnet commented 8 years ago

やろうと思っていたgitネタがqittaに投稿された記事とかぶりまくりだったのでやめました

dkajiwara-asnet commented 8 years ago

とりあえずざっと書いたのを載せておきます。このあと詳細をもう少し詰めていきます。

yooishi-asnet commented 8 years ago

静的解析の箇所はとっっっっっても大事!ですので、 とても良い記事です。 ありがとう。

Android 静的解析でぐぐったら、 2ページ目にコレ(http://asnet.hatenablog.com/entry/2015/05/29/094112)が出てくるのね

dkajiwara-asnet commented 8 years ago

@yooishi-asnet 遅くなりましが、一部書き直したので確認お願いします :bow: