Flutter 打包apk后运行错误:couldn't find "libflutter.so"

时间:2021-02-26 16:42
FLutter 在使用命令:

flutter build apk

打包或者是用Android Studio直接打包如果so配置错误会出现以下问题:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data
/app/com.cgmcomm.cgmstore-zq4F04l4AacKP5RCViCs2Q==/base.apk"],nativeLibraryDirectories=
[/data/app/com.cgmcomm.cgmstore-zq4F04l4AacKP5RCViCs2Q==/lib/arm64, /data/app
/com.cgmcomm.cgmstore-zq4F04l4AacKP5RCViCs2Q==/base.apk!/lib/arm64-v8a, /system/lib64]]] 
couldn't find "libflutter.so"
 

主要原因是在flutter.gradle中有这一段配置:
 Path baseEnginePath = Paths.get(flutterRoot.absolutePath, "bin", "cache", "artifacts", "engine")
            String targetArch = 'arm'
            if (project.hasProperty('target-platform') &&
                project.property('target-platform') == 'android-arm64') {
              targetArch = 'arm64'
            }
            debugFlutterJar = baseEnginePath.resolve("android-${targetArch}").resolve("flutter.jar").toFile()
            profileFlutterJar = baseEnginePath.resolve("android-${targetArch}-profile").resolve("flutter.jar").toFile()
            releaseFlutterJar = baseEnginePath.resolve("android-${targetArch}-release").resolve("flutter.jar").toFile()
            dynamicProfileFlutterJar = baseEnginePath.resolve("android-${targetArch}-dynamic-profile").resolve("flutter.jar").toFile()
            dynamicReleaseFlutterJar = baseEnginePath.resolve("android-${targetArch}-dynamic-release").resolve("flutter.jar").toFile()
            if (!debugFlutterJar.isFile()) {
                project.exec {
                    executable flutterExecutable.absolutePath
                    args "--suppress-analytics"
                    args "precache"
                }
                if (!debugFlutterJar.isFile()) {
                    throw new GradleException("Unable to find flutter.jar in SDK: ${debugFlutterJar}")
                }
            }

 
 
flutter.gradle路径是
"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
 
flutterRoot是本机flutter安装路径

上述代码说明了当目标是 arm64 的时候, 会自动将 64 的 so 打包到 flutter 内, 这里的问题就造成了以前你在自己的 gradle 设置的打包选项和这个同时生效,也就是 v7 v8 的 so 都不进 apk 里了…
解决方案是在app的build.gradle中修改如下:
    defaultConfig {
……


//        ndk {
//            //选择要添加的对应 cpu 类型的 .so 库。
//            abiFilters "arm64-v8a","armeabi", "armeabi-v7a", "x86", "x86_64"
//            // 还可以添加
//        }
打包的时候注释掉defaultConfig中ndk的配置


    }

    buildTypes {
        release {
         ……
            ndk {
                //选择要添加的对应 cpu 类型的 .so 库。
//                abiFilters "armeabi-v7a"
                abiFilters  "armeabi-v7a"
                // 还可以添加
            }
        }
        debug {
            ndk {
                //选择要添加的对应 cpu 类型的 .so 库。
//                abiFilters "armeabi-v7a"
                abiFilters  "armeabi-v7a"
                // 还可以添加
            }
            minifyEnabled false
            signingConfig signingConfigs.release
        }
    }