
FlutterアプリのAndroid実機検証で「Could not find 'libflutter.so'」のエラーが出た理由と対処した方法
こんにちは、ゲームソリューション部の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については以下をご確認ください。
調査の過程を記載していきます。
まず、シミュレータの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.gradle
にabiFilters
を指定していればその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)に対応していないことが理由みたいです。
他には、アーキテクチャ別でビルドする方法です。
こうすることで、それぞれのアーキテクチャ別にapkファイルを作成することができます。
# --releaseは指定しない場合のデフォルトのため省略可能
flutter build apk --release --split-per-abi
参考
最後に
今回は、FlutterアプリのAndroid実機検証で「Could not find 'libflutter.so'」のエラーが出た理由と対処した方法を記事にしました。
どなたかの参考になると幸いです。