Android プロジェクトで使っていないリソースファイルをリストアップしたい場合、
- Android Studio の機能を使ってShift キー2回連打からの
[Analyze -> Run Inspection by name -> Unused resources]
で Action を発動させる - AndroidLint を走らせて結果を確認する
この2種類の方法がある。
残念ながらこのどちら手段でもタイトルの通り、DataBinding で使っているリソースが Unused Resources として誤検知されてしまう問題を持っている。より正しく検出 / 削除するためには、こういった gradle plugin を活用する必要があった。
のだけれど、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 設定をしてあげればよさそうだ。