FlutterアプリのAndroid実機検証で「Could not find 'libflutter.so'」のエラーが出た理由と対処した方法

FlutterアプリのAndroid実機検証で「Could not find 'libflutter.so'」のエラーが出た理由と対処した方法

Clock Icon2025.02.12

こんにちは、ゲームソリューション部のsoraです。
今回は、FlutterアプリのAndroid実機検証で「Could not find 'libflutter.so'」のエラーが出た理由と対処した方法について書いていきます。

エラー内容

まずシミュレータとしてGoogle 3a XL(Android 12)を起動して、flutter runを実行して正常に動作することを確認しました。
その後、flutter run実行時に生成されたapkファイル(app-debug.apk)を実機のGoogle Pixel 3a XL(Android 12)にインストールして実行したところ、以下のエラーが出ました。

02-10 14:03:38.509 12135 12135 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.RuntimeException: java.util.concurrent.ExecutionException: com.getkeepsafe.relinker.MissingLibraryException: Could not find 'libflutter.so'. Looked for: [arm64-v8a, armeabi-v7a, armeabi], but only found: [x86_64].

ちなみに、今回flutter run実行で生成されたapkファイル(app-debug.apk)を使用していますが、flutter build apk --debugで生成したapkファイルでも同様だと思います。

エラーの原因と対処

原因

libflutter.soについて、対象のシミュレータではABI(Application Binary Interface)の優先度として、x86_64が最優先となっており、x86_64用だけが作られていました。
実機では他のABIが必要だったためにエラーが出ているものだと思います。

ABIについては以下をご確認ください。
https://developer.android.com/ndk/guides/abis?hl=ja

調査の過程を記載していきます。
まず、シミュレータのGoogle 3a XLに対して、ABIを確認してみました。
すると、優先度的にx86_64が最優先になっていることがわかりました。

> adb devices
List of devices attached
emulator-5554   device

> adb -s emulator-5554 shell getprop ro.product.cpu.abilist
x86_64,arm64-v8a

flutter run(またはflutter build apk --debug)で作られるapkは、優先度の一番高いもののみが作られます。
apkファイルの中身を確認してみると、x86_64フォルダ配下にのみlibflutter.soが作られていました。
(apkファイルは拡張子をzipに変更して解凍すると確認できます。)

cd app-debug/lib
tree
.
├── arm64-v8a
│   ├── libbarhopper_v3.so
│   └── libimage_processing_util_jni.so
├── armeabi-v7a
│   ├── libbarhopper_v3.so
│   └── libimage_processing_util_jni.so
├── x86
│   ├── libbarhopper_v3.so
│   └── libimage_processing_util_jni.so
└── x86_64
    ├── libbarhopper_v3.so
    ├── libflutter.so
    └── libimage_processing_util_jni.so

対処

対処方法はいくつかあります。

まず複数ABIを一つにまとめるFAT APKを作成する方法です。
リリースビルドでは、build.gradleabiFiltersを指定していればそのABI、指定がなければ全てのABIが作られます。

# --releaseと--no-split-per-abiは指定しない場合のデフォルトのため省略可能
flutter build apk --release --no-split-per-abi

build.gradleで指定する場合は、以下のような書き方です。

android {
  ...
  defaultConfig {
    ...
    ndk {
      abiFilters "x86_64", "arm64-v8a"
    }
  }
  ...
}

build.gradleにabiFiltersを指定せずにリリースビルドをしても、x86フォルダ配下にlibflutter.soは作成されませんでした。
これはflutter側にてx86(32bit)に対応していないことが理由みたいです。
https://zenn.dev/nitaking/articles/555a9bad305d9f

他には、アーキテクチャ別でビルドする方法です。
こうすることで、それぞれのアーキテクチャ別にapkファイルを作成することができます。

# --releaseは指定しない場合のデフォルトのため省略可能
flutter build apk --release --split-per-abi

参考

https://qiita.com/mkosuke/items/afa40c09078285034799
https://qiita.com/zigenin/items/6c9a4d973d7b58c6b2c8
https://qiita.com/najeira/items/3e2914d007e990af947c
https://zenn.dev/enoiu/scraps/501de964e5ee8f

最後に

今回は、FlutterアプリのAndroid実機検証で「Could not find 'libflutter.so'」のエラーが出た理由と対処した方法を記事にしました。
どなたかの参考になると幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.