見出し画像

【Flutter】ビルドモードの違いで発生するバグについて

はじめに

Flutterで開発する場合は、通常デバッグモードでビルドして動作確認をしながら開発を行っていきます。
Flutterのビルド方法には3種類あり以下のビルドモードが存在します。

  • Debug Mode

  • Release Mode

  • Profile Mode

上記のモードの違いによる不具合もありましたので、内容と対応方法も書いていきたいと思います。

モードごとの説明

Debug Mode

Debug Modeは開発時に使用するビルドモードになります。
このモードを使用することで、任意の箇所にブレイクポイントを打って処理を止めることが出来ます。
処理を止めて、変数の中を確認したり、どこの処理を通っているか確認したりして開発を進めていきます。
以下のコマンドを入力するか、vscodeの実行とデバッグ欄から実行します。

flutter run


Release Mode

Release Modeはアプリをリリースするときに使用するビルドモードです。
Debug Modeでは、JITコンパイラが使用されますが、Release Modeでは、AOTコンパイラが使用されます。
これにより、Debug Mode時に使用していたデバッグ用の機能がアプリに含まれなくなり、パフォーマンスの最適化が行われます。デバッグ時には、遅いと感じていた処理も、Release Modeでビルドするとスムーズに動くようになります。

Profile Mode

Profile ModeはDebug ModeとRelease Modeの中間の位置のビルドモードになります。
Profile ModeでもAOTコンパイラが使用されますが、コンソールにログがでるのでRelease Modeと近いパフォーマンスで処理の確認をすることが出来ます。

Debug ModeとRelease Mode(Profile Mode)の違いで発生するバグ

AOTコンパイラがコードを削除する

Debug ModeとRelease Mode(Profile Mode)の違いにコンパイラがあります。
Debug ModeではJITコンパイラを使用しているのに対して、Release Mode(Profile Mode)ではAOTコンパイラを使用しています。
このコンパイラの違いによって、Debug Modeではうまく動いていたのに、Release Modeではうまく動かない現象が発生しました。
原因として、Release ModeのAOTコンパイル時に必要なコードをコンパイラが削除していたからです。githubにも、この現象に関するissueが上がっています。
対処方法は、Flutterのバージョンをissueの内容が修正されているバージョンまで上げるか、消されるコードを別の方法で書き直します。
Profile Mode時にも発生しますので、ログを確認して、例外が発生している箇所を修正していきます。

遅延初期化される変数(late)への早期アクセス

デバッグ時には、遅延初期化を使用して問題なかった箇所が、Release Modeでビルドすると遅延初期化される前にアクセスして例外を出していることがありました。
原因としては、遅延初期化される前に変数にアクセスできる処理にしていたからです。デバッグ時のアプリの処理は、デバッグ機能がアプリに追加されていることで遅くなっていて偶然成功していただけでした。
本当に処理が成功しているかなどは、Profile Modeを使ってログで確認する必要があると思いました。(毎回は大変なので、例外が発生しそうな箇所を変更したらでよさそう)


おわりに

今回は、ビルドモードについてと、ビルドモードの違いで発生するバグについて書いていきました。githubのissueを確認することで、問題解決につながるので、issueの情報収集は今後も行っていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?