※2018/06/14(木) 時点での所感と注意点を記載しています。何かアップデートがあれば随時追記していければと思います。
Parcelizeとは、Kotlinが提供するAndroid開発のためのコンパイラー拡張機能です。Parcelableを実装したクラスに対して@Parcelize
アノテーションを付与することで、Parcelable実装に必要なコードを自動生成してくれます。
詳細は下記を御覧ください:
今担当しているプロダクトでは、以前からParcelableに関するライブラリとしてParcelerを利用しているのですが、Parcelize
に関して最近Androidバージョン4.3の端末でインストールできない不具合が直った旨のツイートを見つけ、ちょうど機能改修のタイミングでもあったので導入に踏み切りました。
横からすみません。4.3以下だとインストールできない件ですよね? 最近のバージョンでは直ってたと思います。https://t.co/stWooYXl2k
— tsuyoshi uehara (@uecchi) 2018年6月1日
所感
Android Studioで利用していますが、今のところ不具合なく動いているようです。"Show Kotlin Bytecode"によってどのようなコードが生成されるのかもひと目で確認できます。
注意点
lint実行時にエラー
現状@Parcelize
を付与しているクラスに対してlintを実行すると、エラーが出てしまうという問題があります。
"This class implements Parcelable but does not provide a CREATOR field"
(AS上でも似たような文言のWarningが出てしまう不具合があったようですが、そちらはすでに修正されています。)
このlintエラーの一時対応策は二種類ありそうです。一つは、エラーを完全無視する方法です。
android { lintOptions { abortOnError false } }
これは、他のlintのエラー等含めてまるっと無視する設定なので、イケてなさそうな気がします。
もう一つの方法として、対象のクラスのみに対して@SuppressLint
アノテーションを付与する方法があります。
Issue Tracker上のコメントにて紹介されていました。
https://youtrack.jetbrains.com/issue/KT-19300#comment=27-2853193
例としてはこのような形です:
@SuppressLint("ParcelCreator") @Parcelize class MyParcelable(val data: Int): Parcelable
できればこのアノテーションすら付与したくないところではありますが、一時対応策としてはこれが一番しっくりきました。
もし、何かもっと良い方法等ご存知の方いたら教えていただけると幸いです。m(__)m
※06/14(木)追記
lintOptions { ignore "ParcelCreator" }
という設定でParcelCreatorに関するlintエラーを無視する、という設定もできるようです!@stsn_jpさんありがとうございますm(__)m
lintOptions {
— \Sato Shun/ (@stsn_jp) 2018年6月14日
ignore "ParcelCreator"
}
みたいに書くことも出来たはず
View Bindingも有効になってしまう
Parcelize
を利用するにあたり、Kotlin Android Extensionsを有効にする必要がありますが、現状これを有効にすると自動的にView Bindingのほうも有効になります。Data Binding等を利用しているプロジェクトでは、View Bindingは無効にしたいというニーズがありそうです。こちらは今後Parcelizeのみ有効化、等の設定ができようになると最高そうだと感じています。
※06/18(月)追記
Kotlin Android experimental, Parcelizeだけ有効にして欲しいにゃあって思っていたけど、あるっぽいhttps://t.co/mFa48KI6G4
— \Sato Shun/ (@stsn_jp) June 18, 2018
androidExtensions { experimental = true features = ["parcelize"] }
という設定でParcelizeのみの有効化が可能なようです。@stsn_jpさんありがとうございます!
まとめ
- Parcelize今のところよさそう。自分のプロジェクトでは現状利用しているParcelerを置き換える流れに持っていく予定。
現状の問題点としては"PacelCreator"Lintエラーが出てしまう点とView Bindingも有効になってしまうのでそこだけ注意が必要そう。- ※06/18(月)追記: Parcelizeのみ有効にする方法は上記に記載
- Lintエラーに関しては、個別に
@SuppressLint("ParcelCreator")
するのが良さそう。
以上です。