正常发布流程可以根据官方文档的发布app部分配置文件。
配置完AndroidManifest.xml 秘钥等文件后
在flutter项目根目录下执行flutter build apk即可打包生成release安装包
(根\android\app\outputs\apk\release\app-release.apk)
有可能发生的情况,执行打包命令后抛出错误如下
根据错误提示 我们可以知道,在打包编译过程中出现了 不唯一的 不同架构的.so库,编译器不知道使用哪个了。
网上有些博客 给出的解决方法是 在app下的build.gradle,android节点下添加一项配置。
把出现的 不唯一的 架构文件 排除使用
添加完这个配置项之后 再次运行flutter build apk 打包 是可以编译成功的
我们在发布应用市场之前时 还是要在 真机测试一遍 正式版本的,执行flutter run --release 将release版本app安装到测试机上同时可以在控制台 看到日志输出
发现直接崩溃app闪退,控制台输出
To quit, press "q".
E/flutter (17478): [ERROR:flutter/runtime/dart_vm_data.cc(18)] VM snapshot invalid and could not be inferred from settings
.
E/flutter (17478): [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
E/flutter (17478): [ERROR:flutter/runtime/dart_vm_lifecycle.cc(84)] Could not create Dart VM instance.
F/flutter (17478): [FATAL:flutter/shell/common/shell.cc(234)] Check failed: vm. Must be able to initialize the VM.
网上各种解决办法很多,有说关闭 代码混淆的,有说升级flutter版本的
其实问题出在 重复架构不唯一的架构上 .so文件,build.gradle 里的 android 节点下的 packagingOptions配置,exclude修改为pickFirst例:
packagingOptions {
pickFirst 'lib/x86_64/libapp.so'
pickFirst 'lib/armeabi-v7a/libapp.so'
pickFirst 'lib/arm64-v8a/libapp.so'
}
在不同的库中出现相同的so文件
pickFirst只会打包第一个遇到的冲突的so,merge(碰到冲突会合并)和exclude(直接排除匹配到的文件,不建议使用)
现在编译release版本app 既不会报错也不会闪退了
如果因为 架构文件导致的 安装包体积增大,可以在android节点中 ndk 节点中配置仅需要使用的 架构
ndk {
// abiFilters "arm64-v8a","x86_64","x86"//不同架构的包 //只打包flutter所支持的架构,flutter没有armeabi架构的so,加x86的原因是为了能够兼容模拟器
abiFilters "arm64-v8a" //release 时只打"armeabi-v7包" 市场上大部分的手机都支持arm64-v8a
}