flutter_local_notifications を使ったアプリがリリースビルド時のみクラッシュするのは Proguard rules が足りないせい

環境

Flutter SDK v1.12.13+hotfix.5
flutter_local_notifications 1.2.2

事象

flutter_local_notifications を使ったアプリが Android Studio 経由で実行(flutter run --release )しているときは普通に動くのに、flutter build apk でリリースビルドした apk を端末にインストールするとクラッシュする。

原因

flutter_local_notifications の Readme に書いてある Release build configuration を読まずに実装しているせいで必要な設定が足りない。

解決法

Release build configuration に書いてある通り、Proguard rules (proguard-rules.pro) ファイルに設定を追加する必要があります。

しかし少なくとも私がFlutterでアプリを作り始めた時点では proguard-rules.pro は存在すらしていなかったので、まずこのファイルをリリースビルドで有効にすることから始めます。

まず 圧縮、難読化、最適化の有効化 を見て [app-route-dir]/android/app/build.gradle に設定を追加します。

android {  
        buildTypes {  
            release {  
                // Enables code shrinking, obfuscation, and optimization for only  
                // your project's release build type.  
                minifyEnabled true  

                // Enables resource shrinking, which is performed by the  
                // Android Gradle plugin.  
                shrinkResources true  

                // Includes the default ProGuard rules files that are packaged with  
                // the Android Gradle plugin. To learn more, go to the section about  
                // R8 configuration files.  
                proguardFiles getDefaultProguardFile(  
                        'proguard-android-optimize.txt'),  
                        'proguard-rules.pro'  
            }  
        }  
        ...  
    }  

※上記に書いたすべての設定がクラッシュ回避に必要かどうかは調査していませんがプライベートでの開発なので雑に全部追加しています。

次に [app-route-dir]/android/app に proguard-rules.pro というファイルを新規作成します。
proguard-rules.pro の中身は flutter_local_notifications の例 をそのまま写します。
※こちらもすべての設定がクラッシュ回避に必要かどうかは調査していませんがプライベートでの開発なので雑に全部写しています。

これで flutter build apk でリリースビルドしたアプリもクラッシュしなくなります。

参考