Thanks to visit codestin.com
Credit goes to dev.classmethod.jp

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

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

2025.02.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、ゲームソリューション部の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'」のエラーが出た理由と対処した方法を記事にしました。
どなたかの参考になると幸いです。

この記事をシェアする

関連記事