🔖

[Android]Epoxyが package-info.java を使わなくなったよという話

2021/08/07に公開

はじめに

ほぼタイトルで終わりなのですが…

おそらく現役でEpoxyを使い続けている人ならキャッチアップはされていると思いますが、記事としてまとまっているものが無かったなと思った(&自分で作っているアプリのアプデで微妙に困った)ので記事としてまとめておきます。

内容

AndroidのRecyclerViewを手軽に使えるようにするためのEpoxyというライブラリがあります。

https://github.com/airbnb/epoxy

このEpoxyですが、バージョン3系までは初期設定として package-info.java という固定の名前のJava形式ファイルを自分で作成し、以下のような形で設定する必要がありました。

package-info.java
// 対象レイアウトのプレフィックスを設定したい場合に利用
@EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "list_item") 
// Epoxy用のModelを生成したいレイアウトファイルを{}内に記載
@EpoxyDataBindingLayouts({
        R.layout.list_item_example,
        R.layout.list_item_example2,
})

// ↓パッケージ名を先に置くとエラーになる
package {パッケージ名};

import com.airbnb.epoxy.EpoxyDataBindingLayouts;
import com.airbnb.epoxy.EpoxyDataBindingPattern;

しかし、2020年9月に4系へのアップデートが行われた際に、ファイル名が package-info.java でなくても許されるようになりました。
その代わり、 interface( or class) に対してアノテーションを設定する必要があります。

以下は公式のリリースノートからの抜粋です。

Annotations that previously targeted package elements now target types (classes or interfaces).
This includes: EpoxyDataBindingPattern, EpoxyDataBindingLayouts, PackageModelViewConfig, PackageEpoxyConfig
This was necessary to work around an incremental annotation processor issue where annotation on package-info elements are not properly recompiled

DeepL翻訳↓

これまでパッケージ要素を対象としていたアノテーションが、タイプ(クラスやインターフェース)を対象とするようになりました。
これには以下が含まれます。EpoxyDataBindingPattern, EpoxyDataBindingLayouts, PackageModelViewConfig, PackageEpoxyConfig。
これは,パッケージ情報要素上のアノテーションが適切に再コンパイルされないインクリメンタル・アノテーション・プロセッサの問題を回避するために必要でした。

というわけで置き換え後のファイルがこちらです。

EpoxyConfig.java
package {パッケージ名}

import com.airbnb.epoxy.EpoxyDataBindingLayouts;
import com.airbnb.epoxy.EpoxyDataBindingPattern;

@EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "list_item")
@EpoxyDataBindingLayouts({
    R.layout.list_item_example,
    R.layout.list_item_example2,
})
interface EpoxyConfig {}    // ←追加

interface を対象にアノテーションをつけることによってEpoxy用のModelを生成できるようになりました。

ファイル名に縛られなくなって、少し分かりやすくなりましたね。

おわりに

公式wikiだとまだ記述が更新されていないみたいなので、迷い子が少しでも救われれば幸いです。

Discussion