在我的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"
我正在使用 flutter build apk 命令来生成apk。
答案 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商店。