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 后不能正常运行

flutter 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 里增加

android.buildTypes.release
{
    ndk{
        abiFilters "armeabi-v7a"
    }
}

这样打包出来的 apk 内应该只包含 v7a 的 so,且 libflutter.so 也会在 apk 内

现在市面上的手机 v7 都是少数派了,大部分都是 v8 的 cpu,所以放心大胆的去用吧

来自:https://www.kikt.top/