AndroidアプリプロジェクトにKtlintを導入する

この記事をシェア

KtlintはKotlinのプロジェクトで広く使われている静的解析ツールです。定義されたルールに基づいてソースコードのスタイルを検証します。自動で正しいスタイルにフォーマットすることもできます。

Ktlintを普段の業務で利用しているAndroidエンジニアは多いと思いますが、自分で一から設定する機会は意外と少ないのではないでしょうか。私も今回初めて個人のAndroidプロジェクトに導入したので、その際に調べたことを記事にまとめます。

KtlintとGradleプラグイン

KtlintはPinterestがOSSとして開発したツールです。

ただし、Quick startを見るとわかるように、これ自体は単独で動作させるコマンドラインツールです。Androidプロジェクトで利用するには、Gradleプラグインを使うと便利です。

KtlintのGradleプラグインはGradle integrationにいくつか紹介されています。広く使われているのがJLLeitschuh/ktlint-gradleで、プラグインを追加するだけでGradleのタスクが使えて便利です。今回もこれを使います。

余談ですが、私はKtlintのことを、JetBrainsが開発しているKotlinの公式ツールだと思い込んでいました。そのため今回自分で調べ始めた当初は、いくら調べても公式の情報が出てこないことに困惑しました。そのうえPinterestやJLLeitschuh/ktlint-gradleなど複数のリポジトリが見つかり、どれが本物???と戸惑いました。

プロジェクトに導入する

ではJLLeitschuh/ktlint-gradleをAndroidのプロジェクトに導入する手順を説明します。といってもREADMEのHow to useに書いてある通りです。以下のように依存を定義してプラグインを導入するだけで、Gradleのタスクを実行できるようになります。

[versions]
ktlint = "12.1.2"

[plugins]
ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }
plugins {
    alias(libs.plugins.ktlint)
}

実行してみる

コードのチェックを実行するには、ktlintCheckを実行します。

./gradlew ktlintCheck

例えば以下のようにif節とelse節の書き方が統一されていないコードがあると、改行が必要だと指摘してくれます。

if (flag) {              
    println("Hello")     
} else { println("Bye") }

また、ktlintFormatを実行すると自動でフォーマットしてくれます。

./gradlew ktlintFormat

先ほどのコードは下記のようにフォーマットされます。

if (flag) {         
    println("Hello")
} else {            
    println("Bye")  
}                   

Androidプロジェクトに合わせて設定する

このように簡単に導入できるJLLeitschuh/ktlint-gradleですが、デフォルト設定のままAndroidのプロジェクトで利用すると、期待とは異なる結果になってしまう部分があります。そのため、少し設定を変更します。

デフォルト設定の問題点

例えば以下のようなコンポーザブル関数があるとしましょう。

@Composable
fun SampleComposable() {
    Text(
        text = "Hello",
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp)
    )
}

このコードに対してktlintFormatを実行すると、以下のようにModifierが改行されて余分なインデントが追加されてしまいます。Jetpack Composeのコードではあまり見かけないスタイルで、違和感を感じますね。

@Composable
fun SampleComposable() {
    Text(                      
        text = "Hello",        
        modifier =             
            Modifier           
                .fillMaxWidth()
                .padding(8.dp),
    )                          
}

また、「Function name should start with a lowercase letter …」というエラーも出ます。コンポーザブル関数の名前は大文字から始めるのが一般的なので、このエラーは困ります。

.editorconfigファイルに設定を記述

上記のような問題点を解決するために、設定を変更します。プロジェクトのルートディレクトリに.editorconfigファイルを作成し、設定を記述します。

プロジェクトのルートディレクトリに.editorconfigファイルを作成

.editorconfigの記述例は下記のようになります。

[*.{kt,kts}]
ktlint_code_style = android_studio
ktlint_function_naming_ignore_when_annotated_with=Composable

ktlint_code_styleは全体的なコーディングスタイルの設定です。android_studioを指定すると、Androidプロジェクトで見慣れたスタイルが適用されます。上記の例で紹介したようにModifierが勝手に改行されることもなくなります。その他、1行当たりの最大文字数や、トレイリングカンマをつけるかどうかなど、いろいろ違いがあります。具体的な違いはKtlintのルールの説明に書いてあります。

ktlint_function_naming_ignore_when_annotated_withは、特定のアノテーションが付与された関数に対して、関数の命名規則を無視する設定です。ktlint_code_styleを設定しただけではコンポーザブル関数の名前に関するエラーが消えないので、追加で設定しています。

Ktlintで定義されているルールの一覧はStandard rulesにまとまっているので、必要に応じて.editorconfigに設定を追加してください。


以上、AndroidのプロジェクトでKtlintを導入する方法についてまとめました。

この記事をシェア