首页 > 解决方案 > Flutter 应用加载动态库失败

问题描述

我在 Google Play 商店中有一个正在生产的 Flutter 应用程序,其中包括一个使用 NDK 构建并在运行时加载的原生动态库(我称之为libraster.so)。在大多数设备上,这个库都存在并且加载良好。但在某些设备上,ArgumentError运行时会发生以下情况Invalid argument(s): Failed to load dynamic library (dlopen failed: library "libraster.so" not found)

我相信有问题的设备是ARM设备。abiFilter该应用程序未在应用程序模块的build.gradle文件中指定任何内容。

使用 Google Play Console 的 App Bundle Explorer,我可以下载将分发到受影响设备的 APK,并且它们包含libraster.so正常。

根据我的错误日志,目前受影响的设备是:

模型 姓名 安卓版
SM-G928F 三星盖乐世 S6 Edge+ 6.0.1
SM-J500M 三星盖乐世 J5 6.0.1
SM-J710GN 三星 Galaxy J7 2016 6.0.1
SM-T110 三星 Galaxy Tab 3 Lite 7.0 4.2.2
SM-T111M 三星 Galaxy Tab 3 Lite 7.0 4.2.2
GT-I8262 三星 Galaxy Core 双核 4.1.2
GT-I8552 三星 Galaxy Win Duos 4.1.2
GT-I8552B 三星 Galaxy Win Duos 4.1.2
GT-I9082L 三星 Galaxy Grand Duos 4.2.2
GT-I9300 三星盖乐世 S III 4.1.2
GT-N8000 三星 Galaxy Note 10.1 4.1.2
GT-N8010 三星 Galaxy Note 10.1 4.1.2
GT-P3110 三星 Galaxy Tab 2 7.0 4.1.2
GT-P5110 三星 Galaxy Tab 2 10.1 4.2.2
SO-03E 索尼 Xperia Tablet Z 4.1.2
B1-A71 宏碁 Iconia Tab B1-A71 4.1.2
F-01F 富士通箭 NX F-01F 4.2.2
ME173X 华硕记事本 HD7 4.2.2

大多数是 Android 4.1.2、4.2.2 和 6.0.1 设备。

这是我的应用程序模块的简化版本build.gradle

apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion 29

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        applicationId "com.example.package"
        minSdkVersion 16
        targetSdkVersion 29
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        multiDexEnabled true

        externalNativeBuild {
            cmake {
                arguments "-DCOMPILE_TESTS:BOOL=OFF"
            }
        }

        // Maintains debug symbols
        packagingOptions {
          doNotStrip '**.so'
        }
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release

            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            ndk {
                debugSymbolLevel = 'FULL'
            }
        }
    }

    externalNativeBuild {
        cmake {
            version "3.19.2"
            path "path/to/CMakeLists.txt"
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'androidx.multidex:multidex:2.0.1'
}

apply plugin: 'com.google.gms.google-services'

并且proguard-rules.pro

#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-dontwarn io.flutter.embedding.**

-keep class com.example.package.** { *; }

使用的 Flutter 版本稳定1.22.5

这是 Flutter 中的错误吗?这些设备加载动态库是否与其他设备不同?只是libraster.so在某些情况下实际上没有与 APK 一起打包吗?

标签: androidflutterandroid-ndk

解决方案


这里报告了一个类似的问题:https ://github.com/simolus3/moor/issues/895

建议的修复是针对这种情况创建一个调用 System.loadLibrary() 的 Flutter 插件


推荐阅读