heihei blog

Write once, recall anytime. 自分のために書く 📝

Parcelizeを利用してみた所感と注意点

※2018/06/14(木) 時点での所感と注意点を記載しています。何かアップデートがあれば随時追記していければと思います。

Parcelizeとは、Kotlinが提供するAndroid開発のためのコンパイラー拡張機能です。Parcelableを実装したクラスに対して@Parcelizeアノテーションを付与することで、Parcelable実装に必要なコードを自動生成してくれます。

詳細は下記を御覧ください:

github.com

今担当しているプロダクトでは、以前からParcelableに関するライブラリとしてParcelerを利用しているのですが、Parcelizeに関して最近Androidバージョン4.3の端末でインストールできない不具合が直った旨のツイートを見つけ、ちょうど機能改修のタイミングでもあったので導入に踏み切りました。

所感

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


View Bindingも有効になってしまう

Parcelizeを利用するにあたり、Kotlin Android Extensionsを有効にする必要がありますが、現状これを有効にすると自動的にView Bindingのほうも有効になります。Data Binding等を利用しているプロジェクトでは、View Bindingは無効にしたいというニーズがありそうです。こちらは今後Parcelizeのみ有効化、等の設定ができようになると最高そうだと感じています。


※06/18(月)追記

androidExtensions {
  experimental = true
  features = ["parcelize"]
}

という設定でParcelizeのみの有効化が可能なようです。@stsn_jpさんありがとうございます!


まとめ

  • Parcelize今のところよさそう。自分のプロジェクトでは現状利用しているParcelerを置き換える流れに持っていく予定。
  • 現状の問題点としては"PacelCreator"Lintエラーが出てしまう点とView Bindingも有効になってしまうのでそこだけ注意が必要そう。
    • ※06/18(月)追記: Parcelizeのみ有効にする方法は上記に記載
    • Lintエラーに関しては、個別に@SuppressLint("ParcelCreator")するのが良さそう。

以上です。