android - 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 一起打包吗?
解决方案
这里报告了一个类似的问题:https ://github.com/simolus3/moor/issues/895
建议的修复是针对这种情况创建一个调用 System.loadLibrary() 的 Flutter 插件
推荐阅读
- ios - 在 iOS 13 设备中未调用 viewForSupplementaryElementOfKind
- java - 无法在 TestNG 中启动课程,无法找到原因
- actions-on-google - 在帐户链接期间获取 SignIn.status 的未定义值
- python - Python根据字符串检查属性是否为无
- gcc - 气体中 scanf 调用的存储寄存器
- node.js - 无法在 Mac 上使用 conda 安装最新的 nodejs
- r - Shiny Server Open Source 是否支持多线程?
- java - Ubuntu 20.04 上的 JNA 未定义符号
- javascript - 为什么大 eojson 不显示在 Here Map 上?
- java - 无需单击按钮即可更改 JLabel 文本