むあーるの雑記

Back

はじめに#

DroidKaigi 2021にて行われた下記の発表に触発されて

DroidKaigi 2021 - 25分で作るAndroid Lint / Nozomi Takuma [JA] - YouTube 25分で作るAndroid Lint / Android Lint made in 25 minutes - Speaker Deck

PRレビューでよく指摘していたことをLintにできたらいいなと思い、上記を参考に自分もAndroidのカスタムLintを作成してみました。 Lint化しておけばローカルの開発環境や、CI上でDangerを使用してPR作成後に自動でLintチェックを行い、レビュアーが指摘せずとも間違いに気づける環境が構築できるという狙いがあります。

カスタムLint作成の準備#

まずは発表内容を参考にカスタムLint作成時に必要なものが揃っているので下記のリポジトリをベースに作成していきます。

GitHub - googlesamples/android-custom-lint-rules: This sample demonstrates how to create a custom lint checks and corresponding lint tests

今回はConstraintLayout内の子Viewに android:layout_width="match_parent"もしくは android:layout_height="match_parent" が設定されている場合に警告するLintを作成してみます。

ConstraintLayout内の子Viewにmatch_parentを使っては行けない理由は公式ドキュメントにかかれているのでそちらを参考にしてください。 ConstraintLayout  |  Android Developers

layout.xmlに対するLintの作成方法は発表内容やドキュメントだけだとわかりにくいので 標準のConstraintLayoutのLintのコードを参考にしながら作成しました。

ConstraintLayoutDetector.kt - Android Code Search

layout.xmlに対するカスタムLintの作成#

まずはカスタムLintの本体となるLayoutDetectorを実装していきます。

appliesToやgetApplicableElementsでLintを適用する対象を絞っています。 visitElementで対象を実際にLintチェックするコードを実装します。 最後にLintチェックに引っかかったらcontext.reportでIssueを報告するようにします。

また、カスタムLint開発時はテストコードでデバッグしながらやるとわかりやすいです。

あとは発表内容にもあるように 作成したカスタムLintようのIssueRegistryの作成や src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry リソースの追加を行えばカスタムLintモジュールが完成します。

作成したLintを導入する#

作成したカスタムLintモジュールを対象のプロジェクトに導入してappのbuild.gradleにlintChecksで追加したLintCheckモジュールを参照します。

// build.gradle(app)
dependencies {

    // Custom Lint Check
    lintChecks project(':lint-checks')

}
kotlin

これで対象のプロジェクトで作成したカスタムLintが機能するようになります。

まとめ#

コードレビューで何度も指摘することを検出するカスタムLintを作成することでレビューの負荷が減らすことができます。

また、特定のクラスを参照しないように検知するといったプロジェクト固有のルールを適用するLintも作成できます。

これにより複数人での開発でもプロジェクトがカオスになっていくのを防ぐことができます。

カスタムLintの書き方はドキュメントも少なく分かりづらいですが、 既存Lintのコードを参考にすればなんとか作成していけると思います。

ConstLayntLayout内でmatchParentを使用した場合に警告するカスタムLintを作成する
https://note.muaaru.com/blog/2022-02-26-post-607
Author muaaru
Published at 2022年2月26日