Flutter abiFilters不会为所有架构生成libflutter.so

时间:2019-04-24 12:37:30

标签: android flutter abi

在我的Flutter应用程序中,我试图生成apk,该apk在32位或64位的所有设备上都可以使用。

为此,我在 build.gradle 文件中添加了以下几行。但是看来它并没有为所有架构生成 libflutter.so

    android {
       compileSdkVersion 27
       defaultConfig {
           appId "com.google.example.64bit"
           minSdkVersion 15
           targetSdkVersion 28
           versionCode 1
           versionName "1.0"
           ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'

正如我们在下图中看到的, libflutter.so 仅存在于 armeabi-v7a 中,而所有其他文件夹都缺少该文件。当我在Google Play上发布应用时,该问题使我的应用在启动时崩溃。

  Exceptions
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/abc.xyz.idar-1/base.apk"],nativeLibraryDirectories=[/data/app/abc.xyz.idar-1/lib/arm64, /data/app/abc.xyz.idar-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]] couldn't find "libflutter.so"

enter image description here

我正在使用 flutter build apk 命令来生成apk。

6 个答案:

答案 0 :(得分:2)

这是Flutter存储库中的当前已知问题。我希望他们能够尽快解决此问题。

https://github.com/flutter/flutter/issues/18494

我发现最好的解决方法是遵循此comment

运行flutter build apk时,此解决方法将删除64位文件夹中的所有资源。因此,64位设备将仅使用32位文件夹中的资源。

答案 1 :(得分:1)

我已经为这个问题奋斗了一个多月。终于,Flutter发布了所谓的 PATCH ,以支持64位应用程序构建。

要使用其架构来构建应用程序,请使用Flutter SDK版本1.7.4或更高版本。它仍然在开发通道中,但是一切都按预期进行。这是下载SDK

的链接

现在进入发生所有魔术的主代码:

请勿在您的渐变文件中包含任何ABI过滤器以生成拆分的APK

defaultConfig {
    applicationId "YOUR.PACKAGE.NAME"
    minSdkVersion 19
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {
    release {
        signingConfig signingConfigs.debug
        minifyEnabled false
    }
}

现在打开终端,并在根目录中使用此命令来生成Apks

\\PATH_TO_YOUR_FLUTTER_SDK_DIR\bin\flutter build apk --split-per-abi

例如,在我的情况下:

D:\flutter_windows_v1.2.1-stable\flutter_v1.7.4-dev\flutter\bin\flutter build apk --split-per-abi

生成它会花费相当长的时间,但是它值得并且可以大笑...这是一些输出日志,仅供参考。

Running Gradle task 'assembleRelease'... Done                     139.7s (!)
Built build\app\outputs\apk\release\app-armeabi-v7a-release.apk (10.0MB).
Built build\app\outputs\apk\release\app-arm64-v8a-release.apk (10.3MB).

答案 2 :(得分:1)

Upgarde /切换到抖动主通道(如果您不使用它)。 Flutter小组已解决此问题。现在,单个命令flutter build apk将产生与32位和64位体系结构兼容的apk。

答案 3 :(得分:0)

像这样更改您的build.gradle

android {
   compileSdkVersion 27
   defaultConfig {
      // Remove ndk.abiFilters from here
   }

   buildTypes {
       release {
           ndk.abiFilters 'armeabi-v7a'
       }
   }

这就是我用来在Google Play上发布的内容,到目前为止我还没有遇到任何问题。

答案 4 :(得分:0)

您可以尝试使用此命令来构建64位apk

flutter build apk --release --target-platform=android-arm64

答案 5 :(得分:0)

在您的String内部的defaultConfig中添加以下内容:

build.gradle

运行ndk { abiFilters "armeabi", "x86", "armeabi-v7a" }

将apk文件发送到Play商店。