Android プロジェクトの DataBinding で使っているリソースが AndroidLint で Unused Resources として誤検知される問題を回避する

f:id:bps_tomoya:20200125132854j:plain

Android プロジェクトで使っていないリソースファイルをリストアップしたい場合、

  1. Android Studio の機能を使ってShift キー2回連打からの [Analyze -> Run Inspection by name -> Unused resources] で Action を発動させる
  2. AndroidLint を走らせて結果を確認する

この2種類の方法がある。

残念ながらこのどちら手段でもタイトルの通り、DataBinding で使っているリソースが Unused Resources として誤検知されてしまう問題を持っている。より正しく検出 / 削除するためには、こういった gradle plugin を活用する必要があった。

github.com

のだけれど、2番目の AndroidLint を使った方法について、この問題を回避するための Workaround が Google I/O 2019 Android アプリ google / iosched に組み込まれていることに気が付いた。今回はそれを紹介する。

build.gradle

lintOptions {
    // Eliminates UnusedResources false positives for resources used in DataBinding layouts
    checkGeneratedSources = true
}

まず lintOptions で checkGeneratedSources のフラグを立てている。このフラグはLintOptions.java で定義された Boolean 型の変数で、このフラグを立てると自動生成された build/ 以下のファイルも Lint の対象にすることができる。
このプロパティがドキュメントに載っていないのが奇妙だけれど、フォーラムへの投稿を信頼すると、どうやら Android Plugin DSL 3.3 からあったらしい。 groups.google.com

これで DataBinding によって自動生成されたファイルも検知対象になったので、そこで使っているリソースが Unused Resources として検知されることは回避された。一方で、自動生成ファイルで実際には問題にはならない余計なエラーが検知されることにもなる。実際に、iosched では RestrictedApi や、自動生成されたファイルの中で更なる Unused Resources が出てしまったりするのだけれど、その点は lint.xml を工夫して回避していた。

lint.xml

<!-- We configure Lint check generated sources to eliminate UnusedResources false positives for
        resources used in DataBinding layouts. However, the generated files produce other Lint
        errors that we can ignore.
-->
<issue id="RestrictedApi">
    <ignore path="build" />
</issue>

<issue id="UnusedResources">
    <!-- Some dependencies & gradle plugins generate resources that we don't use -->
    <ignore path="build" />
    <!-- Map markers are referenced by name at runtime -->
    <ignore regexp="res/drawable/map_marker_.+\.xml" />
</issue>

大抵のプロジェクトでは RestrictedApi は必ず出る肌感で、あとはケースバイケース。個々のプロジェクトの必要に応じて、 build/ 以下の ignore 設定をしてあげればよさそうだ。