🤔

【Flutter】Androidのリリースビルドで動かない時に疑うべきR8 (ProGuard) の設定

2021/06/14に公開

とあるFlutterのパッケージを使用した時に「デバッグビルドでは動作するのにリリースビルドでは動作しない」という状況になり、原因がR8だったので備忘録として書く。

R8とは

Googleが開発した、Androidアプリの「圧縮」「難読化」「最適化」を行うのツールのことである。
今回の原因は、このR8が本来必要なコードを不適切に処理したことだと思われる。

Flutterでの動作

Flutter docs > Deployment > Build and release an Android app > Shrinking your code with R8 によると、FlutterではAndroidのリリースビルドにおいてデフォルトで有効になっている様子。

こんな面倒なもの無効にしてしまえと言いたいところだが、「圧縮」「難読化」「最適化」の恩恵を受けたいので、極力無効にせず解決したい。

そこで出てくるのが、ProGuardの設定ファイルである。

解決方法

android/app/build.gradle に追記

緑色にシンタックスハイライトされた部分を追記する (行頭の + は含まない)

android/app/build.gradle
@@ -46,6 +46,9 @@ android {
             // TODO: Add your own signing config for the release build.
             // Signing with the debug keys for now, so `flutter run --release` works.
             signingConfig signingConfigs.debug
+
+            // ProGuardの設定ファイル
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
 }

これにより、後に作成する proguard-rules.pro が読み込まれる。

android/app/proguard-rules.pro を作成

デフォルトでは、ProGuardの設定ファイルが存在しないので作成する。
使用するパッケージに合わせた、ProGuardの設定を追記する。

あとがき

「デバッグビルドでは動作するのにリリースビルドでは動作しない」という状況になって存在を発見したR8。
本来は、簡単に「圧縮」「難読化」「最適化」を行ってくれる便利なツールなので、ProGuardの設定を書いてR8の恩恵を受けつつも不適切に処理されないよう活用していきたいと思う💪

Discussion