💥

"Dart Error: Can't load Kernel binary" の対処方法

2023/02/17に公開

Flutter のプロジェクトをビルド&実行したとき、次のエラーがログに出力されて画面が表示されずに進まなくなることがあります。どのプラットフォームでも発生します。

[ERROR:flutter/shell/common/shell.cc(93)] Dart Error: Can't load Kernel binary: Invalid kernel binary format version.
[ERROR:flutter/runtime/dart_isolate.cc(143)] Could not prepare isolate.
[ERROR:flutter/runtime/runtime_controller.cc(385)] Could not create root isolate.
[ERROR:flutter/shell/common/shell.cc(604)] Could not launch engine with configuration.

このエラーは、異なる Dart のバージョンでビルドされたバイナリがあるときに発生します。主な原因は、 flutter を始めとするコマンド類をビルドした Dart のバージョンと、プロジェクトをビルドした Dart のバージョンが異なる場合です。そのため、 Flutter をアップデートしたあとに発生しやすくなります。

同様の記事はいくつかあるのですが、キャッシュの削除以外の方法もあったので残しておきます。

対処方法

キャッシュを削除する

キャッシュされているビルド済みのバイナリを削除します。だいたいこれで解決します。

  • flutter clean を実行します。プロジェクト直下の build ディレクトリが削除されます。
    flutter clean
    
  • flutter pub cache repair を実行します。このコマンドはライブラリのキャッシュを削除します。 pub.dev などからダウンロードしたライブラリのキャッシュは $HOME/.pub-cache にあります。
    flutter pub cache repair
    
  • flutter コマンドと同じディレクトリにあるキャッシュディレクトリ cache を削除します。
    $ which flutter             
    /opt/flutter/bin/flutter
    $ ls /opt/flutter/bin 
    cache           dart.bat        flutter.bat
    dart            flutter         internal
    $ rm -rf /opt/flutter/bin/cache
    

LD_LIBRARY_PATH を見直す

キャッシュをクリアしても解決しない場合は、環境変数 LD_LIBRARY_PATH が設定されている可能性があります。 LD_LIBRARY_PATH で指定したディレクトリに異なるバージョンのバイナリがあったり、もしくはアプリの起動に必要なバイナリが見つからないとエラーになります。 LD_LIBRARY_PATH の内容を見直すか、設定しないで試してみましょう。

予防措置

FVM (Flutter Version Management) を導入すると、トラブルが起きたときに過去のバージョンで検証できるようになります。逆に最新のバージョンでの検証にも使えるので便利です。

Discussion