【Android/Kotlin】ktlintで静的解析を実行する方法

【Android/Kotlin】ktlintで静的解析を実行する方法

この記事からわかること

  • Android Studio/Kotlin静的解析導入する方法
  • ktlint使い方

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

静的解析ツールとは?

静的解析ツール」とはプログラムが記法や規約に則って記述されているかを自動で解析するためのツールです。これを使用することでルールに準じていないコードを特定でき、修正箇所を簡単に識別できるようになります。

プログラムが一定のルールに則って記述されることで冗長なコードのリファクタリングによるコンパイル時間の短縮や可動性向上による複雑性の緩和と保守しやすいコードを保つことができます。

ktlintとは?

公式リファレンス:ktlint

ktlintKotlinで使用できる静的解析ツールです。チェックできる項目は多く、インデントやスペース、変数の命名などなかなか人では気づきにくい部分もツールを使用することで簡単に識別することが可能です。

また自動整形機能も搭載されているのでプロジェクト内のコードを一括で修正することも可能です。

解析を行うのは.kt/.ktsのKotlinで記述されたファイルです。プロジェクトルートから再帰的に検索しながら全体を解析してくれます。

**/*.kt
**/*.kts

Homebrewでの導入方法と使い方

ktlintをHomebrewを使用してインストールするには以下のコマンドを実行します。導入はこれだけで完了であとはプロジェクトのルートディレクトリに移動して実行コマンドを叩くだけです。

$ brew install ktlint

静的解析を実行するにはktlintコマンドを実行するだけです。

// 静的解析
$ ktlint

実行すると静的解析に引っかかった部分のパスとファイル名、行数、違反内容が表示されます。最後には違反を検知した内容と総数も表示してくれます。

// 〜〜〜〜〜〜〜
/Users/XXXX/Desktop/MyApp/app/src/androidTest/java/com/XXXXXX/myapp/ExampleInstrumentedTest.kt:5:1: Wildcard import (standard:no-wildcard-imports)
/Users/XXXX/Desktop/MyApp/app/src/main/java/com/XXXXXX/myapp/View/Fragment/InputPersonFragment.kt:22:1: Wildcard import (standard:no-wildcard-imports)
/Users/XXXX/Desktop/MyApp/app/src/main/java/com/XXXXXX/myapp/Domain/NotificationRequestManager.kt:30:17: Property name should start with a lowercase letter and use camel case (standard:property-naming)
/Users/XXXX/Desktop/MyApp/app/src/main/java/com/XXXXXX/myapp/Domain/CalcDateInfoManager.kt:1:9: Package name contains a disallowed character (standard:package-name)

Summary error count (descending) by rule:
  standard:backing-property-naming: 167
  standard:package-name: 31
  standard:no-wildcard-imports: 6
  standard:class-naming: 4
  standard:property-naming: 4

プロジェクト全体ではなく特定のファイルのみ走らせたい場合はパスを指定することで絞り込むことができます。

// ファイル指定チェック
$ ktlint src/**/*.kt

自動整形を実行する

自動整形機能を実行する場合は-Fオプションをつけるだけです。これで冗長な処理や不要なインテントなどを自動で修正してくれます。また自動整形を実行した際も静的解析は実行されます。

// 自動整形
$ ktlint -F

Gradleから導入する

※ 結論:導入〜実行まで期待通りに行うことができませんでした。知見のある方いれば教えて欲しいです。

公式リファレンス:ktlint-gradle

ktlintをGradleプロジェクトで簡単に使えるようにするためのプラグインとしてktlint-gradleが用意されています。公式のREADMEに記載の通りに追加してみました。


{
  // これを追加すればOK?
  id "org.jlleitschuh.gradle.ktlint" version "12.3.0"
}

ktlint {
    // ktlintのバージョンを指定
    version.set("1.6.0")
    // 詳細ログを出力
    verbose.set(true)
    // ktlintの結果をコンソールに表示する
    outputToConsole = true

    reporters {
        // チェック結果を Checkstyle フォーマットで出力(CIツールなどで利用可能)
        // プロジェクトルート/build/reports/ktlint/ktlint-checkstyle-report.xmlに出力?
        reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.CHECKSTYLE)
    }
}

静的解析を実行する以下のコマンドを叩いてみたのですがBUILD SUCCESSFULと出るだけで期待通りに静的解析のログが表示されませんでした

$ ./gradlew ktlintCheck

BUILD SUCCESSFUL in 868ms
1 actionable task: 1 executed

reporterを指定してみたりしたのですがそれっぽいファイルは生成されませんでした。。

自動整形は以下のコマンドです。

$ ./gradlew ktlintFormat

.editorconfigでルールを設定

ktlintで適応される静的解析ルールは.editorconfigファイルをプロジェクトルートに設置して設定します。設定できるルールの種類は以下を参考にしてください。

公式リファレンス:ktlint-Standard rules

.editorconfigファイルの中には反映させたい範囲無効化するルールを記述します。ルール名には接頭辞にktlint_standard_を付与する必要があるようです。


[*.kt] // ktに適応
ktlint_standard_no-wildcard-imports = disabled
ktlint_standard_backing-property-naming = disabled

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

Search Box

Sponsor

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article