Flutter 1.0.0 打包apk后运行错误
文章目录
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", ...... base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]] couldn't find "libflutter.so"
这种问题可以看到其中有 arm64 的字样. 也有 libflutter.so
在以前运行打包命令后 可以正常运行的项目,可能在更新 flutter 1.0.0 后不能正常运行
1flutter build apk
这种情况通常是因为 so 文件没有打包到 apk 中造成的 拖动 apk 到 android Studio 中可以看到其中包含的库文件
我前面有一篇 so 对齐 的文章可以解释原理
但是 flutter 升级后 可以查看flutter.gradle
文件
图片中的代码说明了当目标是 arm64 的时候, 会自动将 64 的 so 打包到 flutter 内, 这里的问题就造成了以前你在自己的 gradle 设置的打包选项和这个同时生效,也就是 v7 v8 的 so 都不进 apk 里了..
一个小说明
在说解决方案前,有一点需要说明的是 armeabi -> v7 ->v8,这个是 arm cpu 架构的进化过程,而后来的 cpu 是兼容前代的 so 库,
目前市面上的 android 手机 32 位都是很少见的了,但是为了可能发生的意外,目前使用 v7 足够了, 要知道 wechat 内的 so 还是 armeabi 版本的,所以不用担心
解决方案
在项目 android 目录下有一个gradle.properties
文件 这里添加target-platform=android-arm
然后在 build.gradle android.buildTypes.release 里增加
1android.buildTypes.release
2{
3 ndk{
4 abiFilters "armeabi-v7a"
5 }
6}
这样打包出来的 apk 内应该只包含 v7a 的 so,且 libflutter.so 也会在 apk 内
现在市面上的手机 v7 都是少数派了,大部分都是 v8 的 cpu,所以放心大胆的去用吧