正常發(fā)布流程可以根據(jù)官方文檔的發(fā)布app部分配置文件儡司。
配置完AndroidManifest.xml 秘鑰等文件后
在flutter項(xiàng)目根目錄下執(zhí)行flutter build apk即可打包生成release安裝包
(根\android\app\outputs\apk\release\app-release.apk)
有可能發(fā)生的情況嘉竟,執(zhí)行打包命令后拋出錯(cuò)誤如下
根據(jù)錯(cuò)誤提示 我們可以知道睦柴,在打包編譯過(guò)程中出現(xiàn)了 不唯一的 不同架構(gòu)的.so庫(kù)诽凌,編譯器不知道使用哪個(gè)了。
網(wǎng)上有些博客 給出的解決方法是 在app下的build.gradle坦敌,android節(jié)點(diǎn)下添加一項(xiàng)配置侣诵。
把出現(xiàn)的 不唯一的 架構(gòu)文件 排除使用
添加完這個(gè)配置項(xiàng)之后 再次運(yùn)行flutter build apk 打包 是可以編譯成功的
我們?cè)诎l(fā)布應(yīng)用市場(chǎng)之前時(shí) 還是要在 真機(jī)測(cè)試一遍 正式版本的,執(zhí)行flutter run --release 將release版本app安裝到測(cè)試機(jī)上同時(shí)可以在控制臺(tái) 看到日志輸出
發(fā)現(xiàn)直接崩潰app閃退狱窘,控制臺(tái)輸出
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.
網(wǎng)上各種解決辦法很多杜顺,有說(shuō)關(guān)閉 代碼混淆的,有說(shuō)升級(jí)flutter版本的
其實(shí)問(wèn)題出在 重復(fù)架構(gòu)不唯一的架構(gòu)上 .so文件训柴,build.gradle 里的 android 節(jié)點(diǎn)下的 packagingOptions配置哑舒,exclude修改為pickFirst例:
packagingOptions {
pickFirst 'lib/x86_64/libapp.so'
pickFirst 'lib/armeabi-v7a/libapp.so'
pickFirst 'lib/arm64-v8a/libapp.so'
}
在不同的庫(kù)中出現(xiàn)相同的so文件
pickFirst只會(huì)打包第一個(gè)遇到的沖突的so,merge(碰到?jīng)_突會(huì)合并)和exclude(直接排除匹配到的文件,不建議使用)
現(xiàn)在編譯release版本app 既不會(huì)報(bào)錯(cuò)也不會(huì)閃退了
如果因?yàn)?架構(gòu)文件導(dǎo)致的 安裝包體積增大幻馁,可以在android節(jié)點(diǎn)中 ndk 節(jié)點(diǎn)中配置僅需要使用的 架構(gòu)
ndk {
// abiFilters "arm64-v8a","x86_64","x86"http://不同架構(gòu)的包 //只打包flutter所支持的架構(gòu),flutter沒(méi)有armeabi架構(gòu)的so越锈,加x86的原因是為了能夠兼容模擬器
abiFilters "arm64-v8a" //release 時(shí)只打"armeabi-v7包" 市場(chǎng)上大部分的手機(jī)都支持arm64-v8a
}