0
0

More than 1 year has passed since last update.

minify R8 で GSON でクラス変換をする場合の注意点

Last updated at Posted at 2023-08-24

症状

Android アプリを 1年ぶりぐらいにアップデートしようとしたところ、Release ビルドで実行した時に json 形式のデータが正常にパースされなくなる症状に見舞われました。

原因

アプリのビルドタスクに、

> Task :app:minifyReleaseWithR8

という見慣れないタスクがあり、コレ(R8 での minify)が原因でした。

Android Gradle プラグイン 3.4.0 以上を使用したプロジェクトのビルドでは、ProGuard によるコンパイル時のコード最適化が行われず、R8 コンパイラとの連携により、minifyReleaseWithR8 タスクが実行されるようです。

必要な対策

Gson や OkHttp など、minifyの影響を受けるライブラリを使用している場合、R8 対応の proguard-rules.pro の記述内容が公開されているので、基本的にそれらを更新すれば大丈夫な筈です。(Webで見つかる大半のローカルフィックスはそれでした)

ただし、私のアプリの場合、その対策だけでは不十分でした。

追加で必要な対策

自前の model クラス (gson で json から変換する data class) の proguard-rules.pro へ記載するルールを修正する必要がありました。

以前の ProGuard では、

-keepnames class com.example.model.** { *; }

としていれば良かったのですが、R8 の場合、

-keep class com.example.model.** { *; }

とする必要があります。

つまり、従来の ProGuard では、クラスの名前(names)だけの保持されていれば正常に gson でパースできていたが、R8 だと名前だけでなく属性を含めた全ての情報を保持する必要があるようです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0