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

この記事からわかること
- Android Studio/Kotlinで静的解析を導入する方法
- ktlintの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
- ktlint:1.6.0
静的解析ツールとは?
「静的解析ツール」とはプログラムが記法や規約に則って記述されているかを自動で解析するためのツールです。これを使用することでルールに準じていないコードを特定でき、修正箇所を簡単に識別できるようになります。
プログラムが一定のルールに則って記述されることで冗長なコードのリファクタリングによるコンパイル時間の短縮や可動性向上による複雑性の緩和と保守しやすいコードを保つことができます。
iOS
ktlintとは?
ktlintはKotlinで使用できる静的解析ツールです。チェックできる項目は多く、インデントやスペース、変数の命名などなかなか人では気づきにくい部分もツールを使用することで簡単に識別することが可能です。
また自動整形機能も搭載されているのでプロジェクト内のコードを一括で修正することも可能です。
解析を行うのは.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
が用意されています。公式の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
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。