症状
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 だと名前だけでなく属性を含めた全ての情報を保持する必要があるようです。